From 7898a2a8c11a35d51439afd8b7a951f3f42570c2 Mon Sep 17 00:00:00 2001 From: zhanglong Date: Mon, 1 Sep 2025 16:56:10 +0800 Subject: [PATCH] set nearlink device volume bug fix Signed-off-by: zhanglong --- .../server/domain/pipe/include/audio_pipe_manager.h | 1 + .../server/domain/pipe/src/audio_pipe_manager.cpp | 12 ++++++++++++ .../domain/volume/src/audio_volume_manager.cpp | 1 + .../service_main/include/audio_core_service_utils.h | 3 ++- .../service_main/src/audio_core_service_private.cpp | 4 ++-- .../service_main/src/audio_core_service_utils.cpp | 10 +++++----- .../src/audio_core_service_utils_unit_test.cpp | 5 ++--- 7 files changed, 25 insertions(+), 11 deletions(-) diff --git a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h index 170c0ec86e..6a0c2ee88b 100644 --- a/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h +++ b/services/audio_policy/server/domain/pipe/include/audio_pipe_manager.h @@ -85,6 +85,7 @@ public: std::vector> GetAllCapturerStreamDescs(); std::shared_ptr FindPipeBySessionId(const std::vector> &pipeList, uint32_t sessionId); + bool IsStreamUsageActive(const StreamUsage &usage); private: bool IsSpecialPipe(uint32_t routeFlag); diff --git a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp index 1855f1366e..3eca284de5 100644 --- a/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp +++ b/services/audio_policy/server/domain/pipe/src/audio_pipe_manager.cpp @@ -578,5 +578,17 @@ std::shared_ptr AudioPipeManager::FindPipeBySessionId( } return std::shared_ptr(); } + +bool AudioPipeManager::IsStreamUsageActive(const StreamUsage &usage) +{ + std::vector outputDescs = GetAllOutputStreamDescs(); + for (auto &desc : outputDescs) { + CHECK_AND_CONTINUE_LOG(desc != nullptr, "desc is null"); + if (desc->rendererInfo_.streamUsage == usage && desc->streamStatus_ == STREAM_STATUS_STARTED) { + return true; + } + } + return false; +} } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/domain/volume/src/audio_volume_manager.cpp b/services/audio_policy/server/domain/volume/src/audio_volume_manager.cpp index 1d5cbccf08..f6d1222e26 100644 --- a/services/audio_policy/server/domain/volume/src/audio_volume_manager.cpp +++ b/services/audio_policy/server/domain/volume/src/audio_volume_manager.cpp @@ -306,6 +306,7 @@ bool AudioVolumeManager::DeviceIsSupportSafeVolume() return true; } [[fallthrough]]; + case DEVICE_TYPE_NEARLINK: case DEVICE_TYPE_WIRED_HEADSET: case DEVICE_TYPE_WIRED_HEADPHONES: case DEVICE_TYPE_USB_HEADSET: diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service_utils.h b/services/audio_policy/server/service/service_main/include/audio_core_service_utils.h index 0884e84407..bd549257ec 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service_utils.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service_utils.h @@ -24,6 +24,7 @@ #include "audio_device_descriptor.h" #include "audio_info.h" #include "audio_stream_descriptor.h" +#include "audio_pipe_manager.h" #include "audio_policy_utils.h" #include "audio_module_info.h" @@ -38,7 +39,7 @@ public: const int32_t sessionId); static bool NeedDualHalToneInStatus(AudioRingerMode mode, StreamUsage usage, bool isPcVolumeEnable, bool isMusicMute); - static bool IsAlarmOnActive(StreamUsage usage, bool isAlarmActive); + static bool IsDualOnActive(); }; } } 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..d52657a680 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 @@ -2372,8 +2372,7 @@ void AudioCoreService::UpdateTracker(AudioMode &mode, AudioStreamChangeInfo &str if (isRingDualToneOnPrimarySpeaker_ && AudioCoreServiceUtils::IsOverRunPlayback(mode, rendererState) && Util::IsRingerOrAlarmerStreamUsage(streamUsage)) { - CHECK_AND_RETURN_LOG(!AudioCoreServiceUtils::IsAlarmOnActive(streamUsage, - streamCollector_.IsStreamActive(AudioVolumeType::STREAM_ALARM)), "alarm still on active"); + CHECK_AND_RETURN_LOG(!AudioCoreServiceUtils::IsDualOnActive(), "Dual still on active"); AUDIO_INFO_LOG("[ADeviceEvent] disable primary speaker dual tone when ringer renderer run over"); isRingDualToneOnPrimarySpeaker_ = false; // Add delay between end of double ringtone and device switch. @@ -2381,6 +2380,7 @@ void AudioCoreService::UpdateTracker(AudioMode &mode, AudioStreamChangeInfo &str // Switching the device immediately can cause pop noise due the undrained buffers. usleep(RING_DUAL_END_DELAY_US); FetchOutputDeviceAndRoute("UpdateTracker_2"); + CHECK_AND_RETURN_LOG(!isRingDualToneOnPrimarySpeaker_, "no need to execute SetInnerStreamMute false"); for (std::pair stream : streamsWhenRingDualOnPrimarySpeaker_) { audioPolicyManager_.SetInnerStreamMute(stream.first, false, stream.second); } diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_utils.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_utils.cpp index a4b700d81c..ab39be8c54 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_utils.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_utils.cpp @@ -81,12 +81,12 @@ bool AudioCoreServiceUtils::NeedDualHalToneInStatus(AudioRingerMode mode, Stream return true; } -bool AudioCoreServiceUtils::IsAlarmOnActive(StreamUsage usage, bool isAlarmActive) +bool AudioCoreServiceUtils::IsDualOnActive() { - if (usage != STREAM_USAGE_ALARM) { - return false; - } - return isAlarmActive; + std::shared_ptr pipeManager = AudioPipeManager::GetPipeManager(); + return pipeManager->IsStreamUsageActive(STREAM_USAGE_ALARM) || + pipeManager->IsStreamUsageActive(STREAM_USAGE_VOICE_RINGTONE) || + pipeManager->IsStreamUsageActive(STREAM_USAGE_RINGTONE); } } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/test/unittest/audio_core_service_utils_unit_test/src/audio_core_service_utils_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_utils_unit_test/src/audio_core_service_utils_unit_test.cpp index 558b50a789..f704b69c59 100644 --- a/services/audio_policy/test/unittest/audio_core_service_utils_unit_test/src/audio_core_service_utils_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_utils_unit_test/src/audio_core_service_utils_unit_test.cpp @@ -116,12 +116,11 @@ HWTEST(AudioCoreServiceUtilsTest, AudioCoreServiceUtils_004, TestSize.Level1) /** * @tc.name : Test AudioCoreServiceUtils. * @tc.number: AudioCoreServiceUtils_005 - * @tc.desc : Test AudioCoreServiceUtils::IsAlarmOnActive() + * @tc.desc : Test AudioCoreServiceUtils::IsDualOnActive() */ HWTEST(AudioCoreServiceUtilsTest, AudioCoreServiceUtils_005, TestSize.Level1) { - EXPECT_TRUE(AudioCoreServiceUtils::IsAlarmOnActive(STREAM_USAGE_ALARM, true)); - EXPECT_FALSE(AudioCoreServiceUtils::IsAlarmOnActive(STREAM_USAGE_MUSIC, true)); + EXPECT_FALSE(AudioCoreServiceUtils::IsDualOnActive()); } } // namespace AudioStandard } // namespace OHOS -- Gitee