From cf7533165bab5c12359975bf71df362d5a92b67c Mon Sep 17 00:00:00 2001 From: AlwinEsch Date: Fri, 4 Jul 2014 02:26:31 +0200 Subject: [PATCH] ActiveAE: add advanced setting for forcing multichannel layout and fix fixed channel alignment (based upon pull #4967) --- .../AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 17 ++++++++++------- xbmc/settings/AdvancedSettings.cpp | 2 ++ xbmc/settings/AdvancedSettings.h | 1 + 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index 4d5b2e8d22046..3e7219394e23e 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -1454,16 +1454,18 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett } else { + bool multichannelSource = format.m_channelLayout.Count() > 2; + format.m_dataFormat = AE_FMT_FLOAT; // consider user channel layout for those cases // 1. input stream is multichannel // 2. stereo upmix is selected // 3. audio dsp is used // 4. fixed mode - if ((format.m_channelLayout.Count() > 2) || - settings.stereoupmix || - settings.dspaddonsenabled || - (settings.config == AE_CONFIG_FIXED)) + if (multichannelSource || + settings.stereoupmix || + settings.dspaddonsenabled || + (settings.config == AE_CONFIG_FIXED)) { AEStdChLayout stdChannelLayout; switch (settings.channels) @@ -1484,10 +1486,11 @@ void CActiveAE::ApplySettingsToFormat(AEAudioFormat &format, AudioSettings &sett CAEChannelInfo stdLayout(stdChannelLayout); - if (settings.dspaddonsenabled) + if (m_settings.config == AE_CONFIG_FIXED || + settings.dspaddonsenabled || + (settings.stereoupmix && !multichannelSource) || + (g_advancedSettings.m_audioFixedMultichannelLayout && multichannelSource)) format.m_channelLayout = CActiveAEDSP::Get().GetDSPChannelLayout(stdChannelLayout); - else if (m_settings.config == AE_CONFIG_FIXED || (settings.stereoupmix && format.m_channelLayout.Count() <= 2)) - format.m_channelLayout = stdLayout; else if (m_extKeepConfig && (settings.config == AE_CONFIG_AUTO) && (oldMode != MODE_RAW)) format.m_channelLayout = m_internalFormat.m_channelLayout; else diff --git a/xbmc/settings/AdvancedSettings.cpp b/xbmc/settings/AdvancedSettings.cpp index 4a64eea705315..14aa2ee5a1940 100644 --- a/xbmc/settings/AdvancedSettings.cpp +++ b/xbmc/settings/AdvancedSettings.cpp @@ -108,6 +108,7 @@ void CAdvancedSettings::Initialize() m_audioHeadRoom = 0; m_ac3Gain = 12.0f; m_audioApplyDrc = true; + m_audioFixedMultichannelLayout = false; m_dvdplayerIgnoreDTSinWAV = false; //default hold time of 25 ms, this allows a 20 hertz sine to pass undistorted @@ -501,6 +502,7 @@ void CAdvancedSettings::ParseSettingsFile(const CStdString &file) XMLUtils::GetString(pElement, "audiohost", m_audioHost); XMLUtils::GetBoolean(pElement, "applydrc", m_audioApplyDrc); + XMLUtils::GetBoolean(pElement, "fixedmultichannellayout", m_audioFixedMultichannelLayout); XMLUtils::GetBoolean(pElement, "dvdplayerignoredtsinwav", m_dvdplayerIgnoreDTSinWAV); XMLUtils::GetFloat(pElement, "limiterhold", m_limiterHold, 0.0f, 100.0f); diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h index a3ebfbeaf9475..c599589d725f6 100644 --- a/xbmc/settings/AdvancedSettings.h +++ b/xbmc/settings/AdvancedSettings.h @@ -179,6 +179,7 @@ class CAdvancedSettings : public ISettingCallback, public ISettingsHandler float m_videoIgnorePercentAtEnd; CStdString m_audioHost; bool m_audioApplyDrc; + bool m_audioFixedMultichannelLayout; int m_videoVDPAUScaling; float m_videoNonLinStretchRatio;