diff --git a/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h b/frameworks/native/audiodefinitions/include/audio_stream_descriptor.h index 620da276f7b0a5fac1ffbca863fd848dcdde81f6..49374c3d486caaaadc7fe120821f77eb7dbb9bf8 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 582d804d9c6ca95709f746615c1dd3605dd9364a..cd7c052843e853861b3514fbbf11a942df5077c3 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 69969bc7ebb0921151b8d051cc1ea89c4e7d9146..e4417897203dfbbd866dffecf116ef80381eb70f 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 405609cf4fa79c01658a36fc2526930ff124f452..4814d5a90959c75ada1d00a76591cc86bff0dd97 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 9515f906c209fc7f220d681b896fa77b4a678227..4f6194082e27fb985dc39ce416bc6caf40e3d4fb 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 d03717a52052943cfe91e6a84506b9c97b476374..a30d29f4e9848661619ebb6f7ef3c386b930df87 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,7 +184,7 @@ 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) @@ -194,15 +194,18 @@ HWTEST_F(AudioPipeManagerExtendedUnitTest, AudioPipeManager_008, TestSize.Level4 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; + int32_t routeFlagMask = AUDIO_INPUT_FLAG_NORMAL; + EXPECT_EQ(sPipeManager_->GetStreamIdsByUidAndPid(uid, pid).size(), 1); } /**