From ac1715dc1310734d6c86b9e1ea31810a84ee0c42 Mon Sep 17 00:00:00 2001 From: linhao Date: Mon, 8 Sep 2025 20:51:09 +0800 Subject: [PATCH] Fix audio noise issue when answering an incoming call with headphones connected. Signed-off-by: linhao --- .../domain/stream/audio_stream_collector.cpp | 13 +++++ .../domain/stream/audio_stream_collector.h | 1 + .../service_main/include/audio_core_service.h | 1 + .../src/audio_core_service_private.cpp | 17 ++++++ .../audio_core_service_private_unit_test.cpp | 52 +++++++++++++++++++ .../src/audio_stream_collector_unit_test.cpp | 22 ++++++++ 6 files changed, 106 insertions(+) diff --git a/services/audio_policy/server/domain/stream/audio_stream_collector.cpp b/services/audio_policy/server/domain/stream/audio_stream_collector.cpp index 45b35e52a9..fba51c13e6 100644 --- a/services/audio_policy/server/domain/stream/audio_stream_collector.cpp +++ b/services/audio_policy/server/domain/stream/audio_stream_collector.cpp @@ -1809,5 +1809,18 @@ bool AudioStreamCollector::IsVoipStreamActive() } return false; } + +bool AudioStreamCollector::IsStreamRunning(StreamUsage streamUsage) +{ + std::lock_guard lock(streamsInfoMutex_); + for (auto &changeInfo: audioRendererChangeInfos_) { + if (changeInfo != nullptr && + ((changeInfo->rendererInfo).streamUsage == streamUsage && + changeInfo->rendererState == RENDERER_RUNNING)) { + return true; + } + } + return false; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/domain/stream/audio_stream_collector.h b/services/audio_policy/server/domain/stream/audio_stream_collector.h index 1713886c13..fb8834e2f8 100644 --- a/services/audio_policy/server/domain/stream/audio_stream_collector.h +++ b/services/audio_policy/server/domain/stream/audio_stream_collector.h @@ -102,6 +102,7 @@ public: bool HasRunningNormalCapturerStream(DeviceType type); bool IsMediaPlaying(); bool IsVoipStreamActive(); + bool IsStreamRunning(StreamUsage streamUsage); void UpdateAppVolume(int32_t appUid, int32_t volume); private: 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 d9f6627d56..fa1dc506ed 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 @@ -457,6 +457,7 @@ private: bool &isNeedTriggerCallback, std::string &oldSinkName, const AudioStreamDeviceChangeReasonExt reason); void MuteSinkPortForSwitchDevice(std::shared_ptr &streamDesc, const AudioStreamDeviceChangeReasonExt reason); + void CheckAndSleepBeforeVoiceCallDeviceSet(const AudioStreamDeviceChangeReasonExt reason); void CheckAndSleepBeforeRingDualDeviceSet(std::shared_ptr &streamDesc, const AudioStreamDeviceChangeReasonExt reason); void SleepForSwitchDevice(std::shared_ptr &streamDesc, 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 89c34cb796..705fdcb612 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 @@ -66,6 +66,7 @@ static const uint32_t OLD_DEVICE_UNAVAILABLE_EXTRA_SLEEP_US = 150000; // 150ms static const uint32_t DISTRIBUTED_DEVICE_UNAVAILABLE_EXTRA_SLEEP_US = 350000; // 350ms static const uint32_t HEADSET_TO_SPK_EP_EXTRA_SLEEP_US = 50000; // 50ms static const uint32_t MEDIA_PAUSE_TO_DOUBLE_RING_DELAY_US = 120000; // 120ms +static const uint32_t VOICE_CALL_DEVICE_SET_DELAY_US = 120000; // 120ms static const uint32_t BT_BUFFER_ADJUSTMENT_FACTOR = 50; static const int32_t WAIT_OFFLOAD_CLOSE_TIME_SEC = 10; @@ -328,6 +329,7 @@ void AudioCoreService::CheckModemScene(std::vectordeviceType_); + CheckAndSleepBeforeVoiceCallDeviceSet(reason); } int32_t AudioCoreService::UpdateModemRoute(std::vector> &descs) @@ -2476,6 +2478,21 @@ void AudioCoreService::MuteSinkPortForSwitchDevice(std::shared_ptraudioIOHandleMap_.SetMoveFinish(false); } +/** + * @tc.name : Test AudioCoreService. + * @tc.number: CheckAndSleepBeforeVoiceCallDeviceSet_001 + * @tc.desc : Test AudioCoreService::CheckAndSleepBeforeVoiceCallDeviceSet() + */ +HWTEST_F(AudioCoreServicePrivateTest, CheckAndSleepBeforeVoiceCallDeviceSet_001, TestSize.Level1) +{ + auto audioCoreService = std::make_shared(); + ASSERT_NE(audioCoreService, nullptr); + + // Test1 + AudioStreamDeviceChangeReasonExt reason(AudioStreamDeviceChangeReasonExt::ExtEnum::UNKNOWN); + + auto start = std::chrono::steady_clock::now(); + audioCoreService->CheckAndSleepBeforeVoiceCallDeviceSet(reason); + auto end = std::chrono::steady_clock::now(); + auto duration = std::chrono::duration_cast(end - start).count(); + + uint32_t deltaUs = 3000; // 3ms + EXPECT_LE(duration, deltaUs); + + // Test2 + reason = AudioStreamDeviceChangeReasonExt::ExtEnum::SET_AUDIO_SCENE; + auto info = std::make_shared(); + info->rendererInfo.streamUsage = STREAM_USAGE_MUSIC; + info->rendererState = RENDERER_RUNNING; + audioCoreService->streamCollector_.audioRendererChangeInfos_.push_back(info); + + start = std::chrono::steady_clock::now(); + audioCoreService->CheckAndSleepBeforeVoiceCallDeviceSet(streamDesc, reason); + end = std::chrono::steady_clock::now(); + duration = std::chrono::duration_cast(end - start).count(); + + EXPECT_LE(duration, deltaUs); + + audioCoreService->streamCollector_.audioRendererChangeInfos_.clear(); + + // Test3 + info->rendererInfo.streamUsage = STREAM_USAGE_VOICE_RINGTONE; + audioCoreService->streamCollector_.audioRendererChangeInfos_.push_back(info); + + start = std::chrono::steady_clock::now(); + audioCoreService->CheckAndSleepBeforeVoiceCallDeviceSet(streamDesc, reason); + end = std::chrono::steady_clock::now(); + duration = std::chrono::duration_cast(end - start).count(); + + uint32_t targetTime = 120000; //120ms + EXPECT_GE(duration, targetTime); + + audioCoreService->streamCollector_.audioRendererChangeInfos_.clear(); +} + /** * @tc.name : Test AudioCoreService. * @tc.number: CheckAndSleepBeforeRingDualDeviceSet_001 diff --git a/services/audio_policy/test/unittest/audio_stream_collector_unit_test/src/audio_stream_collector_unit_test.cpp b/services/audio_policy/test/unittest/audio_stream_collector_unit_test/src/audio_stream_collector_unit_test.cpp index 6e551e3c18..f10395388c 100644 --- a/services/audio_policy/test/unittest/audio_stream_collector_unit_test/src/audio_stream_collector_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_stream_collector_unit_test/src/audio_stream_collector_unit_test.cpp @@ -1412,6 +1412,28 @@ HWTEST_F(AudioStreamCollectorUnitTest, IsMediaPlaying_Test01, TestSize.Level1) EXPECT_TRUE(result); } +/** +* @tc.name : Test AudioStreamCollector +* @tc.number: IsStreamRunning_001 +* @tc.desc : Test IsStreamRunning(). +*/ +HWTEST_F(AudioStreamCollectorUnitTest, IsStreamRunning_001, TestSize.Level4) +{ + AudioStreamCollector collector; + auto rendererChangeInfo1 = make_shared(); + rendererChangeInfo1->rendererState = RENDERER_RUNNING; + rendererChangeInfo1->rendererInfo.streamUsage = STREAM_USAGE_VOICE_RINGTONE; + collector.audioRendererChangeInfos_.push_back(rendererChangeInfo1); + auto rendererChangeInfo2 = make_shared(); + rendererChangeInfo2->rendererState = RENDERER_NEW; + rendererChangeInfo2->rendererInfo.streamUsage = STREAM_USAGE_VOICE_COMMUNICATION; + collector.audioRendererChangeInfos_.push_back(rendererChangeInfo2); + + EXPECT_FALSE(collector.IsStreamRunning(STREAM_USAGE_MUSIC)); + EXPECT_TRUE(collector.IsStreamRunning(STREAM_USAGE_VOICE_RINGTONE)); + EXPECT_FALSE(collector.IsStreamRunning(STREAM_USAGE_VOICE_COMMUNICATION)); +} + /** * @tc.name : Test AudioStreamCollector. * @tc.number: UpdateRenderDeviceInfo_001 -- Gitee