From d3224b9ed63e34f3081d39b9ccb34e714a43160a Mon Sep 17 00:00:00 2001 From: linhao Date: Sat, 30 Aug 2025 11:07:22 +0800 Subject: [PATCH] fix noise issue during voice call device switch. Signed-off-by: linhao --- .../include/audio_device_descriptor.h | 2 + .../device/src/audio_device_descriptor.cpp | 6 +++ .../service_main/include/audio_core_service.h | 9 ++++ .../src/audio_core_service_private.cpp | 50 ++++++++++++++++++- .../audio_core_service_private_unit_test.cpp | 41 ++++++++++++++- 5 files changed, 106 insertions(+), 2 deletions(-) diff --git a/interfaces/inner_api/native/audiocommon/include/audio_device_descriptor.h b/interfaces/inner_api/native/audiocommon/include/audio_device_descriptor.h index 8b6e291698..365718302e 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_device_descriptor.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_device_descriptor.h @@ -99,6 +99,8 @@ public: bool IsDistributedSpeaker() const; + bool IsSpeakerOrEarpiece() const; + bool IsRemote() const; DeviceType MapInternalToExternalDeviceType(int32_t apiVersion, bool isSupportedNearlink = true) const; diff --git a/services/audio_policy/server/domain/device/src/audio_device_descriptor.cpp b/services/audio_policy/server/domain/device/src/audio_device_descriptor.cpp index df95f47a56..e80f3673af 100644 --- a/services/audio_policy/server/domain/device/src/audio_device_descriptor.cpp +++ b/services/audio_policy/server/domain/device/src/audio_device_descriptor.cpp @@ -489,6 +489,12 @@ bool AudioDeviceDescriptor::IsDistributedSpeaker() const return deviceType_ == DEVICE_TYPE_SPEAKER && networkId_ != "LocalDevice"; } +bool AudioDeviceDescriptor::IsSpeakerOrEarpiece() const +{ + return (networkId_ == LOCAL_NETWORK_ID && deviceType_ == DEVICE_TYPE_SPEAKER) || + deviceType_ == DEVICE_TYPE_EARPIECE; +} + bool AudioDeviceDescriptor::IsRemote() const { return networkId_ != "LocalDevice"; diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service.h b/services/audio_policy/server/service/service_main/include/audio_core_service.h index 83d8814e7b..99465f2d7e 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service.h @@ -320,6 +320,10 @@ private: void CheckModemScene(std::vector> &descs, const AudioStreamDeviceChangeReasonExt reason); int32_t UpdateModemRoute(std::vector> &descs); + uint32_t GetVoiceCallMuteDuration(AudioDeviceDescriptor &curDesc, AudioDeviceDescriptor &newDesc); + void UnmuteVoiceCallAfterMuteDuration(uint32_t muteDuration); + void NotifyUnmuteVoiceCall(); + void SetUpdateModemRouteFinished(bool flag); void HandleAudioCaptureState(AudioMode &mode, AudioStreamChangeInfo &streamChangeInfo); void UpdateDefaultOutputDeviceWhenStopping(int32_t uid); void UpdateInputDeviceWhenStopping(int32_t uid); @@ -576,6 +580,11 @@ private: std::unordered_map> routeUpdateCallback_; std::mutex routeUpdateCallbackMutex_; + std::mutex updateModemRouteMutex_; + std::condition_variable updateModemRouteCV_; + bool updateModemRouteFinished_ = false; + bool needUnmuteVoiceCall_ = false; + DistributedRoutingInfo distributedRoutingInfo_ = { .descriptor = nullptr, .type = CAST_TYPE_NULL 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 2537820324..05dac1f88f 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 @@ -58,6 +58,8 @@ static const int64_t SELECT_DEVICE_MUTE_MS = 200000; // 200ms static const int64_t SELECT_OFFLOAD_DEVICE_MUTE_MS = 400000; // 400ms static const int64_t OLD_DEVICE_UNAVALIABLE_EXT_MUTE_MS = 300000; // 300ms static const int64_t DISTRIBUTED_DEVICE_UNAVALIABLE_MUTE_MS = 1500000; // 1.5s +static const uint32_t VOICE_CALL_DEVICE_SWITCH_MUTE_US = 100000; // 100ms +static const uint32_t MUTE_TO_ROUTE_UPDATE_TIMEOUT_MS = 1000; // 1s static const uint32_t BASE_DEVICE_SWITCH_SLEEP_US = 80000; // 80ms static const uint32_t OLD_DEVICE_UNAVAILABLE_EXTRA_SLEEP_US = 150000; // 150ms @@ -319,6 +321,11 @@ void AudioCoreService::CheckModemScene(std::vectordeviceType_); } @@ -333,7 +340,10 @@ int32_t AudioCoreService::UpdateModemRoute(std::vectordeviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG, descs.front()->deviceName_, LOCAL_NETWORK_ID); - audioVolumeManager_.SetVoiceCallVolume(GetSystemVolumeLevel(STREAM_VOICE_CALL)); + if (needUnmuteVoiceCall_) { + NotifyUnmuteVoiceCall(); + needUnmuteVoiceCall_ = false; + } } AudioDeviceDescriptor desc = AudioDeviceDescriptor(descs.front()); std::unordered_map> modemSessionMap = @@ -345,6 +355,44 @@ int32_t AudioCoreService::UpdateModemRoute(std::vector lock(updateModemRouteMutex_); + updateModemRouteCV_.wait_for(lock, std::chrono::milliseconds(MUTE_TO_ROUTE_UPDATE_TIMEOUT_MS), + [this] { return updateModemRouteFinished_; }); + } + usleep(muteDuration); + audioVolumeManager_.SetVoiceCallVolume(GetSystemVolumeLevel(STREAM_VOICE_CALL)); +} + +void AudioCoreService::NotifyUnmuteVoiceCall() +{ + { + std::unique_lock lock(updateModemRouteMutex_); + updateModemRouteFinished_ = true; + } + updateModemRouteCV_.notify_all(); +} + +void AudioCoreService::SetUpdateModemRouteFinished(bool flag) +{ + std::unique_lock lock(updateModemRouteMutex_); + updateModemRouteFinished_ = flag; +} + void AudioCoreService::CheckCloseHearingAidCall(const bool isModemCallRunning, const DeviceType type) { if (hearingAidCallFlag_) { 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 4c07963ff9..e534fda45f 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 @@ -2258,10 +2258,16 @@ HWTEST_F(AudioCoreServicePrivateTest, UpdateModemRoute_001, TestSize.Level1) EXPECT_NE(audioCoreService->pipeManager_->modemCommunicationIdMap_[0], nullptr); std::vector> modemDescs = audioCoreService->audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_VOICE_MODEM_COMMUNICATION, -1, ""); + audioCoreService->audioSceneManager_.audioScene_ = AUDIO_SCENE_PHONE_CALL; int32_t ret = audioCoreService->UpdateModemRoute(modemDescs); - audioCoreService->audioSceneManager_.audioScene_ = AUDIO_SCENE_DEFAULT; EXPECT_EQ(ret, SUCCESS); + + audioCoreService->needUnmuteVoiceCall_ = true; + ret = audioCoreService->UpdateModemRoute(modemDescs); + EXPECT_EQ(ret, SUCCESS); + + audioCoreService->audioSceneManager_.audioScene_ = AUDIO_SCENE_DEFAULT; } /** @@ -2285,6 +2291,39 @@ HWTEST_F(AudioCoreServicePrivateTest, UpdateModemRoute_002, TestSize.Level1) EXPECT_EQ(ret, SUCCESS); } +/** + * @tc.name : Test AudioCoreService. + * @tc.number: GetVoiceCallMuteDuration_001 + * @tc.desc : Test AudioCoreService::GetVoiceCallMuteDuration + */ +HWTEST_F(AudioCoreServicePrivateTest, GetVoiceCallMuteDuration_001, TestSize.Level1) +{ + auto audioCoreService = std::make_shared(); + ASSERT_NE(audioCoreService, nullptr); + + AudioDeviceDescriptor desc1(DeviceType::DEVICE_TYPE_EARPIECE, DeviceRole::OUTPUT_DEVICE); + AudioDeviceDescriptor desc2(DeviceType::DEVICE_TYPE_SPEAKER, DeviceRole::OUTPUT_DEVICE); + AudioDeviceDescriptor desc3(DeviceType::DEVICE_TYPE_USB_HEADSET, DeviceRole::OUTPUT_DEVICE); + AudioDeviceDescriptor desc4(DeviceType::DEVICE_TYPE_SPEAKER, DeviceRole::OUTPUT_DEVICE); + desc4.networkId_ = "LocalDevice"; + uint32_t targetMuteDuration = 100000; + + uint32_t muteDuration = audioCoreService->GetVoiceCallMuteDuration(desc1, desc1); + EXPECT_EQ(muteDuration, 0); + + muteDuration = audioCoreService->GetVoiceCallMuteDuration(desc1, desc2); + EXPECT_EQ(muteDuration, 0); + + muteDuration = audioCoreService->GetVoiceCallMuteDuration(desc1, desc3); + EXPECT_EQ(muteDuration, targetMuteDuration); + + muteDuration = audioCoreService->GetVoiceCallMuteDuration(desc3, desc1); + EXPECT_EQ(muteDuration, targetMuteDuration); + + muteDuration = audioCoreService->GetVoiceCallMuteDuration(desc1, desc4); + EXPECT_EQ(muteDuration, targetMuteDuration); +} + /** * @tc.name : Test AudioCoreService. * @tc.number: IsStreamSupportLowpower_001 -- Gitee