Loading services/audiopolicy/managerdefault/AudioPolicyManager.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -3962,8 +3962,16 @@ audio_direct_mode_t AudioPolicyManager::getDirectPlaybackSupport(const audio_att } flags = (audio_output_flags_t)((flags & relevantFlags) | AUDIO_OUTPUT_FLAG_DIRECT); DeviceVector outputDevices = mEngine->getOutputDevicesForAttributes(*attr); DeviceVector engineOutputDevices = mEngine->getOutputDevicesForAttributes(*attr); for (const auto& hwModule : mHwModules) { DeviceVector outputDevices = engineOutputDevices; // the MSD module checks for different conditions and output devices if (strcmp(hwModule->getName(), AUDIO_HARDWARE_MODULE_ID_MSD) == 0) { if (!msdHasPatchesToAllDevices(engineOutputDevices.toTypeAddrVector())) { continue; } outputDevices = getMsdAudioOutDevices(); } for (const auto& curProfile : hwModule->getOutputProfiles()) { if (!curProfile->isCompatibleProfile(outputDevices, config->sample_rate, nullptr /*updatedSamplingRate*/, Loading Loading @@ -3993,8 +4001,7 @@ audio_direct_mode_t AudioPolicyManager::getDirectPlaybackSupport(const audio_att directMode = (audio_direct_mode_t)(directMode | AUDIO_DIRECT_OFFLOAD_SUPPORTED); } } else { directMode = (audio_direct_mode_t) (directMode | AUDIO_DIRECT_BITSTREAM_SUPPORTED); directMode = (audio_direct_mode_t) (directMode | AUDIO_DIRECT_BITSTREAM_SUPPORTED); } } } Loading services/audiopolicy/tests/audiopolicymanager_tests.cpp +85 −0 Original line number Diff line number Diff line Loading @@ -766,6 +766,91 @@ TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) { ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr)); } TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) { const audio_attributes_t attr = { AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""}; audio_config_t directConfig = AUDIO_CONFIG_INITIALIZER; directConfig.format = AUDIO_FORMAT_DTS; directConfig.sample_rate = 48000; directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1; audio_config_t nonDirectConfig = AUDIO_CONFIG_INITIALIZER; nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; nonDirectConfig.sample_rate = 48000; nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t nonExistentConfig = AUDIO_CONFIG_INITIALIZER; nonExistentConfig.format = AUDIO_FORMAT_E_AC3; nonExistentConfig.sample_rate = 48000; nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t msdDirectConfig1 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig1.format = AUDIO_FORMAT_AC3; msdDirectConfig1.sample_rate = 48000; msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1; audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; msdNonDirectConfig.sample_rate = 96000; msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // before setting MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); DeviceVector outputDevices = mManager->getAvailableOutputDevices(); // Remove MSD output device to avoid patching to itself outputDevices.remove(mMsdOutputDevice); mManager->setMsdOutputPatches(&outputDevices); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // after setting MSD patches the direct MSD configs return values according to their flags ASSERT_EQ(AUDIO_DIRECT_OFFLOAD_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); mManager->releaseMsdOutputPatches(outputDevices); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // after releasing MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); } class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest { protected: void SetUpManagerConfig() override; Loading Loading
services/audiopolicy/managerdefault/AudioPolicyManager.cpp +11 −4 Original line number Diff line number Diff line Loading @@ -3962,8 +3962,16 @@ audio_direct_mode_t AudioPolicyManager::getDirectPlaybackSupport(const audio_att } flags = (audio_output_flags_t)((flags & relevantFlags) | AUDIO_OUTPUT_FLAG_DIRECT); DeviceVector outputDevices = mEngine->getOutputDevicesForAttributes(*attr); DeviceVector engineOutputDevices = mEngine->getOutputDevicesForAttributes(*attr); for (const auto& hwModule : mHwModules) { DeviceVector outputDevices = engineOutputDevices; // the MSD module checks for different conditions and output devices if (strcmp(hwModule->getName(), AUDIO_HARDWARE_MODULE_ID_MSD) == 0) { if (!msdHasPatchesToAllDevices(engineOutputDevices.toTypeAddrVector())) { continue; } outputDevices = getMsdAudioOutDevices(); } for (const auto& curProfile : hwModule->getOutputProfiles()) { if (!curProfile->isCompatibleProfile(outputDevices, config->sample_rate, nullptr /*updatedSamplingRate*/, Loading Loading @@ -3993,8 +4001,7 @@ audio_direct_mode_t AudioPolicyManager::getDirectPlaybackSupport(const audio_att directMode = (audio_direct_mode_t)(directMode | AUDIO_DIRECT_OFFLOAD_SUPPORTED); } } else { directMode = (audio_direct_mode_t) (directMode | AUDIO_DIRECT_BITSTREAM_SUPPORTED); directMode = (audio_direct_mode_t) (directMode | AUDIO_DIRECT_BITSTREAM_SUPPORTED); } } } Loading
services/audiopolicy/tests/audiopolicymanager_tests.cpp +85 −0 Original line number Diff line number Diff line Loading @@ -766,6 +766,91 @@ TEST_P(AudioPolicyManagerTestMsd, IsDirectPlaybackSupportedWithMsd) { ASSERT_FALSE(mManager->isDirectOutputSupported(msdNonDirectConfig, attr)); } TEST_P(AudioPolicyManagerTestMsd, GetDirectPlaybackSupportWithMsd) { const audio_attributes_t attr = { AUDIO_CONTENT_TYPE_UNKNOWN, AUDIO_USAGE_UNKNOWN, AUDIO_SOURCE_DEFAULT, AUDIO_FLAG_NONE, ""}; audio_config_t directConfig = AUDIO_CONFIG_INITIALIZER; directConfig.format = AUDIO_FORMAT_DTS; directConfig.sample_rate = 48000; directConfig.channel_mask = AUDIO_CHANNEL_OUT_5POINT1; audio_config_t nonDirectConfig = AUDIO_CONFIG_INITIALIZER; nonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; nonDirectConfig.sample_rate = 48000; nonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t nonExistentConfig = AUDIO_CONFIG_INITIALIZER; nonExistentConfig.format = AUDIO_FORMAT_E_AC3; nonExistentConfig.sample_rate = 48000; nonExistentConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t msdDirectConfig1 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig1.format = AUDIO_FORMAT_AC3; msdDirectConfig1.sample_rate = 48000; msdDirectConfig1.channel_mask = AUDIO_CHANNEL_OUT_5POINT1; audio_config_t msdDirectConfig2 = AUDIO_CONFIG_INITIALIZER; msdDirectConfig2.format = AUDIO_FORMAT_IEC60958; msdDirectConfig2.sample_rate = 48000; msdDirectConfig2.channel_mask = AUDIO_CHANNEL_OUT_STEREO; audio_config_t msdNonDirectConfig = AUDIO_CONFIG_INITIALIZER; msdNonDirectConfig.format = AUDIO_FORMAT_PCM_16_BIT; msdNonDirectConfig.sample_rate = 96000; msdNonDirectConfig.channel_mask = AUDIO_CHANNEL_OUT_STEREO; ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // before setting MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); DeviceVector outputDevices = mManager->getAvailableOutputDevices(); // Remove MSD output device to avoid patching to itself outputDevices.remove(mMsdOutputDevice); mManager->setMsdOutputPatches(&outputDevices); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // after setting MSD patches the direct MSD configs return values according to their flags ASSERT_EQ(AUDIO_DIRECT_OFFLOAD_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); mManager->releaseMsdOutputPatches(outputDevices); ASSERT_EQ(AUDIO_DIRECT_BITSTREAM_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &directConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonDirectConfig)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &nonExistentConfig)); // after releasing MSD patches the direct MSD configs return AUDIO_DIRECT_NOT_SUPPORTED ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig1)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdDirectConfig2)); ASSERT_EQ(AUDIO_DIRECT_NOT_SUPPORTED, mManager->getDirectPlaybackSupport(&attr, &msdNonDirectConfig)); } class AudioPolicyManagerTestWithConfigurationFile : public AudioPolicyManagerTest { protected: void SetUpManagerConfig() override; Loading