Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/sanear.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Marsev <alex.marsev@gmail.com>2015-09-19 08:59:14 +0300
committerAlex Marsev <alex.marsev@gmail.com>2015-09-19 09:12:34 +0300
commit026370cb4738bf173bd1a1cffe6df181de1ef2fb (patch)
tree6d2b150b25e11b440b23f9fdf631bff9f603a86c
parentf8ac0ae4db19c699860324ca3d93ec4c28e55479 (diff)
Make crossfeed take priority over system mixer
-rw-r--r--src/AudioDevice.cpp14
-rw-r--r--src/AudioDevice.h6
-rw-r--r--src/AudioDeviceManager.cpp16
-rw-r--r--src/AudioRenderer.cpp28
-rw-r--r--src/DspCrossfeed.cpp6
-rw-r--r--src/DspMatrix.cpp5
-rw-r--r--src/DspMatrix.h1
7 files changed, 68 insertions, 8 deletions
diff --git a/src/AudioDevice.cpp b/src/AudioDevice.cpp
index 2987b2c..dfe2508 100644
--- a/src/AudioDevice.cpp
+++ b/src/AudioDevice.cpp
@@ -175,6 +175,20 @@ namespace SaneAudioRenderer
}
}
+ SaneAudioRenderer::SharedWaveFormat AudioDevice::GetNewMixFormat()
+ {
+ try
+ {
+ WAVEFORMATEX* pFormat;
+ ThrowIfFailed(m_backend->audioClient->GetMixFormat(&pFormat));
+ return SharedWaveFormat(pFormat, CoTaskMemFreeDeleter());
+ }
+ catch (HRESULT)
+ {
+ return nullptr;
+ }
+ }
+
void AudioDevice::RealtimeFeed()
{
SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
diff --git a/src/AudioDevice.h b/src/AudioDevice.h
index 51e79a0..f2f2273 100644
--- a/src/AudioDevice.h
+++ b/src/AudioDevice.h
@@ -23,6 +23,8 @@ namespace SaneAudioRenderer
bool exclusive;
bool bitstream;
bool realtime;
+
+ bool ignoredSystemChannelMixer;
};
class AudioDevice final
@@ -56,10 +58,14 @@ namespace SaneAudioRenderer
uint32_t GetBufferDuration() const { return m_backend->bufferDuration; }
REFERENCE_TIME GetStreamLatency() const { return m_backend->latency; }
+ SharedWaveFormat GetNewMixFormat();
+
bool IsExclusive() const { return m_backend->exclusive; }
bool IsBitstream() const { return m_backend->bitstream; }
bool IsRealtime() const { return m_backend->realtime; }
+ bool IgnoredSystemChannelMixer() const { return m_backend->ignoredSystemChannelMixer; }
+
private:
void RealtimeFeed();
diff --git a/src/AudioDeviceManager.cpp b/src/AudioDeviceManager.cpp
index 4eaaae9..451c997 100644
--- a/src/AudioDeviceManager.cpp
+++ b/src/AudioDeviceManager.cpp
@@ -204,6 +204,8 @@ namespace SaneAudioRenderer
backend->bitstream = (DspFormatFromWaveFormat(*format) == DspFormat::Unknown);
+ backend->ignoredSystemChannelMixer = false;
+
const auto inputRate = format->nSamplesPerSec;
const auto inputChannels = format->nChannels;
const auto inputMask = DspMatrix::GetChannelMask(*format);
@@ -267,6 +269,9 @@ namespace SaneAudioRenderer
backend->dspFormat = DspFormat::Float;
backend->waveFormat = mixFormat;
+ BOOL crossfeedEnabled;
+ pSettings->GetCrossfeedEnabled(&crossfeedEnabled);
+
std::vector<WAVEFORMATEXTENSIBLE> priorities = {
BuildWaveFormatExt(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, 32, 32,
mixRate, inputChannels, inputMask),
@@ -294,8 +299,15 @@ namespace SaneAudioRenderer
}
else
{
- backend->dspFormat = DspFormatFromWaveFormat(f.Format);
- backend->waveFormat = CopyWaveFormat(f.Format);
+ if (crossfeedEnabled && DspMatrix::IsStereoFormat(*mixFormat))
+ {
+ backend->ignoredSystemChannelMixer = true;
+ }
+ else
+ {
+ backend->dspFormat = DspFormatFromWaveFormat(f.Format);
+ backend->waveFormat = CopyWaveFormat(f.Format);
+ }
break;
}
}
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index a6e95b9..7ae04d4 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -388,10 +388,33 @@ namespace SaneAudioRenderer
settingsDeviceDefault = (!pDeviceId || !*pDeviceId);
settingsDeviceId.reset(pDeviceId);
+ }
+
+ bool clearForCrossfeed = false;
+
+ if (!m_device->IsExclusive())
+ {
+ BOOL crossfeedEnabled;
+ m_settings->GetCrossfeedEnabled(&crossfeedEnabled);
+
+ SharedWaveFormat newMixFormat = m_device->GetNewMixFormat();
+ if (!newMixFormat)
+ return;
+
+ bool mixFormatIsStereo = DspMatrix::IsStereoFormat(*newMixFormat);
+ bool inputIsStereo = DspMatrix::IsStereoFormat(*m_inputFormat);
+ bool outputIsStereo = DspMatrix::IsStereoFormat(*m_device->GetWaveFormat());
+ bool ignoredSystemChannelMixer = m_device->IgnoredSystemChannelMixer();
- m_deviceSettingsSerial = newSettingsSerial;
+ if ((mixFormatIsStereo && crossfeedEnabled && !outputIsStereo) ||
+ (mixFormatIsStereo && !crossfeedEnabled && !inputIsStereo && ignoredSystemChannelMixer))
+ {
+ clearForCrossfeed = true;
+ }
}
+ m_deviceSettingsSerial = newSettingsSerial;
+
std::unique_ptr<WCHAR, CoTaskMemFreeDeleter> systemDeviceId;;
if (settingsDeviceDefault)
@@ -404,7 +427,8 @@ namespace SaneAudioRenderer
m_defaultDeviceSerial = newDefaultDeviceSerial;
- if ((m_device->IsExclusive() != !!settingsDeviceExclusive) ||
+ if ((clearForCrossfeed) ||
+ (m_device->IsExclusive() != !!settingsDeviceExclusive) ||
(m_device->GetBufferDuration() != settingsDeviceBuffer) ||
(!settingsDeviceDefault && *m_device->GetId() != settingsDeviceId.get()) ||
(settingsDeviceDefault && *m_device->GetId() != systemDeviceId.get()))
diff --git a/src/DspCrossfeed.cpp b/src/DspCrossfeed.cpp
index caba47e..5fc9380 100644
--- a/src/DspCrossfeed.cpp
+++ b/src/DspCrossfeed.cpp
@@ -28,7 +28,7 @@ namespace SaneAudioRenderer
void DspCrossfeed::Process(DspChunk& chunk)
{
- if (m_possible && m_settingsSerial != m_settings->GetSerial())
+ if (m_settingsSerial != m_settings->GetSerial())
UpdateSettings();
if (!m_active || chunk.IsEmpty())
@@ -48,8 +48,6 @@ namespace SaneAudioRenderer
void DspCrossfeed::UpdateSettings()
{
- assert(m_possible);
-
m_settingsSerial = m_settings->GetSerial();
UINT32 cutoffFrequency;
@@ -59,7 +57,7 @@ namespace SaneAudioRenderer
BOOL enabled;
m_settings->GetCrossfeedEnabled(&enabled);
- m_active = !!enabled;
+ m_active = m_possible && enabled;
if (m_active)
{
diff --git a/src/DspMatrix.cpp b/src/DspMatrix.cpp
index b81ab8b..f8b097d 100644
--- a/src/DspMatrix.cpp
+++ b/src/DspMatrix.cpp
@@ -350,4 +350,9 @@ namespace SaneAudioRenderer
return 0;
}
}
+
+ bool DspMatrix::IsStereoFormat(const WAVEFORMATEX& format)
+ {
+ return format.nChannels == 2 && GetChannelMask(format) == KSAUDIO_SPEAKER_STEREO;
+ }
}
diff --git a/src/DspMatrix.h b/src/DspMatrix.h
index 16401a1..8f79c55 100644
--- a/src/DspMatrix.h
+++ b/src/DspMatrix.h
@@ -24,6 +24,7 @@ namespace SaneAudioRenderer
void Finish(DspChunk& chunk) override;
static DWORD GetChannelMask(const WAVEFORMATEX& format);
+ static bool IsStereoFormat(const WAVEFORMATEX& format);
private: