From c45e4710331c91c257d8173fe47e66427a69edeb Mon Sep 17 00:00:00 2001 From: Rainer Hochecker Date: Wed, 19 Feb 2014 11:18:34 +0100 Subject: ActiveAE: fix downmix for the case a sink returns more channels than requested --- xbmc/cores/AudioEngine/Engines/ActiveAE/ActiveAE.cpp | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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; } -- cgit v1.2.3