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-10-12 11:32:40 +0300
committerAlex Marsev <alex.marsev@gmail.com>2015-10-12 17:19:12 +0300
commit8e14705e1421851235d7a369c8bc27ea6698414e (patch)
tree74bc431f3c247410d09293b78740a4db6a835f2a
parent6bec94c049a002c5e5b6861486d22667b1e8bedf (diff)
Add "Ignore System Channel Mixer" option
No GUI yet.
-rw-r--r--src/AudioDeviceManager.cpp12
-rw-r--r--src/AudioRenderer.cpp17
-rw-r--r--src/Interfaces.h3
-rw-r--r--src/Settings.cpp18
-rw-r--r--src/Settings.h5
5 files changed, 48 insertions, 7 deletions
diff --git a/src/AudioDeviceManager.cpp b/src/AudioDeviceManager.cpp
index 4bbde98..ce77885 100644
--- a/src/AudioDeviceManager.cpp
+++ b/src/AudioDeviceManager.cpp
@@ -308,8 +308,18 @@ namespace SaneAudioRenderer
}
else
{
- if (crossfeedEnabled && DspMatrix::IsStereoFormat(*mixFormat))
+ bool usingSystemChannelMixer = f.Format.nChannels != mixChannels ||
+ f.dwChannelMask != mixMask;
+
+ if (usingSystemChannelMixer && pSettings->GetIgnoreSystemChannelMixer())
+ {
+ // Ignore system channel mixer if explicitly requested.
+ backend->ignoredSystemChannelMixer = true;
+ }
+ else if (usingSystemChannelMixer && pSettings->GetCrossfeedEnabled() &&
+ DspMatrix::IsStereoFormat(*mixFormat))
{
+ // Crossfeed takes priority over system channel mixer.
backend->ignoredSystemChannelMixer = true;
}
else
diff --git a/src/AudioRenderer.cpp b/src/AudioRenderer.cpp
index ffb4c06..603b469 100644
--- a/src/AudioRenderer.cpp
+++ b/src/AudioRenderer.cpp
@@ -390,24 +390,28 @@ namespace SaneAudioRenderer
settingsDeviceId.reset(pDeviceId);
}
+ bool clearForSystemChannelMixer = false;
bool clearForCrossfeed = false;
if (!m_device->IsExclusive())
{
BOOL crossfeedEnabled;
m_settings->GetCrossfeedEnabled(&crossfeedEnabled);
+ BOOL ignoreSystemChannelMixer = m_settings->GetIgnoreSystemChannelMixer();
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();
+ bool inputIsStereo = DspMatrix::IsStereoFormat(*m_inputFormat);
+ bool outputIsStereo = DspMatrix::IsStereoFormat(*m_device->GetWaveFormat());
- if ((mixFormatIsStereo && crossfeedEnabled && !outputIsStereo) ||
- (mixFormatIsStereo && !crossfeedEnabled && !inputIsStereo && ignoredSystemChannelMixer))
+ if (m_device->IgnoredSystemChannelMixer() && !ignoreSystemChannelMixer && !crossfeedEnabled)
+ {
+ clearForSystemChannelMixer = true;
+ }
+ else if (mixFormatIsStereo && crossfeedEnabled && !outputIsStereo)
{
clearForCrossfeed = true;
}
@@ -427,7 +431,8 @@ namespace SaneAudioRenderer
m_defaultDeviceSerial = newDefaultDeviceSerial;
- if ((clearForCrossfeed) ||
+ if ((clearForSystemChannelMixer) ||
+ (clearForCrossfeed) ||
(m_device->IsExclusive() != !!settingsDeviceExclusive) ||
(m_device->GetBufferDuration() != settingsDeviceBuffer) ||
(!settingsDeviceDefault && *m_device->GetId() != settingsDeviceId.get()) ||
diff --git a/src/Interfaces.h b/src/Interfaces.h
index e970951..a62d7c9 100644
--- a/src/Interfaces.h
+++ b/src/Interfaces.h
@@ -38,6 +38,9 @@ namespace SaneAudioRenderer
};
STDMETHOD(SetCrossfeedSettings)(UINT32 uCutoffFrequency, UINT32 uCrossfeedLevel) = 0;
STDMETHOD_(void, GetCrossfeedSettings)(UINT32* puCutoffFrequency, UINT32* puCrossfeedLevel) = 0;
+
+ STDMETHOD_(void, SetIgnoreSystemChannelMixer)(BOOL bEnable) = 0;
+ STDMETHOD_(BOOL, GetIgnoreSystemChannelMixer)() = 0;
};
_COM_SMARTPTR_TYPEDEF(ISettings, __uuidof(ISettings));
diff --git a/src/Settings.cpp b/src/Settings.cpp
index 4dd776a..5750db4 100644
--- a/src/Settings.cpp
+++ b/src/Settings.cpp
@@ -144,4 +144,22 @@ namespace SaneAudioRenderer
if (puCrossfeedLevel)
*puCrossfeedLevel = m_crossfeedLevel;
}
+
+ STDMETHODIMP_(void) Settings::SetIgnoreSystemChannelMixer(BOOL bEnable)
+ {
+ CAutoLock lock(this);
+
+ if (m_ignoreSystemChannelMixer != bEnable)
+ {
+ m_ignoreSystemChannelMixer = bEnable;
+ m_serial++;
+ }
+ }
+
+ STDMETHODIMP_(BOOL) Settings::GetIgnoreSystemChannelMixer()
+ {
+ CAutoLock lock(this);
+
+ return m_ignoreSystemChannelMixer;
+ }
}
diff --git a/src/Settings.h b/src/Settings.h
index 8438c5a..6f3d775 100644
--- a/src/Settings.h
+++ b/src/Settings.h
@@ -33,6 +33,9 @@ namespace SaneAudioRenderer
STDMETHODIMP SetCrossfeedSettings(UINT32 uCutoffFrequency, UINT32 uCrossfeedLevel) override;
STDMETHODIMP_(void) GetCrossfeedSettings(UINT32* puCutoffFrequency, UINT32* puCrossfeedLevel) override;
+ STDMETHODIMP_(void) SetIgnoreSystemChannelMixer(BOOL bEnable) override;
+ STDMETHODIMP_(BOOL) GetIgnoreSystemChannelMixer() override;
+
private:
std::atomic<UINT32> m_serial = 0;
@@ -48,5 +51,7 @@ namespace SaneAudioRenderer
BOOL m_crossfeedEnabled = FALSE;
UINT32 m_crossfeedCutoffFrequency = CROSSFEED_CUTOFF_FREQ_CMOY;
UINT32 m_crossfeedLevel = CROSSFEED_LEVEL_CMOY;
+
+ BOOL m_ignoreSystemChannelMixer = TRUE;
};
}