diff --git a/services/audio_policy/server/infra/datashare/src/audio_policy_utils.cpp b/services/audio_policy/server/infra/datashare/src/audio_policy_utils.cpp index 763d48945c475940c3df380b6dd12f8f99da607d..bff7f6744faeaa7e45c62d431e8e4f0c56532142 100644 --- a/services/audio_policy/server/infra/datashare/src/audio_policy_utils.cpp +++ b/services/audio_policy/server/infra/datashare/src/audio_policy_utils.cpp @@ -371,6 +371,7 @@ std::string AudioPolicyUtils::GetOutputDeviceClassBySinkPortName(std::string sin {BLUETOOTH_SPEAKER, A2DP_CLASS}, {USB_SPEAKER, USB_CLASS}, {PRIMARY_DIRECT_VOIP, DIRECT_VOIP_CLASS}, + {PRIMARY_MMAP_VOIP, MMAP_VOIP_CLASS}, {DP_SINK, DP_CLASS}, {FILE_SINK, FILE_CLASS}, {REMOTE_CAST_INNER_CAPTURER_SINK_NAME, REMOTE_CLASS}, diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp index fc8a8052a378ed797dfb6fe31ad67560e9a288c5..4ee7bd7df1f4470003a60b563c442e9bd4672fdb 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp @@ -2404,18 +2404,32 @@ void AudioCoreService::MuteSinkPortForSwitchDevice(std::shared_ptrnewDeviceDescs_.front()->IsSameDeviceDesc(streamDesc->oldDeviceDescs_.front())) { - return; - } + CHECK_AND_RETURN_LOG(streamDesc != nullptr && !streamDesc->oldDeviceDescs_.empty() && + !streamDesc->newDeviceDescs_.empty(), "Invalid streamDesc"); + std::shared_ptr oldDesc = streamDesc->oldDeviceDescs_.front(); + std::shared_ptr newDesc = streamDesc->newDeviceDescs_.front(); + CHECK_AND_RETURN(oldDesc != nullptr && newDesc != nullptr); + if (oldDesc->IsSameDeviceDesc(*newDesc)) { return; } audioIOHandleMap_.SetMoveFinish(false); - std::string oldSinkName = AudioPolicyUtils::GetInstance().GetSinkName(streamDesc->oldDeviceDescs_.front(), - streamDesc->sessionId_); - std::string newSinkName = AudioPolicyUtils::GetInstance().GetSinkName(*streamDesc->newDeviceDescs_.front(), - streamDesc->sessionId_); - AUDIO_INFO_LOG("mute sink old:[%{public}s] new:[%{public}s]", oldSinkName.c_str(), newSinkName.c_str()); - MuteSinkPort(oldSinkName, newSinkName, reason); + std::string oldSinkPortName = AudioPolicyUtils::GetInstance().GetSinkName(oldDesc, streamDesc->sessionId_); + std::string newSinkPortName = AudioPolicyUtils::GetInstance().GetSinkName(newDesc, streamDesc->sessionId_); + + auto GetVoipSinkPortNameIfVoip = [](uint32_t routeFlag, const std::string &defaultSinkPortName) -> std::string { + if (routeFlag == (AUDIO_OUTPUT_FLAG_FAST | AUDIO_OUTPUT_FLAG_VOIP)) { + return PRIMARY_MMAP_VOIP; + } + if (routeFlag == (AUDIO_OUTPUT_FLAG_DIRECT | AUDIO_OUTPUT_FLAG_VOIP)) { + return PRIMARY_DIRECT_VOIP; + } + return defaultSinkPortName; + }; + oldSinkPortName = GetVoipSinkPortNameIfVoip(streamDesc->oldRouteFlag_, oldSinkPortName); + newSinkPortName = GetVoipSinkPortNameIfVoip(streamDesc->routeFlag_, newSinkPortName); + + AUDIO_INFO_LOG("mute sink old:[%{public}s] new:[%{public}s]", oldSinkPortName.c_str(), newSinkPortName.c_str()); + MuteSinkPort(oldSinkPortName, newSinkPortName, reason); } // After media playback is interrupted by the alarm or ring, diff --git a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp index 880f661d36417163048bb512e66bb6cfa35ce935..b0c78d856ffc5d9d4890bb59083f180203dafdd9 100644 --- a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp @@ -2767,6 +2767,42 @@ HWTEST_F(AudioCoreServicePrivateTest, ActivateInputDevice_002, TestSize.Level4) AUDIO_INFO_LOG("AudioCoreServicePrivateTest ActivateInputDevice_002 end"); } +/** + * @tc.name : Test AudioCoreService. + * @tc.number: MuteSinkPortForSwitchDevice_001 + * @tc.desc : Test AudioCoreService::MuteSinkPortForSwitchDevice() + */ +HWTEST_F(AudioCoreServicePrivateTest, MuteSinkPortForSwitchDevice_001, TestSize.Level1) +{ + auto audioCoreService = std::make_shared(); + ASSERT_NE(audioCoreService, nullptr); + + // Test1 + AudioStreamDeviceChangeReasonExt::ExtEnum extReason = AudioStreamDeviceChangeReasonExt::ExtEnum::OVERRODE; + AudioStreamDeviceChangeReasonExt reason(extReason); + std::shared_ptr streamDesc = std::make_shared(); + std::shared_ptr oldDesc = std::make_shared( + DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP, DeviceRole::OUTPUT_DEVICE); + std::shared_ptr newDesc = std::make_shared( + DeviceType::DEVICE_TYPE_BLUETOOTH_A2DP, DeviceRole::OUTPUT_DEVICE); + streamDesc->oldDeviceDescs_.push_back(oldDesc); + streamDesc->oldDeviceDescs_.push_back(newDesc); + audioCoreService->audioIOHandleMap_.SetMoveFinish(true); + + audioCoreService->MuteSinkPortForSwitchDevice(streamDesc, reason); + EXPECT_TRUE(audioCoreService->audioIOHandleMap_.moveDeviceFinished_.load()); + streamDesc->newDeviceDescs_.clear(); + + // Test2 + newDesc = std::make_shared( + DeviceType::DEVICE_TYPE_SPEAKER, DeviceRole::OUTPUT_DEVICE); + streamDesc->newDeviceDescs_.push_back(newDesc); + + audioCoreService->MuteSinkPortForSwitchDevice(streamDesc, reason); + EXPECT_FALSE(audioCoreService->audioIOHandleMap_.moveDeviceFinished_.load()); + audioCoreService->audioIOHandleMap_.SetMoveFinish(false); +} + /** * @tc.name : Test AudioCoreService. * @tc.number: CheckAndSleepBeforeRingDualDeviceSet_001