From 2d3bc40595ec2b0a47597e8e96cfbceecf98b599 Mon Sep 17 00:00:00 2001 From: maohangyu <1027148132@qq.com> Date: Tue, 9 Sep 2025 20:49:18 +0800 Subject: [PATCH] fix device update when onrenderstatechange Signed-off-by: maohangyu <1027148132@qq.com> --- .../server/domain/stream/audio_stream_collector.cpp | 3 +++ .../server/domain/zone/include/audio_zone.h | 2 ++ .../server/domain/zone/include/audio_zone_service.h | 1 + .../server/domain/zone/src/audio_zone.cpp | 12 ++++++++++++ .../server/domain/zone/src/audio_zone_service.cpp | 11 +++++++++++ .../service/service_main/src/audio_core_service.cpp | 2 ++ 6 files changed, 31 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 ad46a0504d..b46314dd35 100644 --- a/services/audio_policy/server/domain/stream/audio_stream_collector.cpp +++ b/services/audio_policy/server/domain/stream/audio_stream_collector.cpp @@ -23,6 +23,7 @@ #include "audio_volume_manager.h" #include "media_monitor_manager.h" +#include "audio_zone_service.h" #include namespace OHOS { @@ -588,6 +589,8 @@ int32_t AudioStreamCollector::UpdateRendererDeviceInfo(AudioDeviceDescriptor &ou if (!(*it)->outputDeviceInfo.IsSameDeviceInfo(outputDeviceInfo)) { AUDIO_DEBUG_LOG("UpdateRendererDeviceInfo: old device: %{public}d new device: %{public}d", (*it)->outputDeviceInfo.deviceType_, outputDeviceInfo.deviceType_); + CHECK_AND_CONTINUE_LOG(!AudioZoneService::GetInstance().CheckDeviceInAudioZone( + (*it)->outputDeviceInfo), "skip callback when device in zone"); (*it)->outputDeviceInfo = outputDeviceInfo; deviceInfoUpdated = true; } diff --git a/services/audio_policy/server/domain/zone/include/audio_zone.h b/services/audio_policy/server/domain/zone/include/audio_zone.h index e08d4d991e..81d481b7ce 100644 --- a/services/audio_policy/server/domain/zone/include/audio_zone.h +++ b/services/audio_policy/server/domain/zone/include/audio_zone.h @@ -97,6 +97,8 @@ public: pid_t GetClientPid(); + bool CheckDeviceInZone(AudioDeviceDescriptor device); + private: int32_t zoneId_ = -1; std::string name_ = ""; diff --git a/services/audio_policy/server/domain/zone/include/audio_zone_service.h b/services/audio_policy/server/domain/zone/include/audio_zone_service.h index 1c0f24e878..c5f314a135 100644 --- a/services/audio_policy/server/domain/zone/include/audio_zone_service.h +++ b/services/audio_policy/server/domain/zone/include/audio_zone_service.h @@ -94,6 +94,7 @@ public: int32_t FindAudioSessionZoneid(int32_t callerUid, int32_t callerPid, bool isActivate); void ReleaseAudioZoneByClientPid(pid_t clientPid); + bool CheckDeviceInAudioZone(AudioDeviceDescriptor device); private: AudioZoneService() = default; diff --git a/services/audio_policy/server/domain/zone/src/audio_zone.cpp b/services/audio_policy/server/domain/zone/src/audio_zone.cpp index ff1383bc22..092f0cc7c6 100644 --- a/services/audio_policy/server/domain/zone/src/audio_zone.cpp +++ b/services/audio_policy/server/domain/zone/src/audio_zone.cpp @@ -485,5 +485,17 @@ pid_t AudioZone::GetClientPid() { return zoneClientPid_; } + +bool AudioZone::CheckDeviceInZone(AudioDeviceDescriptor device) +{ + std::lock_guard lock(zoneMutex_); + for (const auto &it : devices_) { + if (it.second && it.first->deviceType_ == device.deviceType_ && + it.first->networkId_ == device.networkId_) { + return true; + } + } + return false; +} } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_policy/server/domain/zone/src/audio_zone_service.cpp b/services/audio_policy/server/domain/zone/src/audio_zone_service.cpp index 045a0d30af..7499d108de 100644 --- a/services/audio_policy/server/domain/zone/src/audio_zone_service.cpp +++ b/services/audio_policy/server/domain/zone/src/audio_zone_service.cpp @@ -717,5 +717,16 @@ void AudioZoneService::ReleaseAudioZoneByClientPid(pid_t clientPid) AUDIO_INFO_LOG("client %{public}d died, release zone %{public}d", clientPid, zoneId); ReleaseAudioZone(zoneId); } + +bool AudioZoneService::CheckDeviceInAudioZone(AudioDeviceDescriptor device) +{ + std::lock_guard lock(zoneMutex_); + for (auto &it : zoneMaps_) { + if (it.second->CheckDeviceInZone(device)) { + return true; + } + } + return false; +} } // namespace AudioStandard } // namespace OHOS \ No newline at end of file diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp index 97445d6da7..0c8871056b 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service.cpp @@ -885,6 +885,8 @@ int32_t AudioCoreService::GetCurrentRendererChangeInfos(vectoroutputDeviceInfo), "skip callback when device in zone"); audioDeviceCommon_.UpdateDeviceInfo(audioRendererChangeInfos[i]->outputDeviceInfo, *itr, hasBTPermission, hasSystemPermission); } -- Gitee