diff options
author | jmarshallnz <jcmarsha@gmail.com> | 2014-02-20 08:07:55 +1300 |
---|---|---|
committer | jmarshallnz <jcmarsha@gmail.com> | 2014-02-20 08:07:55 +1300 |
commit | 33342786a6e021e14ab573cbbcd306a4a3820951 (patch) | |
tree | ae64b6f347c401dc159536f2c0cbf71396e09280 | |
parent | f6f539a7c933b37f3efd08cea765f1f0f59a30c5 (diff) | |
parent | c45e4710331c91c257d8173fe47e66427a69edeb (diff) |
Merge pull request #4239 from FernetMenta/active
ActiveAE: fix downmix for the case a sink returns more channels than req...
-rw-r--r-- | xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp index ccbe99a45c..f30f37b556 100644 --- a/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp +++ b/xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp @@ -930,6 +930,11 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) if (m_streams.empty()) { inputFormat = m_sinkFormat; + if (m_sinkFormat.m_channelLayout.Count() > m_sinkRequestFormat.m_channelLayout.Count()) + { + inputFormat.m_channelLayout = m_sinkRequestFormat.m_channelLayout; + inputFormat.m_channelLayout.ResolveChannels(m_sinkFormat.m_channelLayout); + } inputFormat.m_dataFormat = AE_FMT_FLOAT; inputFormat.m_frameSize = inputFormat.m_channelLayout.Count() * (CAEUtil::DataFormatToBits(inputFormat.m_dataFormat) >> 3); @@ -1023,6 +1028,16 @@ void CActiveAE::Configure(AEAudioFormat *desiredFmt) outputFormat.m_dataFormat = AE_FMT_FLOAT; outputFormat.m_frameSize = outputFormat.m_channelLayout.Count() * (CAEUtil::DataFormatToBits(outputFormat.m_dataFormat) >> 3); + + // due to channel ordering of the driver, a sink may return more channels than + // requested, i.e. 2.1 request returns FL,FR,BL,BR,FC,LFE for ALSA + // in this case we need to downmix to requested format + if (m_sinkFormat.m_channelLayout.Count() > m_sinkRequestFormat.m_channelLayout.Count()) + { + outputFormat.m_channelLayout = m_sinkRequestFormat.m_channelLayout; + outputFormat.m_channelLayout.ResolveChannels(m_sinkFormat.m_channelLayout); + } + // TODO: adjust to decoder sinkInputFormat = outputFormat; } |