From 26d46b5508b77445bbd21d2f0f23416643cafcfe Mon Sep 17 00:00:00 2001 From: liyuhang Date: Fri, 16 May 2025 01:11:05 +0000 Subject: [PATCH 1/3] Modem use streamDesc Signed-off-by: liyuhang Change-Id: Ia79b596e25d7d23573a4c175f5a3a2dd354ca13b --- .../services/core/src/audio_core_service.cpp | 25 +++++++++------- .../core/src/audio_core_service_private.cpp | 23 +++++++++------ .../pipe/include/audio_pipe_manager.h | 9 ++++-- .../services/pipe/src/audio_pipe_manager.cpp | 29 +++++++++++++++++-- 4 files changed, 60 insertions(+), 26 deletions(-) diff --git a/services/audio_policy/services/core/src/audio_core_service.cpp b/services/audio_policy/services/core/src/audio_core_service.cpp index 06d3d94aae..07a62df84f 100644 --- a/services/audio_policy/services/core/src/audio_core_service.cpp +++ b/services/audio_policy/services/core/src/audio_core_service.cpp @@ -134,13 +134,17 @@ std::shared_ptr AudioCoreService::GetEventEntry() int32_t AudioCoreService::CreateRendererClient( std::shared_ptr streamDesc, uint32_t &audioFlag, uint32_t &sessionId) { + CHECK_AND_RETURN_RET_LOG(streamDesc != nullptr, ERR_NULL_POINTER, "stream desc is nullptr"); + if (sessionId == 0) { + streamDesc->sessionId_ = GenerateSessionId(); + sessionId = streamDesc->sessionId_; + AUDIO_INFO_LOG("New session id: %{public}u", sessionId); + } + bool isModemStream = false; if (streamDesc->rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) { audioFlag = AUDIO_FLAG_NORMAL; - sessionId = GenerateSessionId(); AUDIO_INFO_LOG("Modem communication, sessionId %{public}u", sessionId); - pipeManager_->AddModemCommunicationId(sessionId, GetRealUid(streamDesc)); - AddSessionId(sessionId); - return SUCCESS; + pipeManager_->AddModemCommunicationId(sessionId, streamDesc); } streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; // Select device @@ -150,6 +154,9 @@ int32_t AudioCoreService::CreateRendererClient( for (auto device : streamDesc->newDeviceDescs_) { AUDIO_INFO_LOG("Device type %{public}d", device->deviceType_); } + if (isModemStream) { + return SUCCESS; + } SetPlaybackStreamFlag(streamDesc); AUDIO_INFO_LOG("Will use audio flag: %{public}u", streamDesc->audioFlag_); @@ -326,15 +333,13 @@ int32_t AudioCoreService::StartClient(uint32_t sessionId) { AUDIO_INFO_LOG("In, session %{public}u", sessionId); if (pipeManager_->IsModemCommunicationIdExist(sessionId)) { - AUDIO_INFO_LOG("Modem communication, directly return"); + AUDIO_INFO_LOG("Modem communication ring, directly return"); return SUCCESS; } std::shared_ptr streamDesc = pipeManager_->GetStreamDescById(sessionId); - if (streamDesc == nullptr) { - AUDIO_ERR_LOG("Cannot find session %{public}u", sessionId); - return ERROR; - } + CHECK_AND_RETURN_RET_LOG(streamDesc != nullptr, ERR_NULL_POINTER, "Cannot find session %{public}u", sessionId); + pipeManager_->StartClient(sessionId); if (streamDesc->audioMode_ == AUDIO_MODE_PLAYBACK) { std::string sinkName = AudioPolicyUtils::GetInstance().GetSinkName(streamDesc->newDeviceDescs_.front(), @@ -365,8 +370,6 @@ int32_t AudioCoreService::StartClient(uint32_t sessionId) streamDesc->newDeviceDescs_[0]->deviceType_, DeviceFlag::INPUT_DEVICES_FLAG); streamCollector_.UpdateCapturerDeviceInfo(streamDesc->newDeviceDescs_.front()); } - - pipeManager_->StartClient(sessionId); return SUCCESS; } diff --git a/services/audio_policy/services/core/src/audio_core_service_private.cpp b/services/audio_policy/services/core/src/audio_core_service_private.cpp index 8b323c3292..7aea4f231a 100644 --- a/services/audio_policy/services/core/src/audio_core_service_private.cpp +++ b/services/audio_policy/services/core/src/audio_core_service_private.cpp @@ -197,20 +197,31 @@ void AudioCoreService::CheckModemScene(const AudioStreamDeviceChangeReasonExt re if (!pipeManager_->IsModemCommunicationIdExist()) { return; } + if (audioSceneManager_.GetAudioScene() == AUDIO_SCENE_PHONE_CALL) { + pipeManager_->UpdateModemStreamStatus(STREAM_STATUS_STARTED); + } else { + pipeManager_->UpdateModemStreamStatus(STREAM_STATUS_STOPPED); + } vector> descs = audioRouterCenter_.FetchOutputDevices(STREAM_USAGE_VOICE_MODEM_COMMUNICATION, -1); CHECK_AND_RETURN_LOG(descs.size() != 0, "Fetch output device for voice modem communication failed"); + pipeManager_->UpdateModemStreamDevice(descs); AUDIO_INFO_LOG("Update route %{public}d", descs.front()->deviceType_); + if (!pipeManager_->IsModemStreamDeviceChanged(descs.front())) { + AUDIO_INFO_LOG("Modem stream device not change"); + return; + } if (descs.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) { - int32_t ret = HandleScoOutputDeviceFetched(descs.front(), reason); + int32_t ret = HandleScoOutputDeviceFetched(pipeManager_->GetModemCommunicationMap().begin()->second, reason); AUDIO_INFO_LOG("HandleScoOutputDeviceFetched %{public}d", ret); } audioActiveDevice_.UpdateActiveDeviceRoute(descs.front()->deviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG); AudioDeviceDescriptor desc = AudioDeviceDescriptor(descs.front()); - std::unordered_map modemSessionMap = pipeManager_->GetModemCommunicationMap(); + std::unordered_map> modemSessionMap = + pipeManager_->GetModemCommunicationMap(); for (auto it = modemSessionMap.begin(); it != modemSessionMap.end(); ++it) { - streamCollector_.UpdateRendererDeviceInfo(it->second, it->first, desc); + streamCollector_.UpdateRendererDeviceInfo(GetRealUid(it->second), it->first, desc); } } @@ -488,12 +499,6 @@ int32_t AudioCoreService::FetchDeviceAndRoute(const AudioStreamDeviceChangeReaso int32_t AudioCoreService::FetchRendererPipeAndExecute(std::shared_ptr streamDesc, uint32_t &sessionId, uint32_t &audioFlag, const AudioStreamDeviceChangeReasonExt reason) { - if (sessionId == 0) { - streamDesc->sessionId_ = GenerateSessionId(); - sessionId = streamDesc->sessionId_; - AUDIO_INFO_LOG("New sessionId: %{public}u", sessionId); - } - std::vector> pipeInfos = audioPipeSelector_->FetchPipeAndExecute(streamDesc); uint32_t sinkId = HDI_INVALID_ID; diff --git a/services/audio_policy/services/pipe/include/audio_pipe_manager.h b/services/audio_policy/services/pipe/include/audio_pipe_manager.h index eeb0c2f25d..e83d8aee4a 100644 --- a/services/audio_policy/services/pipe/include/audio_pipe_manager.h +++ b/services/audio_policy/services/pipe/include/audio_pipe_manager.h @@ -69,16 +69,19 @@ public: void Dump(std::string &dumpString); bool IsModemCommunicationIdExist(); bool IsModemCommunicationIdExist(uint32_t sessionId); - void AddModemCommunicationId(uint32_t sessionId, int32_t clientUid); + void AddModemCommunicationId(uint32_t sessionId, std::shared_ptr &streamDesc); void RemoveModemCommunicationId(uint32_t sessionId); - std::unordered_map GetModemCommunicationMap(); + std::unordered_map> GetModemCommunicationMap(); + void UpdateModemStreamStatus(AudioStreamStatus streamStatus); + void UpdateModemStreamDevice(std::vector> &deviceDescs); + bool IsModemStreamDeviceChanged(std::shared_ptr &deviceDescs); std::shared_ptr GetNormalSourceInfo(bool isEcFeatureEnable); private: bool IsSpecialPipe(uint32_t routeFlag); std::shared_ptr GetPipeByModuleAndFlag(const std::string moduleName, const uint32_t routeFlag); - std::unordered_map modemCommunicationIdMap_{}; // key -> sessionId, value -> clientUid + std::unordered_map> modemCommunicationIdMap_{}; std::vector> curPipeList_{}; std::shared_mutex pipeListLock_; }; diff --git a/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp b/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp index ccee9e2209..644f913d51 100644 --- a/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp +++ b/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp @@ -372,13 +372,13 @@ bool AudioPipeManager::IsModemCommunicationIdExist(uint32_t sessionId) return modemCommunicationIdMap_.find(sessionId) != modemCommunicationIdMap_.end(); } -void AudioPipeManager::AddModemCommunicationId(uint32_t sessionId, int32_t clientUid) +void AudioPipeManager::AddModemCommunicationId(uint32_t sessionId, std::shared_ptr &streamDesc) { std::shared_lock pLock(pipeListLock_); if (sessionId < FIRST_SESSIONID || sessionId > MAX_VALID_SESSIONID) { AUDIO_ERR_LOG("Invalid id %{public}u", sessionId); } - modemCommunicationIdMap_[sessionId] = clientUid; + modemCommunicationIdMap_[sessionId] = streamDesc; } void AudioPipeManager::RemoveModemCommunicationId(uint32_t sessionId) @@ -392,12 +392,35 @@ void AudioPipeManager::RemoveModemCommunicationId(uint32_t sessionId) } } -std::unordered_map AudioPipeManager::GetModemCommunicationMap() +std::unordered_map> AudioPipeManager::GetModemCommunicationMap() { std::shared_lock pLock(pipeListLock_); return modemCommunicationIdMap_; } +void AudioPipeManager::UpdateModemStreamStatus(AudioStreamStatus streamStatus) +{ + std::shared_lock pLock(pipeListLock_); + for (auto &entry : modemCommunicationIdMap_) { + entry.second->streamStatus_ = streamStatus; + } +} + +void AudioPipeManager::UpdateModemStreamDevice(std::vector> &deviceDescs) +{ + std::shared_lock pLock(pipeListLock_); + for (auto &entry : modemCommunicationIdMap_) { + entry.second->oldDeviceDescs_ = entry.second->newDeviceDescs_; + entry.second->newDeviceDescs_ = deviceDescs; + } +} + +bool AudioPipeManager::IsModemStreamDeviceChanged(std::shared_ptr &deviceDescs) +{ + std::shared_lock pLock(pipeListLock_); + return !modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.front()->IsSameDeviceDescPtr(deviceDescs); +} + std::shared_ptr AudioPipeManager::GetNormalSourceInfo(bool isEcFeatureEnable) { std::shared_ptr pipeInfo = GetPipeByModuleAndFlag(PRIMARY_MIC, AUDIO_INPUT_FLAG_NORMAL); -- Gitee From 8cba413e0d0b18720d48b55d619c51f94c312fe3 Mon Sep 17 00:00:00 2001 From: liyuhang Date: Fri, 16 May 2025 03:04:13 +0000 Subject: [PATCH 2/3] Code check Signed-off-by: liyuhang Change-Id: If11b86922d3249cb51f3a81acc165220aafc2969 --- .../audio_policy/services/core/src/audio_core_service.cpp | 4 +++- .../services/core/src/audio_core_service_private.cpp | 7 +++++-- .../audio_policy/services/pipe/src/audio_pipe_manager.cpp | 7 +++++++ 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/services/audio_policy/services/core/src/audio_core_service.cpp b/services/audio_policy/services/core/src/audio_core_service.cpp index 07a62df84f..bb404b82e5 100644 --- a/services/audio_policy/services/core/src/audio_core_service.cpp +++ b/services/audio_policy/services/core/src/audio_core_service.cpp @@ -142,8 +142,10 @@ int32_t AudioCoreService::CreateRendererClient( } bool isModemStream = false; if (streamDesc->rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) { - audioFlag = AUDIO_FLAG_NORMAL; AUDIO_INFO_LOG("Modem communication, sessionId %{public}u", sessionId); + isModemStream = true; + audioFlag = AUDIO_FLAG_NORMAL; + AddSessionId(sessionId); pipeManager_->AddModemCommunicationId(sessionId, streamDesc); } streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; diff --git a/services/audio_policy/services/core/src/audio_core_service_private.cpp b/services/audio_policy/services/core/src/audio_core_service_private.cpp index 7aea4f231a..c6647beb3e 100644 --- a/services/audio_policy/services/core/src/audio_core_service_private.cpp +++ b/services/audio_policy/services/core/src/audio_core_service_private.cpp @@ -212,8 +212,11 @@ void AudioCoreService::CheckModemScene(const AudioStreamDeviceChangeReasonExt re return; } if (descs.front()->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) { - int32_t ret = HandleScoOutputDeviceFetched(pipeManager_->GetModemCommunicationMap().begin()->second, reason); - AUDIO_INFO_LOG("HandleScoOutputDeviceFetched %{public}d", ret); + auto modemMap = pipeManager_->GetModemCommunicationMap().begin(); + if (modemMap != pipeManager_->GetModemCommunicationMap().end()) { + int32_t ret = HandleScoOutputDeviceFetched(pipeManager_->GetModemCommunicationMap().begin()->second, reason); + AUDIO_INFO_LOG("HandleScoOutputDeviceFetched %{public}d", ret); + } } audioActiveDevice_.UpdateActiveDeviceRoute(descs.front()->deviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG); diff --git a/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp b/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp index 644f913d51..d7e0e83c7e 100644 --- a/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp +++ b/services/audio_policy/services/pipe/src/audio_pipe_manager.cpp @@ -402,6 +402,7 @@ void AudioPipeManager::UpdateModemStreamStatus(AudioStreamStatus streamStatus) { std::shared_lock pLock(pipeListLock_); for (auto &entry : modemCommunicationIdMap_) { + CHECK_AND_CONTINUE_LOG(entry.second != nullptr, "StreamDesc is nullptr"); entry.second->streamStatus_ = streamStatus; } } @@ -410,6 +411,7 @@ void AudioPipeManager::UpdateModemStreamDevice(std::vector pLock(pipeListLock_); for (auto &entry : modemCommunicationIdMap_) { + CHECK_AND_CONTINUE_LOG(entry.second != nullptr, "StreamDesc is nullptr"); entry.second->oldDeviceDescs_ = entry.second->newDeviceDescs_; entry.second->newDeviceDescs_ = deviceDescs; } @@ -418,6 +420,11 @@ void AudioPipeManager::UpdateModemStreamDevice(std::vector &deviceDescs) { std::shared_lock pLock(pipeListLock_); + CHECK_AND_RETURN_RET_LOG(modemCommunicationIdMap_.size() > 0 && + modemCommunicationIdMap_.begin()->second != nullptr && + modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.size() > 0 && + modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.front() != nullptr, + false, "Invalid modemCommunicationMap, size: %{public}zu", modemCommunicationIdMap_.size()); return !modemCommunicationIdMap_.begin()->second->oldDeviceDescs_.front()->IsSameDeviceDescPtr(deviceDescs); } -- Gitee From 60883bcc615cb4c93bd73af0ca8581f8c5285a24 Mon Sep 17 00:00:00 2001 From: liyuhang Date: Fri, 16 May 2025 06:45:04 +0000 Subject: [PATCH 3/3] Add ut Signed-off-by: liyuhang Change-Id: Iadd732e5e92d247a453d8982b1197d322edfb2b7 --- .../audio_core_service_private_unit_test.cpp | 3 ++- .../src/audio_pipe_manager_unit_test.cpp | 22 +++++++++---------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp index 8fc4678a16..87add1c7dd 100644 --- a/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_private_unit_test/src/audio_core_service_private_unit_test.cpp @@ -194,7 +194,8 @@ HWTEST(AudioCoreServicePrivateTest, AudioCoreServicePrivate_010, TestSize.Level1 AudioStreamDeviceChangeReasonExt reason(extEnum); audioCoreService->pipeManager_ = std::make_shared(); EXPECT_NE(audioCoreService->pipeManager_, nullptr); - audioCoreService->pipeManager_->modemCommunicationIdMap_.insert(std::make_pair(0, 0)); + std::shared_ptr streamDesc = std::make_shared(); + audioCoreService->pipeManager_->modemCommunicationIdMap_.insert(std::make_pair(0, streamDesc)); audioCoreService->CheckModemScene(reason); } diff --git a/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_unit_test.cpp b/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_unit_test.cpp index 62f3a1738e..55b4d2c457 100644 --- a/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_pipe_manager_unit_test/src/audio_pipe_manager_unit_test.cpp @@ -944,13 +944,13 @@ HWTEST_F(AudioPipeManagerUnitTest, AddModemCommunicationId_001, TestSize.Level1) { auto audioPipeManager = AudioPipeManager::GetPipeManager(); uint32_t sessionId = 99999; - int32_t clientUid = 12345; + std::shared_ptr streamDesc = std::make_shared(); audioPipeManager->modemCommunicationIdMap_.clear(); - audioPipeManager->AddModemCommunicationId(sessionId, clientUid); + audioPipeManager->AddModemCommunicationId(sessionId, streamDesc); auto modemMap = audioPipeManager->GetModemCommunicationMap(); EXPECT_EQ(modemMap.size(), 1); - EXPECT_EQ(modemMap.find(sessionId)->second, clientUid); + EXPECT_EQ(modemMap.find(sessionId)->second, streamDesc); } /** @@ -963,13 +963,13 @@ HWTEST_F(AudioPipeManagerUnitTest, AddModemCommunicationId_002, TestSize.Level1) { auto audioPipeManager = AudioPipeManager::GetPipeManager(); uint32_t sessionId = 4294867296; - int32_t clientUid = 12345; + std::shared_ptr streamDesc = std::make_shared(); audioPipeManager->modemCommunicationIdMap_.clear(); - audioPipeManager->AddModemCommunicationId(sessionId, clientUid); + audioPipeManager->AddModemCommunicationId(sessionId, streamDesc); auto modemMap = audioPipeManager->GetModemCommunicationMap(); EXPECT_EQ(modemMap.size(), 1); - EXPECT_EQ(modemMap.find(sessionId)->second, clientUid); + EXPECT_EQ(modemMap.find(sessionId)->second, streamDesc); } /** @@ -982,13 +982,13 @@ HWTEST_F(AudioPipeManagerUnitTest, AddModemCommunicationId_003, TestSize.Level1) { auto audioPipeManager = AudioPipeManager::GetPipeManager(); uint32_t sessionId = 100000; - int32_t clientUid = 12345; + std::shared_ptr streamDesc = std::make_shared(); audioPipeManager->modemCommunicationIdMap_.clear(); - audioPipeManager->AddModemCommunicationId(sessionId, clientUid); + audioPipeManager->AddModemCommunicationId(sessionId, streamDesc); auto modemMap = audioPipeManager->GetModemCommunicationMap(); EXPECT_EQ(modemMap.size(), 1); - EXPECT_EQ(modemMap.find(sessionId)->second, clientUid); + EXPECT_EQ(modemMap.find(sessionId)->second, streamDesc); } /** @@ -1001,9 +1001,9 @@ HWTEST_F(AudioPipeManagerUnitTest, RemoveModemCommunicationId_001, TestSize.Leve { auto audioPipeManager = AudioPipeManager::GetPipeManager(); uint32_t sessionId = 12345; - int32_t clientUid = 67890; + std::shared_ptr streamDesc = std::make_shared(); - audioPipeManager->modemCommunicationIdMap_[sessionId] = clientUid; + audioPipeManager->modemCommunicationIdMap_[sessionId] = streamDesc; audioPipeManager->RemoveModemCommunicationId(sessionId); auto modemMap = audioPipeManager->GetModemCommunicationMap(); EXPECT_EQ(modemMap.find(sessionId), modemMap.end()); -- Gitee