From 25946b564551f9c841c7f9b7715b476fc269913a Mon Sep 17 00:00:00 2001 From: zhanghuiming Date: Tue, 9 Sep 2025 08:10:47 +0000 Subject: [PATCH] release all streams when client die Signed-off-by: zhanghuiming Change-Id: I05c046c5e1dbd8b1c19bf80ad2c8877a764c75f1 --- .../include/audio_stream_descriptor.h | 5 ++++ .../audio_stream_descriptor_unit_test.cpp | 24 +++++++++++++++++++ .../domain/pipe/include/audio_pipe_manager.h | 2 +- .../domain/pipe/src/audio_pipe_manager.cpp | 5 ++-- .../service_main/src/audio_core_service.cpp | 16 ++++++------- .../src/audio_pipe_manager_extended_test.cpp | 11 +++++---- 6 files changed, 45 insertions(+), 18 deletions(-) diff --git a/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h b/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h index 620da276f7..49374c3d48 100644 --- a/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h +++ b/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h @@ -168,6 +168,11 @@ public: return (routeFlag_ & AUDIO_OUTPUT_FLAG_LOWPOWER); } + bool IsSamePidUid(int32_t uid, int32_t pid) const + { + return callerPid_ == pid && callerUid_ == uid; + } + bool IsNoRunningOffload() const { return IsRouteOffload() && !IsRunning(); diff --git a/frameworks/native/audiodefinitions/test/unittest/audio_stream_descriptor_unit_test.cpp b/frameworks/native/audiodefinitions/test/unittest/audio_stream_descriptor_unit_test.cpp index 582d804d9c..cd7c052843 100644 --- a/frameworks/native/audiodefinitions/test/unittest/audio_stream_descriptor_unit_test.cpp +++ b/frameworks/native/audiodefinitions/test/unittest/audio_stream_descriptor_unit_test.cpp @@ -272,5 +272,29 @@ HWTEST_F(AudioStreamDescriptorUnitTest, WriteDeviceDescVectorToParcel_001, TestS } +/** + * @tc.name : Test IsSamePidUid + * @tc.number : IsSamePidUid_001 + * @tc.desc : Test IsSamePidUid + */ +HWTEST_F(AudioStreamDescriptorUnitTest, IsSamePidUid_001, TestSize.Level1) +{ + AudioStreamDescriptor audioStreamDescriptor; + audioStreamDescriptor.callerUid_ = 1; + audioStreamDescriptor.callerPid_ = 1; + + bool ret = audioStreamDescriptor.IsSamePidUid(0, 0); + EXPECT_EQ(ret, false); + + ret = audioStreamDescriptor.IsSamePidUid(0, 1); + EXPECT_EQ(ret, false); + + ret = audioStreamDescriptor.IsSamePidUid(1, 0); + EXPECT_EQ(ret, false); + + ret = audioStreamDescriptor.IsSamePidUid(1, 1); + EXPECT_TRUE(ret); +} + } // namespace AudioStandard } // namespace OHOS \ No newline at end of file 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 69969bc7eb..e441789720 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 @@ -80,7 +80,7 @@ public: void UpdateModemStreamDevice(std::vector> &deviceDescs); bool IsModemStreamDeviceChanged(std::shared_ptr &deviceDescs); std::shared_ptr GetNormalSourceInfo(bool isEcFeatureEnable); - std::vector GetStreamIdsByUid(uint32_t uid, uint32_t routeFlagMask = UINT32_MAX); + std::vector GetStreamIdsByUidAndPid(int32_t uid, int32_t pid); void UpdateOutputStreamDescsByIoHandle(AudioIOHandle id, std::vector> &descs); std::vector> GetAllCapturerStreamDescs(); 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 405609cf4f..4814d5a909 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 @@ -514,16 +514,15 @@ std::shared_ptr AudioPipeManager::GetPipeByModuleAndFlag(const st return nullptr; } -std::vector AudioPipeManager::GetStreamIdsByUid(uint32_t uid, uint32_t routeFlagMask) +std::vector AudioPipeManager::GetStreamIdsByUidAndPid(int32_t uid, int32_t pid) { std::vector sessionIds = {}; std::shared_lock pLock(pipeListLock_); for (auto &pipe : curPipeList_) { CHECK_AND_CONTINUE_LOG(pipe != nullptr, "pipe is nullptr"); - CHECK_AND_CONTINUE_LOG(pipe->routeFlag_ & routeFlagMask, "not match flag: %{public}u", pipe->routeFlag_); for (auto &streamDesc : pipe->streamDescriptors_) { CHECK_AND_CONTINUE_LOG(streamDesc != nullptr, "streamDesc is nullptr"); - if (streamDesc->callerUid_ == static_cast(uid)) { + if (streamDesc->IsSamePidUid(uid, pid)) { sessionIds.push_back(streamDesc->sessionId_); } } 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 9515f906c2..4f6194082e 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 @@ -1025,19 +1025,17 @@ int32_t AudioCoreService::UpdateTracker(AudioMode &mode, AudioStreamChangeInfo & void AudioCoreService::RegisteredTrackerClientDied(pid_t uid, pid_t pid) { - UpdateDefaultOutputDeviceWhenStopping(static_cast(uid)); - UpdateInputDeviceWhenStopping(static_cast(uid)); + int32_t curUid = static_cast(uid); + int32_t curPid = static_cast(pid); + UpdateDefaultOutputDeviceWhenStopping(curUid); + UpdateInputDeviceWhenStopping(curUid); - audioMicrophoneDescriptor_.RemoveAudioCapturerMicrophoneDescriptor(static_cast(uid)); - streamCollector_.RegisteredTrackerClientDied(static_cast(uid), static_cast(pid)); + audioMicrophoneDescriptor_.RemoveAudioCapturerMicrophoneDescriptor(curUid); + streamCollector_.RegisteredTrackerClientDied(curUid, curPid); CHECK_AND_RETURN_LOG(pipeManager_ != nullptr, "pipeManager is nullptr"); - std::vector sessionIds = pipeManager_->GetStreamIdsByUid(uid, - (AUDIO_OUTPUT_FLAG_FAST | AUDIO_INPUT_FLAG_FAST)); + auto sessionIds = pipeManager_->GetStreamIdsByUidAndPid(curUid, curPid); for (auto sessionId : sessionIds) { ReleaseClient(sessionId); - } - sessionIds = pipeManager_->GetStreamIdsByUid(uid); - for (auto sessionId : sessionIds) { UnsetAudioRouteCallback(sessionId); } FetchOutputDeviceAndRoute("RegisteredTrackerClientDied"); diff --git a/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_extended_test.cpp b/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_extended_test.cpp index d03717a520..1655b7a5ff 100644 --- a/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_extended_test.cpp +++ b/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_extended_test.cpp @@ -184,25 +184,26 @@ HWTEST_F(AudioPipeManagerExtendedUnitTest, AudioPipeManager_007, TestSize.Level4 /** * @tc.name: AudioPipeManager_008 - * @tc.desc: Test AudioPipeManager GetStreamIdsByUid. + * @tc.desc: Test AudioPipeManager GetStreamIdsByUidAndPid. * @tc.type: FUNC */ HWTEST_F(AudioPipeManagerExtendedUnitTest, AudioPipeManager_008, TestSize.Level4) { auto pipeInfo = std::make_shared(); pipeInfo->moduleInfo_.name = PRIMARY_CLASS; - pipeInfo->routeFlag_ = AUDIO_INPUT_FLAG_NORMAL; auto streamDescriptor1 = std::make_shared(); streamDescriptor1->callerUid_ = 1; + streamDescriptor1->callerPid_ = 1; auto streamDescriptor2 = std::make_shared(); streamDescriptor2->callerUid_ = 2; + streamDescriptor2->callerPid_ = 2; pipeInfo->streamDescriptors_.push_back(streamDescriptor1); pipeInfo->streamDescriptors_.push_back(streamDescriptor2); sPipeManager_->AddAudioPipeInfo(pipeInfo); - uint32_t uid = 1; - uint32_t routeFlagMask = AUDIO_INPUT_FLAG_NORMAL; - EXPECT_EQ(sPipeManager_->GetStreamIdsByUid(uid).size(), 1); + int32_t uid = 1; + int32_t pid = 1; + EXPECT_EQ(sPipeManager_->GetStreamIdsByUidAndPid(uid, pid).size(), 1); } /** -- Gitee