From 744c2ccb50a14ca60aadf735187b5ffb483e85eb Mon Sep 17 00:00:00 2001 From: 30079671 Date: Thu, 4 Sep 2025 19:49:09 +0800 Subject: [PATCH] fix bug Signed-off-by: 30079671 --- .../include/audio_policy_manager.h | 2 ++ .../include/audio_system_manager.h | 6 ++++ .../service/src/audio_policy_manager.cpp | 34 ++++++++++++++++--- .../client/src/audio_system_manager.cpp | 5 +++ 4 files changed, 43 insertions(+), 4 deletions(-) diff --git a/frameworks/native/audiopolicy/include/audio_policy_manager.h b/frameworks/native/audiopolicy/include/audio_policy_manager.h index c02ab69db6..e40346153e 100644 --- a/frameworks/native/audiopolicy/include/audio_policy_manager.h +++ b/frameworks/native/audiopolicy/include/audio_policy_manager.h @@ -150,6 +150,8 @@ public: int32_t SetRingerMode(AudioRingerMode ringMode); + void CleanUpResource(); + #ifdef FEATURE_DTMF_TONE std::vector GetSupportedTones(const std::string &countryCode); diff --git a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h index e012cff222..021ddb5fb7 100644 --- a/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h +++ b/interfaces/inner_api/native/audiomanager/include/audio_system_manager.h @@ -1490,6 +1490,12 @@ public: */ int32_t GetVolumeBySessionId(const uint32_t &sessionId, float &volume); + /** + * @brief clean resouce. + * @test + */ + void CleanUpResource(); + class WorkgroupPrioRecorder { public: WorkgroupPrioRecorder(int32_t grpId); diff --git a/services/audio_policy/client/service/src/audio_policy_manager.cpp b/services/audio_policy/client/service/src/audio_policy_manager.cpp index 61cbb8c96a..8292a61717 100644 --- a/services/audio_policy/client/service/src/audio_policy_manager.cpp +++ b/services/audio_policy/client/service/src/audio_policy_manager.cpp @@ -51,17 +51,19 @@ std::unordered_map> AudioPolicy std::weak_ptr AudioPolicyManager::audioSessionManagerCb_; std::mutex AudioPolicyManager::serverDiedSessionManagerCbkMutex_; +sptr g_deathRecipient = nullptr; static bool RegisterDeathRecipientInner(sptr object) { + CHECK_AND_RETURN_RET_LOG(object != nullptr, false, "Object is NULL."); pid_t pid = 0; pid_t uid = 0; - sptr deathRecipient = new(std::nothrow) AudioServerDeathRecipient(pid, uid); - CHECK_AND_RETURN_RET(deathRecipient != nullptr, false); - deathRecipient->SetNotifyCb( + g_deathRecipient = new(std::nothrow) AudioServerDeathRecipient(pid, uid); + CHECK_AND_RETURN_RET(g_deathRecipient != nullptr, false); + g_deathRecipient->SetNotifyCb( [] (pid_t pid, pid_t uid) { AudioPolicyManager::AudioPolicyServerDied(pid, uid); }); AUDIO_DEBUG_LOG("Register audio policy server death recipient"); - CHECK_AND_RETURN_RET_LOG(object->AddDeathRecipient(deathRecipient), false, "AddDeathRecipient failed"); + CHECK_AND_RETURN_RET_LOG(object->AddDeathRecipient(g_deathRecipient), false, "AddDeathRecipient failed"); return true; } @@ -103,6 +105,30 @@ const sptr AudioPolicyManager::GetAudioPolicyManagerProxy(bool blo return gsp; } +void AudioPolicyManager::CleanUpResource() +{ + lock_guard lock(g_apProxyMutex); + + if (g_apProxy == nullptr) { + AUDIO_INFO_LOG("g_apProxy is null."); + return; + } + + sptr object = g_apProxy->AsObject(); + if (object == nullptr) { + AUDIO_INFO_LOG("object is null."); + return; + } + + if (g_deathRecipient != nullptr) { + AUDIO_INFO_LOG("Remove DeathRecipient Success."); + object->RemoveDeathRecipient(g_deathRecipient); + g_deathRecipient = nullptr; + } + g_apProxy = nullptr; + AUDIO_INFO_LOG("Remove DeathRecipient end."); +} + static const sptr RecoverAndGetAudioPolicyManagerProxy() { AUDIO_DEBUG_LOG("In"); diff --git a/services/audio_service/client/src/audio_system_manager.cpp b/services/audio_service/client/src/audio_system_manager.cpp index 57974f85fd..2449102dd5 100644 --- a/services/audio_service/client/src/audio_system_manager.cpp +++ b/services/audio_service/client/src/audio_system_manager.cpp @@ -2608,5 +2608,10 @@ int32_t AudioSystemManager::GetVolumeBySessionId(const uint32_t &sessionId, floa CHECK_AND_RETURN_RET_LOG(ret == SUCCESS, ret, "failed: %{public}d", ret); return ret; } + +void AudioSystemManager::CleanUpResource() +{ + AudioPolicyManager::GetInstance().CleanUpResource(); +} } // namespace AudioStandard } // namespace OHOS -- Gitee