From d67d0c30f646bd48bd510073cbee17245da59c36 Mon Sep 17 00:00:00 2001 From: fuxiuwsz Date: Fri, 12 Sep 2025 10:19:59 +0800 Subject: [PATCH] fix audio session bugs Signed-off-by: fuxiuwsz --- .../device/include/audio_device_manager.h | 2 ++ .../device/src/audio_device_manager.cpp | 28 ++++++++++++++++++ .../domain/session/include/audio_session.h | 5 +--- .../domain/session/src/audio_session.cpp | 29 +++++-------------- .../src/audio_session_new_unit_test.cpp | 14 +-------- .../src/audio_policy_server_handler.cpp | 4 +-- .../src/audio_session_unit_test.cpp | 21 ++++++++++---- .../audio_session_fuzzer.cpp | 22 +------------- 8 files changed, 58 insertions(+), 67 deletions(-) diff --git a/services/audio_policy/server/domain/device/include/audio_device_manager.h b/services/audio_policy/server/domain/device/include/audio_device_manager.h index ecce90d886..5a63560517 100644 --- a/services/audio_policy/server/domain/device/include/audio_device_manager.h +++ b/services/audio_policy/server/domain/device/include/audio_device_manager.h @@ -108,6 +108,7 @@ public: bool ExistSameRemoteDeviceByMacAddress(std::shared_ptr desc); shared_ptr GetActiveScoDevice(std::string scoMac, DeviceRole role); std::shared_ptr GetExistedDevice(const std::shared_ptr &device); + AudioDevicePrivacyType GetDevicePrivacyType(const shared_ptr &devDesc); private: AudioDeviceManager(); @@ -166,6 +167,7 @@ private: AudioStreamDeviceChangeReasonExt UpdateDeviceUsage(const shared_ptr &deviceDesc); void RemoveVirtualConnectedDevice(const shared_ptr &devDesc); + bool IsDescMatchedInVector(const shared_ptr &devDesc, list &deviceList); list privacyDeviceList_; list publicDeviceList_; diff --git a/services/audio_policy/server/domain/device/src/audio_device_manager.cpp b/services/audio_policy/server/domain/device/src/audio_device_manager.cpp index 76aef69e3b..c3f02fd42f 100644 --- a/services/audio_policy/server/domain/device/src/audio_device_manager.cpp +++ b/services/audio_policy/server/domain/device/src/audio_device_manager.cpp @@ -129,6 +129,34 @@ bool AudioDeviceManager::DeviceAttrMatch(const shared_ptr return false; } +bool AudioDeviceManager::IsDescMatchedInVector(const shared_ptr &devDesc, + list &deviceList) +{ + for (auto &devInfo : deviceList) { + if ((devInfo.deviceType == devDesc->deviceType_) && + (devInfo.deviceUsage & devDesc->deviceUsage_) && + ((devInfo.deviceCategory == devDesc->deviceCategory_) || + (devInfo.deviceCategory & devDesc->deviceCategory_) != 0)) { + return true; + } + } + + return false; +} + +AudioDevicePrivacyType AudioDeviceManager::GetDevicePrivacyType(const shared_ptr &devDesc) +{ + if (IsDescMatchedInVector(devDesc, privacyDeviceList_)) { + return AudioDevicePrivacyType::TYPE_PRIVACY; + } + + if (IsDescMatchedInVector(devDesc, publicDeviceList_)) { + return AudioDevicePrivacyType::TYPE_PUBLIC; + } + + return AudioDevicePrivacyType::TYPE_NEGATIVE; +} + void AudioDeviceManager::FillArrayWhenDeviceAttrMatch(const shared_ptr &devDesc, AudioDevicePrivacyType privacyType, DeviceRole devRole, DeviceUsage devUsage, string logName, vector> &descArray) diff --git a/services/audio_policy/server/domain/session/include/audio_session.h b/services/audio_policy/server/domain/session/include/audio_session.h index 8a103fe0ff..edae81db09 100644 --- a/services/audio_policy/server/domain/session/include/audio_session.h +++ b/services/audio_policy/server/domain/session/include/audio_session.h @@ -64,7 +64,7 @@ public: void GetSessionDefaultOutputDevice(DeviceType &deviceType); bool IsStreamContainedInCurrentSession(const uint32_t &streamId); bool GetAndClearNeedToFetchFlag(); - bool IsRecommendToStopAudio(const std::shared_ptr eventContextObj); + bool IsRecommendToStopAudio(const std::shared_ptr desc); bool IsSessionOutputDeviceChanged(const std::shared_ptr deviceDescriptor); bool IsSessionInputDeviceChanged(const std::shared_ptr deviceDescriptor); StreamUsage GetSessionStreamUsage(); @@ -73,9 +73,6 @@ public: private: StreamUsage GetStreamUsageInner(); bool IsLegalDevice(const DeviceType deviceType); - bool IsCurrentDevicePrivateDevice(const std::shared_ptr desc); - bool IsDeviceContainedInVector(std::vector> devices, - const std::shared_ptr desc); void UpdateVoipStreamsDefaultOutputDevice(); bool CanCurrentStreamSetDefaultOutputDevice(const AudioInterrupt &interrupt); int32_t EnableSingleVoipStreamDefaultOutputDevice(const AudioInterrupt &interrupt); diff --git a/services/audio_policy/server/domain/session/src/audio_session.cpp b/services/audio_policy/server/domain/session/src/audio_session.cpp index fa68bee7b7..2c0171c7fa 100644 --- a/services/audio_policy/server/domain/session/src/audio_session.cpp +++ b/services/audio_policy/server/domain/session/src/audio_session.cpp @@ -450,44 +450,31 @@ bool AudioSession::IsStreamContainedInCurrentSession(const uint32_t &streamId) return false; } -bool AudioSession::IsDeviceContainedInVector(std::vector> devices, - const std::shared_ptr desc) -{ - return std::find(devices.begin(), devices.end(), desc) != devices.end(); -} - -bool AudioSession::IsCurrentDevicePrivateDevice(const std::shared_ptr desc) -{ - return IsDeviceContainedInVector(deviceManager_.GetCommRenderPrivacyDevices(), desc) || - IsDeviceContainedInVector(deviceManager_.GetMediaRenderPrivacyDevices(), desc); -} - -bool AudioSession::IsRecommendToStopAudio( - const std::shared_ptr eventContextObj) +bool AudioSession::IsRecommendToStopAudio(const std::shared_ptr desc) { bool ret = false; - if ((eventContextObj == nullptr) || (eventContextObj->reason_ == AudioStreamDeviceChangeReason::OVERRODE) || - (eventContextObj->descriptor == nullptr)) { + if (desc == nullptr) { return ret; } std::lock_guard lock(sessionMutex_); - if (IsCurrentDevicePrivateDevice(std::make_shared(deviceDescriptor_)) && - (!IsCurrentDevicePrivateDevice(eventContextObj->descriptor))) { + if ((deviceManager_.GetDevicePrivacyType(std::make_shared(deviceDescriptor_)) == + AudioDevicePrivacyType::TYPE_PRIVACY) && (deviceManager_.GetDevicePrivacyType(desc) != + AudioDevicePrivacyType::TYPE_PRIVACY)) { ret = true; } - deviceDescriptor_ = AudioDeviceDescriptor(eventContextObj->descriptor); + deviceDescriptor_ = AudioDeviceDescriptor(desc); return ret; } bool AudioSession::IsSessionOutputDeviceChanged(const std::shared_ptr desc) { std::lock_guard lock(sessionMutex_); - CHECK_AND_RETURN_RET_LOG(desc != nullptr, true, "input device desc is nullptr"); - return deviceDescriptor_.IsSameDeviceDescPtr(desc); + CHECK_AND_RETURN_RET_LOG(desc != nullptr, false, "input device desc is nullptr"); + return !deviceDescriptor_.IsSameDeviceDescPtr(desc); } bool AudioSession::IsSessionInputDeviceChanged(const std::shared_ptr desc) diff --git a/services/audio_policy/server/domain/session/test/unittest/audio_session_new_unit_test/src/audio_session_new_unit_test.cpp b/services/audio_policy/server/domain/session/test/unittest/audio_session_new_unit_test/src/audio_session_new_unit_test.cpp index d9b697098c..11936e5aa9 100644 --- a/services/audio_policy/server/domain/session/test/unittest/audio_session_new_unit_test/src/audio_session_new_unit_test.cpp +++ b/services/audio_policy/server/domain/session/test/unittest/audio_session_new_unit_test/src/audio_session_new_unit_test.cpp @@ -270,19 +270,7 @@ HWTEST_F(AudioSessionNewUnitTest, IsRecommendToStopAudio_001, TestSize.Level1) EXPECT_FALSE(audioSession->IsRecommendToStopAudio(nullptr)); - auto eventContextObj = std::make_shared(); - - eventContextObj->reason_ = AudioStreamDeviceChangeReason::OVERRODE; - eventContextObj->descriptor = validDescriptor; - EXPECT_FALSE(audioSession->IsRecommendToStopAudio(eventContextObj)); - - eventContextObj->reason_ = AudioStreamDeviceChangeReason::UNKNOWN; - eventContextObj->descriptor = nullptr; - EXPECT_FALSE(audioSession->IsRecommendToStopAudio(eventContextObj)); - - eventContextObj->reason_ = AudioStreamDeviceChangeReason::NEW_DEVICE_AVAILABLE; - eventContextObj->descriptor = validDescriptor; - EXPECT_FALSE(audioSession->IsRecommendToStopAudio(eventContextObj)); + EXPECT_FALSE(audioSession->IsRecommendToStopAudio(validDescriptor)); } } // namespace AudioStandard diff --git a/services/audio_policy/server/infra/async_action_handler/src/audio_policy_server_handler.cpp b/services/audio_policy/server/infra/async_action_handler/src/audio_policy_server_handler.cpp index 58e59c4ec5..a4f9308efb 100644 --- a/services/audio_policy/server/infra/async_action_handler/src/audio_policy_server_handler.cpp +++ b/services/audio_policy/server/infra/async_action_handler/src/audio_policy_server_handler.cpp @@ -1192,12 +1192,12 @@ void AudioPolicyServerHandler::HandleAudioSessionDeviceChangeEvent(const AppExec CHECK_AND_CONTINUE_LOG((deviceChangedEvent.devices.size() > 0) && (deviceChangedEvent.devices[0] != nullptr), "get invalid preferred output devices list"); - CHECK_AND_CONTINUE_LOG((!audioSession->IsSessionOutputDeviceChanged(deviceChangedEvent.devices[0]) || + CHECK_AND_CONTINUE_LOG((audioSession->IsSessionOutputDeviceChanged(deviceChangedEvent.devices[0]) || (eventContextObj->reason_ == AudioStreamDeviceChangeReason::AUDIO_SESSION_ACTIVATE)), "device of session %{public}d is not changed", it->first); deviceChangedEvent.changeReason = eventContextObj->reason_; - deviceChangedEvent.recommendedAction = audioSession->IsRecommendToStopAudio(eventContextObj) ? + deviceChangedEvent.recommendedAction = audioSession->IsRecommendToStopAudio(deviceChangedEvent.devices[0]) ? OutputDeviceChangeRecommendedAction::RECOMMEND_TO_STOP : OutputDeviceChangeRecommendedAction::RECOMMEND_TO_CONTINUE; diff --git a/services/audio_policy/test/unittest/audio_session_unit_test/src/audio_session_unit_test.cpp b/services/audio_policy/test/unittest/audio_session_unit_test/src/audio_session_unit_test.cpp index 0aa8dda3c8..91f5bbaab4 100644 --- a/services/audio_policy/test/unittest/audio_session_unit_test/src/audio_session_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_session_unit_test/src/audio_session_unit_test.cpp @@ -17,6 +17,7 @@ #include "audio_errors.h" #include "audio_session.h" #include "audio_session_service.h" +#include "audio_device_manager.h" #include "audio_session_unit_test.h" using namespace testing::ext; @@ -303,12 +304,15 @@ HWTEST_F(AudioSessionUnitTest, AudioSessionUnitTest_013, TestSize.Level1) EXPECT_FALSE(audioSession->IsRecommendToStopAudio(nullptr)); - std::shared_ptr eventContextObj = - std::make_shared(); - eventContextObj->reason_ = AudioStreamDeviceChangeReason::OVERRODE; - eventContextObj->reason_ = AudioStreamDeviceChangeReason::UNKNOWN; - eventContextObj->descriptor = nullptr; - EXPECT_FALSE(audioSession->IsRecommendToStopAudio(eventContextObj)); + std::shared_ptr desc = std::make_shared(); + EXPECT_FALSE(audioSession->IsRecommendToStopAudio(desc)); + + ASSERT_GT(AudioDeviceManager::GetInstance().privacyDeviceList_.size(), 0); + DevicePrivacyInfo privacyInfo = *(AudioDeviceManager::GetInstance().privacyDeviceList_.begin()); + audioSession->deviceDescriptor_.deviceType_ = privacyInfo.deviceType; + audioSession->deviceDescriptor_.deviceUsage_ = privacyInfo.deviceUsage; + audioSession->deviceDescriptor_.deviceCategory_ = privacyInfo.deviceCategory; + EXPECT_TRUE(audioSession->IsRecommendToStopAudio(desc)); } /** @@ -331,6 +335,11 @@ HWTEST_F(AudioSessionUnitTest, AudioSessionUnitTest_014, TestSize.Level1) int32_t ret = audioSession->Activate(strategy); EXPECT_EQ(ret, SUCCESS); audioSession->SetSessionDefaultOutputDevice(DEVICE_TYPE_DEFAULT); + + std::shared_ptr desc = std::make_shared(); + bool res = audioSession->IsSessionOutputDeviceChanged(desc); + EXPECT_FALSE(res); + ret = audioSession->Deactivate(); EXPECT_EQ(ret, SUCCESS); } diff --git a/test/fuzztest/audiosession_fuzzer/audio_session_fuzzer.cpp b/test/fuzztest/audiosession_fuzzer/audio_session_fuzzer.cpp index c92b92edb4..3f1014fda5 100644 --- a/test/fuzztest/audiosession_fuzzer/audio_session_fuzzer.cpp +++ b/test/fuzztest/audiosession_fuzzer/audio_session_fuzzer.cpp @@ -238,29 +238,11 @@ void GetSessionDefaultOutputDeviceFuzzTest() audioSession->GetSessionDefaultOutputDevice(deviceType); } -void IsStreamContainedInCurrentSessionFuzzTest() -{ - auto audioSession = CreateAudioSession(); - CHECK_AND_RETURN(audioSession != nullptr); - AudioInterrupt audioInterrupt; - audioInterrupt.streamId = g_fuzzUtils.GetData(); - audioSession->AddStreamInfo(audioInterrupt); - audioSession->IsStreamContainedInCurrentSession(g_fuzzUtils.GetData()); - audioSession->ClearStreamInfo(); -} - -void IsCurrentDevicePrivateDeviceFuzzTest() -{ - auto audioSession = CreateAudioSession(); - CHECK_AND_RETURN(audioSession != nullptr); - audioSession->IsCurrentDevicePrivateDevice(std::make_shared()); -} - void IsRecommendToStopAudioFuzzTest() { auto audioSession = CreateAudioSession(); CHECK_AND_RETURN(audioSession != nullptr); - audioSession->IsRecommendToStopAudio(std::make_shared()); + audioSession->IsRecommendToStopAudio(std::make_shared()); } void IsSessionOutputDeviceChangedFuzzTest() @@ -307,8 +289,6 @@ vector g_testFuncs = { ShouldExcludeStreamTypeFuzzTest, IsAudioRendererEmptyFuzzTest, GetSessionDefaultOutputDeviceFuzzTest, - IsStreamContainedInCurrentSessionFuzzTest, - IsCurrentDevicePrivateDeviceFuzzTest, IsRecommendToStopAudioFuzzTest, IsSessionOutputDeviceChangedFuzzTest, GetSessionStreamUsageFuzzTest, -- Gitee