Loading media/libaudiofoundation/include/media/AudioContainers.h +6 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,9 @@ static inline ChannelMaskSet asInMask(const ChannelMaskSet& channelMasks) { for (const auto &channel : channelMasks) { if (audio_channel_mask_out_to_in(channel) != AUDIO_CHANNEL_INVALID) { inMaskSet.insert(audio_channel_mask_out_to_in(channel)); } else if (audio_channel_mask_get_representation(channel) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { inMaskSet.insert(channel); } } return inMaskSet; Loading @@ -76,6 +79,9 @@ static inline ChannelMaskSet asOutMask(const ChannelMaskSet& channelMasks) { for (const auto &channel : channelMasks) { if (audio_channel_mask_in_to_out(channel) != AUDIO_CHANNEL_INVALID) { outMaskSet.insert(audio_channel_mask_in_to_out(channel)); } else if (audio_channel_mask_get_representation(channel) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { outMaskSet.insert(channel); } } return outMaskSet; Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +25 −14 Original line number Diff line number Diff line Loading @@ -68,16 +68,6 @@ using content::AttributionSourceState; // media / notification / system volume. constexpr float IN_CALL_EARPIECE_HEADROOM_DB = 3.f; // Compressed formats for MSD module, ordered from most preferred to least preferred. static const std::vector<audio_format_t> msdCompressedFormatsOrder = {{ AUDIO_FORMAT_IEC60958, AUDIO_FORMAT_MAT_2_1, AUDIO_FORMAT_MAT_2_0, AUDIO_FORMAT_E_AC3, AUDIO_FORMAT_AC3, AUDIO_FORMAT_PCM_16_BIT }}; // Channel masks for MSD module, 3D > 2D > 1D ordering (most preferred to least preferred). static const std::vector<audio_channel_mask_t> msdSurroundChannelMasksOrder = {{ AUDIO_CHANNEL_OUT_3POINT1POINT2, AUDIO_CHANNEL_OUT_3POINT0POINT2, AUDIO_CHANNEL_OUT_2POINT1POINT2, AUDIO_CHANNEL_OUT_2POINT0POINT2, AUDIO_CHANNEL_OUT_5POINT1, AUDIO_CHANNEL_OUT_STEREO }}; template <typename T> bool operator== (const SortedVector<T> &left, const SortedVector<T> &right) { Loading Loading @@ -1644,10 +1634,28 @@ status_t AudioPolicyManager::getBestMsdConfig(bool hwAvSync, const AudioProfileVector &sourceProfiles, const AudioProfileVector &sinkProfiles, audio_port_config *sourceConfig, audio_port_config *sinkConfig) const { // Compressed formats for MSD module, ordered from most preferred to least preferred. static const std::vector<audio_format_t> formatsOrder = {{ AUDIO_FORMAT_IEC60958, AUDIO_FORMAT_MAT_2_1, AUDIO_FORMAT_MAT_2_0, AUDIO_FORMAT_E_AC3, AUDIO_FORMAT_AC3, AUDIO_FORMAT_PCM_16_BIT }}; static const std::vector<audio_channel_mask_t> channelMasksOrder = [](){ // Channel position masks for MSD module, 3D > 2D > 1D ordering (most preferred to least // preferred). std::vector<audio_channel_mask_t> masks = {{ AUDIO_CHANNEL_OUT_3POINT1POINT2, AUDIO_CHANNEL_OUT_3POINT0POINT2, AUDIO_CHANNEL_OUT_2POINT1POINT2, AUDIO_CHANNEL_OUT_2POINT0POINT2, AUDIO_CHANNEL_OUT_5POINT1, AUDIO_CHANNEL_OUT_STEREO }}; // insert index masks (higher counts most preferred) as preferred over position masks for (int i = 1; i <= AUDIO_CHANNEL_COUNT_MAX; i++) { masks.insert( masks.begin(), audio_channel_mask_for_index_assignment_from_count(i)); } return masks; }(); struct audio_config_base bestSinkConfig; status_t result = findBestMatchingOutputConfig(sourceProfiles, sinkProfiles, msdCompressedFormatsOrder, msdSurroundChannelMasksOrder, true /*preferHigherSamplingRates*/, bestSinkConfig); status_t result = findBestMatchingOutputConfig(sourceProfiles, sinkProfiles, formatsOrder, channelMasksOrder, true /*preferHigherSamplingRates*/, bestSinkConfig); if (result != NO_ERROR) { ALOGD("%s() no matching config found for sink, hwAvSync: %d", __func__, hwAvSync); Loading @@ -1669,7 +1677,10 @@ status_t AudioPolicyManager::getBestMsdConfig(bool hwAvSync, } sourceConfig->sample_rate = bestSinkConfig.sample_rate; // Specify exact channel mask to prevent guessing by bit count in PatchPanel. sourceConfig->channel_mask = audio_channel_mask_out_to_in(bestSinkConfig.channel_mask); sourceConfig->channel_mask = audio_channel_mask_get_representation(bestSinkConfig.channel_mask) == AUDIO_CHANNEL_REPRESENTATION_INDEX ? bestSinkConfig.channel_mask : audio_channel_mask_out_to_in(bestSinkConfig.channel_mask); sourceConfig->format = bestSinkConfig.format; // Copy input stream directly without any processing (e.g. resampling). sourceConfig->flags.input = static_cast<audio_input_flags_t>( Loading services/audiopolicy/tests/audiopolicymanager_tests.cpp +6 −6 Original line number Diff line number Diff line Loading @@ -446,7 +446,7 @@ void AudioPolicyManagerTestMsd::SetUpManagerConfig() { sp<AudioProfile> ac3OutputProfile = new AudioProfile( AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate); sp<AudioProfile> iec958OutputProfile = new AudioProfile( AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate); AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate); mMsdOutputDevice->addAudioProfile(pcmOutputProfile); mMsdOutputDevice->addAudioProfile(ac3OutputProfile); mMsdOutputDevice->addAudioProfile(iec958OutputProfile); Loading Loading @@ -519,7 +519,7 @@ void AudioPolicyManagerTestMsd::SetUpManagerConfig() { // Add HDMI input device with IEC60958 profile for HDMI in -> MSD patching. mHdmiInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_HDMI); sp<AudioProfile> iec958InputProfile = new AudioProfile( AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate); AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate); mHdmiInputDevice->addAudioProfile(iec958InputProfile); config.addDevice(mHdmiInputDevice); sp<InputProfile> hdmiInputProfile = new InputProfile("hdmi input"); Loading Loading @@ -677,8 +677,8 @@ TEST_P(AudioPolicyManagerTestMsd, PatchCreationFromHdmiInToMsd) { ASSERT_EQ(AUDIO_PORT_ROLE_SINK, patch->mPatch.sinks[0].role); ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sources[0].format); ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sinks[0].format); ASSERT_EQ(AUDIO_CHANNEL_IN_STEREO, patch->mPatch.sources[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_OUT_STEREO, patch->mPatch.sinks[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sources[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sinks[0].channel_mask); ASSERT_EQ(k48000SamplingRate, patch->mPatch.sources[0].sample_rate); ASSERT_EQ(k48000SamplingRate, patch->mPatch.sinks[0].sample_rate); ASSERT_EQ(1, patchCount.deltaFromSnapshot()); Loading Loading @@ -754,7 +754,7 @@ TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) { audio_config_base_t msdDirectConfig2 = AUDIO_CONFIG_BASE_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24; audio_config_base_t msdNonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; Loading Loading @@ -821,7 +821,7 @@ TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) { audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24; audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; Loading Loading
media/libaudiofoundation/include/media/AudioContainers.h +6 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,9 @@ static inline ChannelMaskSet asInMask(const ChannelMaskSet& channelMasks) { for (const auto &channel : channelMasks) { if (audio_channel_mask_out_to_in(channel) != AUDIO_CHANNEL_INVALID) { inMaskSet.insert(audio_channel_mask_out_to_in(channel)); } else if (audio_channel_mask_get_representation(channel) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { inMaskSet.insert(channel); } } return inMaskSet; Loading @@ -76,6 +79,9 @@ static inline ChannelMaskSet asOutMask(const ChannelMaskSet& channelMasks) { for (const auto &channel : channelMasks) { if (audio_channel_mask_in_to_out(channel) != AUDIO_CHANNEL_INVALID) { outMaskSet.insert(audio_channel_mask_in_to_out(channel)); } else if (audio_channel_mask_get_representation(channel) == AUDIO_CHANNEL_REPRESENTATION_INDEX) { outMaskSet.insert(channel); } } return outMaskSet; Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +25 −14 Original line number Diff line number Diff line Loading @@ -68,16 +68,6 @@ using content::AttributionSourceState; // media / notification / system volume. constexpr float IN_CALL_EARPIECE_HEADROOM_DB = 3.f; // Compressed formats for MSD module, ordered from most preferred to least preferred. static const std::vector<audio_format_t> msdCompressedFormatsOrder = {{ AUDIO_FORMAT_IEC60958, AUDIO_FORMAT_MAT_2_1, AUDIO_FORMAT_MAT_2_0, AUDIO_FORMAT_E_AC3, AUDIO_FORMAT_AC3, AUDIO_FORMAT_PCM_16_BIT }}; // Channel masks for MSD module, 3D > 2D > 1D ordering (most preferred to least preferred). static const std::vector<audio_channel_mask_t> msdSurroundChannelMasksOrder = {{ AUDIO_CHANNEL_OUT_3POINT1POINT2, AUDIO_CHANNEL_OUT_3POINT0POINT2, AUDIO_CHANNEL_OUT_2POINT1POINT2, AUDIO_CHANNEL_OUT_2POINT0POINT2, AUDIO_CHANNEL_OUT_5POINT1, AUDIO_CHANNEL_OUT_STEREO }}; template <typename T> bool operator== (const SortedVector<T> &left, const SortedVector<T> &right) { Loading Loading @@ -1644,10 +1634,28 @@ status_t AudioPolicyManager::getBestMsdConfig(bool hwAvSync, const AudioProfileVector &sourceProfiles, const AudioProfileVector &sinkProfiles, audio_port_config *sourceConfig, audio_port_config *sinkConfig) const { // Compressed formats for MSD module, ordered from most preferred to least preferred. static const std::vector<audio_format_t> formatsOrder = {{ AUDIO_FORMAT_IEC60958, AUDIO_FORMAT_MAT_2_1, AUDIO_FORMAT_MAT_2_0, AUDIO_FORMAT_E_AC3, AUDIO_FORMAT_AC3, AUDIO_FORMAT_PCM_16_BIT }}; static const std::vector<audio_channel_mask_t> channelMasksOrder = [](){ // Channel position masks for MSD module, 3D > 2D > 1D ordering (most preferred to least // preferred). std::vector<audio_channel_mask_t> masks = {{ AUDIO_CHANNEL_OUT_3POINT1POINT2, AUDIO_CHANNEL_OUT_3POINT0POINT2, AUDIO_CHANNEL_OUT_2POINT1POINT2, AUDIO_CHANNEL_OUT_2POINT0POINT2, AUDIO_CHANNEL_OUT_5POINT1, AUDIO_CHANNEL_OUT_STEREO }}; // insert index masks (higher counts most preferred) as preferred over position masks for (int i = 1; i <= AUDIO_CHANNEL_COUNT_MAX; i++) { masks.insert( masks.begin(), audio_channel_mask_for_index_assignment_from_count(i)); } return masks; }(); struct audio_config_base bestSinkConfig; status_t result = findBestMatchingOutputConfig(sourceProfiles, sinkProfiles, msdCompressedFormatsOrder, msdSurroundChannelMasksOrder, true /*preferHigherSamplingRates*/, bestSinkConfig); status_t result = findBestMatchingOutputConfig(sourceProfiles, sinkProfiles, formatsOrder, channelMasksOrder, true /*preferHigherSamplingRates*/, bestSinkConfig); if (result != NO_ERROR) { ALOGD("%s() no matching config found for sink, hwAvSync: %d", __func__, hwAvSync); Loading @@ -1669,7 +1677,10 @@ status_t AudioPolicyManager::getBestMsdConfig(bool hwAvSync, } sourceConfig->sample_rate = bestSinkConfig.sample_rate; // Specify exact channel mask to prevent guessing by bit count in PatchPanel. sourceConfig->channel_mask = audio_channel_mask_out_to_in(bestSinkConfig.channel_mask); sourceConfig->channel_mask = audio_channel_mask_get_representation(bestSinkConfig.channel_mask) == AUDIO_CHANNEL_REPRESENTATION_INDEX ? bestSinkConfig.channel_mask : audio_channel_mask_out_to_in(bestSinkConfig.channel_mask); sourceConfig->format = bestSinkConfig.format; // Copy input stream directly without any processing (e.g. resampling). sourceConfig->flags.input = static_cast<audio_input_flags_t>( Loading
services/audiopolicy/tests/audiopolicymanager_tests.cpp +6 −6 Original line number Diff line number Diff line Loading @@ -446,7 +446,7 @@ void AudioPolicyManagerTestMsd::SetUpManagerConfig() { sp<AudioProfile> ac3OutputProfile = new AudioProfile( AUDIO_FORMAT_AC3, AUDIO_CHANNEL_OUT_5POINT1, k48000SamplingRate); sp<AudioProfile> iec958OutputProfile = new AudioProfile( AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_OUT_STEREO, k48000SamplingRate); AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate); mMsdOutputDevice->addAudioProfile(pcmOutputProfile); mMsdOutputDevice->addAudioProfile(ac3OutputProfile); mMsdOutputDevice->addAudioProfile(iec958OutputProfile); Loading Loading @@ -519,7 +519,7 @@ void AudioPolicyManagerTestMsd::SetUpManagerConfig() { // Add HDMI input device with IEC60958 profile for HDMI in -> MSD patching. mHdmiInputDevice = new DeviceDescriptor(AUDIO_DEVICE_IN_HDMI); sp<AudioProfile> iec958InputProfile = new AudioProfile( AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_IN_STEREO, k48000SamplingRate); AUDIO_FORMAT_IEC60958, AUDIO_CHANNEL_INDEX_MASK_24, k48000SamplingRate); mHdmiInputDevice->addAudioProfile(iec958InputProfile); config.addDevice(mHdmiInputDevice); sp<InputProfile> hdmiInputProfile = new InputProfile("hdmi input"); Loading Loading @@ -677,8 +677,8 @@ TEST_P(AudioPolicyManagerTestMsd, PatchCreationFromHdmiInToMsd) { ASSERT_EQ(AUDIO_PORT_ROLE_SINK, patch->mPatch.sinks[0].role); ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sources[0].format); ASSERT_EQ(AUDIO_FORMAT_IEC60958, patch->mPatch.sinks[0].format); ASSERT_EQ(AUDIO_CHANNEL_IN_STEREO, patch->mPatch.sources[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_OUT_STEREO, patch->mPatch.sinks[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sources[0].channel_mask); ASSERT_EQ(AUDIO_CHANNEL_INDEX_MASK_24, patch->mPatch.sinks[0].channel_mask); ASSERT_EQ(k48000SamplingRate, patch->mPatch.sources[0].sample_rate); ASSERT_EQ(k48000SamplingRate, patch->mPatch.sinks[0].sample_rate); ASSERT_EQ(1, patchCount.deltaFromSnapshot()); Loading Loading @@ -754,7 +754,7 @@ TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) { audio_config_base_t msdDirectConfig2 = AUDIO_CONFIG_BASE_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24; audio_config_base_t msdNonDirectConfig = AUDIO_CONFIG_BASE_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; Loading Loading @@ -821,7 +821,7 @@ TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) { audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_INDEX_MASK_24; audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; Loading