diff options
author | Alex Marsev <alex.marsev@gmail.com> | 2015-09-19 08:59:14 +0300 |
---|---|---|
committer | Alex Marsev <alex.marsev@gmail.com> | 2015-09-19 09:12:34 +0300 |
commit | 026370cb4738bf173bd1a1cffe6df181de1ef2fb (patch) | |
tree | 6d2b150b25e11b440b23f9fdf631bff9f603a86c | |
parent | f8ac0ae4db19c699860324ca3d93ec4c28e55479 (diff) |
Make crossfeed take priority over system mixer
-rw-r--r-- | src/AudioDevice.cpp | 14 | ||||
-rw-r--r-- | src/AudioDevice.h | 6 | ||||
-rw-r--r-- | src/AudioDeviceManager.cpp | 16 | ||||
-rw-r--r-- | src/AudioRenderer.cpp | 28 | ||||
-rw-r--r-- | src/DspCrossfeed.cpp | 6 | ||||
-rw-r--r-- | src/DspMatrix.cpp | 5 | ||||
-rw-r--r-- | src/DspMatrix.h | 1 |
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:
|