From 2a7788d488ff1eb375dd666e2f9b7a6582d7351b Mon Sep 17 00:00:00 2001 From: zhanghuiming Date: Thu, 4 Sep 2025 07:16:00 +0000 Subject: [PATCH] select a2dp type when updated devices Signed-off-by: zhanghuiming Change-Id: I195cd7baf82302084ac40142d74f04a733bd2878 Signed-off-by: zhanghuiming --- .../service_main/include/audio_core_service.h | 4 +- .../service_main/src/audio_core_service.cpp | 47 ++---------------- .../src/audio_core_service_private.cpp | 49 ++++++++++++++++++- .../audio_core_service_entry_unit_test.cpp | 24 ++++++++- .../audio_core_service_private_fuzzer.cpp | 6 +-- 5 files changed, 79 insertions(+), 51 deletions(-) diff --git a/services/audio_policy/server/service/service_main/include/audio_core_service.h b/services/audio_policy/server/service/service_main/include/audio_core_service.h index b6031df78f..64504e464d 100644 --- a/services/audio_policy/server/service/service_main/include/audio_core_service.h +++ b/services/audio_policy/server/service/service_main/include/audio_core_service.h @@ -490,7 +490,9 @@ private: bool HandleInputStreamInRunning(std::shared_ptr &streamDesc); void HandleDualStartClient(std::vector> &activeDevices, std::shared_ptr &streamDesc); - void HandlePlaybackStreamInA2dp(std::shared_ptr &streamDesc, bool isCreateProcess); + void SelectA2dpType(std::shared_ptr &streamDesc, bool isCreateProcess); + void UpdateStreamDevicesForCreate(std::shared_ptr &streamDesc, std::string caller); + void UpdateStreamDevicesForStart(std::shared_ptr &streamDesc, std::string caller); bool IsNoRunningStream(std::vector> outputStreamDescs); void UpdateActiveDeviceAndVolumeBeforeMoveSession(std::vector> &streamDesc, const AudioStreamDeviceChangeReasonExt reason); 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 aef2d6c2b1..40545b3902 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 @@ -179,32 +179,18 @@ int32_t AudioCoreService::CreateRendererClient( AUDIO_INFO_LOG("Generate session id %{public}u for stream", sessionId); } + UpdateStreamDevicesForCreate(streamDesc, "CreateRendererClient"); // Modem stream need special process, because there are no real hdi output or input in fwk. // Input also need to be handled because capturer won't be created, only has renderer. - bool isModemStream = false; if (streamDesc->rendererInfo_.streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION) { AUDIO_INFO_LOG("Modem communication renderer create, sessionId %{public}u", sessionId); - isModemStream = true; audioFlag = AUDIO_FLAG_NORMAL; AddSessionId(sessionId); pipeManager_->AddModemCommunicationId(sessionId, streamDesc); - } - - AUDIO_INFO_LOG("[DeviceFetchStart] for stream %{public}d", sessionId); - streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; - streamDesc->newDeviceDescs_ = - audioRouterCenter_.FetchOutputDevices(streamDesc->rendererInfo_.streamUsage, - GetRealUid(streamDesc), "CreateRendererClient", RouterType::ROUTER_TYPE_NONE, - streamDesc->rendererInfo_.privacyType); - CHECK_AND_RETURN_RET_LOG(streamDesc->newDeviceDescs_.size() > 0 && streamDesc->newDeviceDescs_.front() != nullptr, - ERR_NULL_POINTER, "Invalid deviceDesc"); - HILOG_COMM_INFO("[DeviceFetchInfo] device %{public}s for stream %{public}d", - streamDesc->GetNewDevicesTypeString().c_str(), sessionId); - - FetchOutputDupDevice("CreateRendererClient", sessionId, streamDesc); - if (isModemStream) { return SUCCESS; } + CHECK_AND_RETURN_RET_LOG(streamDesc->newDeviceDescs_.size() > 0 + && streamDesc->newDeviceDescs_.front() != nullptr, ERR_NULL_POINTER, "Invalid deviceDesc"); ActivateOutputDevice(streamDesc); @@ -351,7 +337,6 @@ void AudioCoreService::UpdatePlaybackStreamFlag(std::shared_ptraudioFlag_); return; } - HandlePlaybackStreamInA2dp(streamDesc, isCreateProcess); switch (streamDesc->rendererInfo_.originalFlag) { case AUDIO_FLAG_MMAP: streamDesc->audioFlag_ = SetFlagForMmapStream(streamDesc); @@ -1325,31 +1310,7 @@ int32_t AudioCoreService::FetchOutputDeviceAndRoute(std::string caller, const Au CheckModemScene(modemDescs, reason); for (auto &streamDesc : outputStreamDescs) { - CHECK_AND_CONTINUE_LOG(streamDesc != nullptr, "Stream desc is nullptr"); - streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; - StreamUsage streamUsage = StreamUsage::STREAM_USAGE_INVALID; - if (audioSessionService_ != nullptr) { - streamUsage = audioSessionService_->GetAudioSessionStreamUsage(GetRealPid(streamDesc)); - } - streamUsage = (streamUsage != StreamUsage::STREAM_USAGE_INVALID) ? streamUsage : - streamDesc->rendererInfo_.streamUsage; - std::vector> devices; - if (VolumeUtils::IsPCVolumeEnable() && !isFirstScreenOn_) { - devices.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice()); - } else { - devices = audioRouterCenter_.FetchOutputDevices(streamUsage, GetRealUid(streamDesc), - caller + "FetchOutputDeviceAndRoute", RouterType::ROUTER_TYPE_NONE, - streamDesc->rendererInfo_.privacyType); - } - streamDesc->UpdateNewDevice(devices); - AUDIO_INFO_LOG("[AudioSession] streamUsage %{public}d renderer streamUsage %{public}d", - streamUsage, streamDesc->rendererInfo_.streamUsage); - AUDIO_INFO_LOG("[DeviceFetchInfo] device %{public}s for stream %{public}d with status %{public}u", - streamDesc->GetNewDevicesTypeString().c_str(), streamDesc->sessionId_, streamDesc->streamStatus_); - AUDIO_INFO_LOG("Target audioFlag 0x%{public}x for stream %{public}u", - streamDesc->audioFlag_, streamDesc->sessionId_); - - FetchOutputDupDevice(caller + "FetchOutputDeviceAndRoute", streamDesc->sessionId_, streamDesc); + UpdateStreamDevicesForStart(streamDesc, caller + "FetchOutputDeviceAndRoute"); } audioActiveDevice_.UpdateStreamDeviceMap("FetchOutputDeviceAndRoute"); diff --git a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp index aaffcdf84b..7b73751956 100644 --- a/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp +++ b/services/audio_policy/server/service/service_main/src/audio_core_service_private.cpp @@ -2770,8 +2770,53 @@ void AudioCoreService::HandleDualStartClient(std::vectornewDeviceDescs_[1]->deviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG)); } } - -void AudioCoreService::HandlePlaybackStreamInA2dp(std::shared_ptr &streamDesc, +void AudioCoreService::UpdateStreamDevicesForStart( + std::shared_ptr &streamDesc, std::string caller) +{ + CHECK_AND_RETURN_LOG(streamDesc != nullptr, "Invalid stream desc"); + HILOG_COMM_INFO("[UpdateStreamDevicesForStart] for stream %{public}d", streamDesc->sessionId_); + streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; + + StreamUsage streamUsage = StreamUsage::STREAM_USAGE_INVALID; + if (audioSessionService_ != nullptr) { + streamUsage = audioSessionService_->GetAudioSessionStreamUsage(GetRealPid(streamDesc)); + } + streamUsage = (streamUsage != StreamUsage::STREAM_USAGE_INVALID) ? streamUsage : + streamDesc->rendererInfo_.streamUsage; + std::vector> devices; + if (VolumeUtils::IsPCVolumeEnable() && !isFirstScreenOn_) { + devices.push_back(AudioDeviceManager::GetAudioDeviceManager().GetRenderDefaultDevice()); + } else { + devices = audioRouterCenter_.FetchOutputDevices(streamUsage, GetRealUid(streamDesc), + caller, RouterType::ROUTER_TYPE_NONE, streamDesc->rendererInfo_.privacyType); + } + AUDIO_INFO_LOG("[AudioSession] streamUsage %{public}d renderer streamUsage %{public}d", + streamUsage, streamDesc->rendererInfo_.streamUsage); + AUDIO_INFO_LOG("Target audioFlag 0x%{public}x for stream %{public}u", + streamDesc->audioFlag_, streamDesc->sessionId_); + streamDesc->UpdateNewDevice(devices); + + HILOG_COMM_INFO("[UpdateStreamDevicesForStart] device %{public}s for stream %{public}d status %{public}u", + streamDesc->GetNewDevicesTypeString().c_str(), streamDesc->sessionId_, streamDesc->streamStatus_); + SelectA2dpType(streamDesc, false); + FetchOutputDupDevice(caller, streamDesc->sessionId_, streamDesc); +} + +void AudioCoreService::UpdateStreamDevicesForCreate( + std::shared_ptr &streamDesc, std::string caller) +{ + CHECK_AND_RETURN_LOG(streamDesc != nullptr, "Invalid stream desc"); + AUDIO_INFO_LOG("[UpdateStreamDevicesForCreate] for stream %{public}d", streamDesc->sessionId_); + streamDesc->oldDeviceDescs_ = streamDesc->newDeviceDescs_; + streamDesc->newDeviceDescs_ = audioRouterCenter_.FetchOutputDevices(streamDesc->rendererInfo_.streamUsage, + GetRealUid(streamDesc), caller, RouterType::ROUTER_TYPE_NONE, streamDesc->rendererInfo_.privacyType); + HILOG_COMM_INFO("[UpdateStreamDevicesForCreate] device %{public}s for stream %{public}d status %{public}u", + streamDesc->GetNewDevicesTypeString().c_str(), streamDesc->sessionId_, streamDesc->streamStatus_); + SelectA2dpType(streamDesc, true); + FetchOutputDupDevice(caller, streamDesc->sessionId_, streamDesc); +} + +void AudioCoreService::SelectA2dpType(std::shared_ptr &streamDesc, bool isCreateProcess) { #ifdef BLUETOOTH_ENABLE diff --git a/services/audio_policy/test/unittest/audio_core_service_entry_unit_test/src/audio_core_service_entry_unit_test.cpp b/services/audio_policy/test/unittest/audio_core_service_entry_unit_test/src/audio_core_service_entry_unit_test.cpp index 59b56f5fcd..857aab47c8 100644 --- a/services/audio_policy/test/unittest/audio_core_service_entry_unit_test/src/audio_core_service_entry_unit_test.cpp +++ b/services/audio_policy/test/unittest/audio_core_service_entry_unit_test/src/audio_core_service_entry_unit_test.cpp @@ -849,7 +849,7 @@ HWTEST(AudioCoreServiceEntryTest, AudioCoreService_039, TestSize.Level1) /** * @tc.name : Test AudioCoreService. * @tc.number: AudioCoreService_040 - * @tc.desc : Test AudioCoreService::HandlePlaybackStreamInA2dp + * @tc.desc : Test AudioCoreService::SelectA2dpType */ HWTEST(AudioCoreServiceEntryTest, AudioCoreService_040, TestSize.Level1) { @@ -861,7 +861,7 @@ HWTEST(AudioCoreServiceEntryTest, AudioCoreService_040, TestSize.Level1) audioDeviceDescriptor->deviceType_ = DEVICE_TYPE_BLUETOOTH_A2DP; audioStreamDescriptor->newDeviceDescs_.push_back(audioDeviceDescriptor); - audioCoreService->HandlePlaybackStreamInA2dp(audioStreamDescriptor, false); + audioCoreService->SelectA2dpType(audioStreamDescriptor, false); std::shared_ptr temp = audioStreamDescriptor->newDeviceDescs_.front(); EXPECT_NE(temp, nullptr); EXPECT_NE(temp->a2dpOffloadFlag_, A2DP_OFFLOAD); @@ -925,5 +925,25 @@ HWTEST(AudioCoreServiceEntryTest, UpdateSessionOperation_043, TestSize.Level1) auto ret = eventEntry->UpdateSessionOperation(sessionId, operation, opMsg); EXPECT_NE(ret, SUCCESS); } + +/** + * @tc.name : Test AudioCoreService. + * @tc.number: AudioCoreService_044 + * @tc.desc : Test AudioCoreService::UpdateStreamDevicesForStart + */ +HWTEST(AudioCoreServiceEntryTest, AudioCoreService_044, TestSize.Level1) +{ + auto audioCoreService = std::make_shared(); + EXPECT_NE(audioCoreService, nullptr); + + std::shared_ptr audioStreamDescriptor = std::make_shared(); + audioCoreService->UpdateStreamDevicesForStart(audioStreamDescriptor, "test"); + EXPECT_NE(audioStreamDescriptor->newDeviceDescs_.size(), 0); + + audioCoreService->isFirstScreenOn_ = true; + audioCoreService->audioSessionService_ = nullptr; + audioCoreService->UpdateStreamDevicesForStart(audioStreamDescriptor, "test"); + EXPECT_NE(audioStreamDescriptor->newDeviceDescs_.size(), 0); +} } // namespace AudioStandard } // namespace OHOS diff --git a/test/fuzztest/audiocoreserviceprivate_fuzzer/audio_core_service_private_fuzzer.cpp b/test/fuzztest/audiocoreserviceprivate_fuzzer/audio_core_service_private_fuzzer.cpp index 59fedd8b10..4dcad0bac6 100644 --- a/test/fuzztest/audiocoreserviceprivate_fuzzer/audio_core_service_private_fuzzer.cpp +++ b/test/fuzztest/audiocoreserviceprivate_fuzzer/audio_core_service_private_fuzzer.cpp @@ -1382,7 +1382,7 @@ void AudioCoreServicePrivateHandleDualStartClientFuzzTest() audioCoreService->HandleDualStartClient(activeDevices, audioStreamDescriptor); } -void AudioCoreServicePrivateHandlePlaybackStreamInA2dpFuzzTest() +void AudioCoreServicePrivateSelectA2dpTypeFuzzTest() { auto audioCoreService = std::make_shared(); audioCoreService->pipeManager_ = std::make_shared(); @@ -1395,7 +1395,7 @@ void AudioCoreServicePrivateHandlePlaybackStreamInA2dpFuzzTest() std::shared_ptr audioDeviceDescriptor1 = std::make_shared(); audioStreamDescriptor->oldDeviceDescs_.push_back(audioDeviceDescriptor1); bool isCreateProcess = true; - audioCoreService->HandlePlaybackStreamInA2dp(audioStreamDescriptor, isCreateProcess); + audioCoreService->SelectA2dpType(audioStreamDescriptor, isCreateProcess); } void AudioCoreServicePrivateGetDisableFastStreamParamFuzzTest() @@ -1910,7 +1910,7 @@ TestFuncs g_testFuncs[] = { AudioCoreServicePrivateHandleOutputStreamInRunningFuzzTest, AudioCoreServicePrivateHandleInputStreamInRunningFuzzTest, AudioCoreServicePrivateHandleDualStartClientFuzzTest, - AudioCoreServicePrivateHandlePlaybackStreamInA2dpFuzzTest, + AudioCoreServicePrivateSelectA2dpTypeFuzzTest, AudioCoreServicePrivateGetDisableFastStreamParamFuzzTest, AudioCoreServicePrivateActivateNearlinkDeviceFuzzTest, AudioCoreServicePrivateSwitchActiveHearingAidDeviceFuzzTest, -- Gitee