From 23ff7bf6bf4cce9b78c019e41be2f99098b20c21 Mon Sep 17 00:00:00 2001 From: liyuhang Date: Fri, 16 May 2025 08:59:31 +0000 Subject: [PATCH] A2dp offload Signed-off-by: liyuhang Change-Id: Ice7625901f2ea1d766fd5ec28d4979759f405842 --- .../include/audio_definition_adapter_info.h | 2 +- .../src/audio_definition_adapter_info.cpp | 8 +-- .../src/audio_policy_config_manager.cpp | 8 +-- .../core/include/audio_core_service.h | 5 +- .../services/core/src/audio_core_service.cpp | 24 +++++--- .../core/src/audio_core_service_private.cpp | 55 +++++++++++++++++-- 6 files changed, 78 insertions(+), 24 deletions(-) diff --git a/services/audio_policy/common/definitions/include/audio_definition_adapter_info.h b/services/audio_policy/common/definitions/include/audio_definition_adapter_info.h index 74e42b0a88..95820a32af 100644 --- a/services/audio_policy/common/definitions/include/audio_definition_adapter_info.h +++ b/services/audio_policy/common/definitions/include/audio_definition_adapter_info.h @@ -204,7 +204,7 @@ public: std::string GetVersion(); std::shared_ptr GetAdapterDeviceInfo(DeviceType type_, DeviceRole role_, - const std::string &networkId_, uint32_t flags); + const std::string &networkId_, uint32_t flags, int32_t a2dpOffloadFlag = 0); std::unordered_map> adapterInfoMap {}; std::unordered_map, diff --git a/services/audio_policy/common/definitions/src/audio_definition_adapter_info.cpp b/services/audio_policy/common/definitions/src/audio_definition_adapter_info.cpp index cd84eac7c9..5c2185aff5 100644 --- a/services/audio_policy/common/definitions/src/audio_definition_adapter_info.cpp +++ b/services/audio_policy/common/definitions/src/audio_definition_adapter_info.cpp @@ -110,10 +110,10 @@ std::string AudioPolicyConfigData::GetVersion() } std::shared_ptr AudioPolicyConfigData::GetAdapterDeviceInfo( - DeviceType type_, DeviceRole role_, const std::string &networkId_, uint32_t flags) + DeviceType type_, DeviceRole role_, const std::string &networkId_, uint32_t flags, int32_t a2dpOffloadFlag) { - AUDIO_INFO_LOG("type_:%{public}d, role_:%{public}d, type_:%{public}s, type_:%{public}u", type_, role_, - networkId_.c_str(), flags); + AUDIO_INFO_LOG("type_:%{public}d, role_:%{public}d, networkId_:%{public}s, flags:%{public}u," + "a2dpOffloadFlag: %{public}d", type_, role_, networkId_.c_str(), flags, a2dpOffloadFlag); // use primary to select device when in remote cast; DeviceType tempType = (type_ == DEVICE_TYPE_REMOTE_CAST ? DEVICE_TYPE_SPEAKER : type_); @@ -137,7 +137,7 @@ std::shared_ptr AudioPolicyConfigData::GetAdapterDeviceInfo( if (networkId_ != LOCAL_NETWORK_ID) { targetAdapterName = "remote"; } else { - if (type_ == DEVICE_TYPE_BLUETOOTH_A2DP && (flags & AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD) == 0) { + if (type_ == DEVICE_TYPE_BLUETOOTH_A2DP && a2dpOffloadFlag != A2DP_OFFLOAD) { targetAdapterName = "a2dp"; } else { targetAdapterName = "primary"; diff --git a/services/audio_policy/services/core/config/src/audio_policy_config_manager.cpp b/services/audio_policy/services/core/config/src/audio_policy_config_manager.cpp index a0eecbb217..d4a0b7c7f3 100644 --- a/services/audio_policy/services/core/config/src/audio_policy_config_manager.cpp +++ b/services/audio_policy/services/core/config/src/audio_policy_config_manager.cpp @@ -330,8 +330,8 @@ uint32_t AudioPolicyConfigManager::GetRouteFlag(std::shared_ptr adapter -> flag -> stream uint32_t flag = AUDIO_FLAG_NONE; // input or output? default? auto newDeviceDesc = desc->newDeviceDescs_.front(); - std::shared_ptr deviceInfo = audioPolicyConfig_.GetAdapterDeviceInfo( - newDeviceDesc->deviceType_, newDeviceDesc->deviceRole_, newDeviceDesc->networkId_, desc->audioFlag_); + std::shared_ptr deviceInfo = audioPolicyConfig_.GetAdapterDeviceInfo(newDeviceDesc->deviceType_, + newDeviceDesc->deviceRole_, newDeviceDesc->networkId_, desc->audioFlag_, newDeviceDesc->a2dpOffloadFlag_); CHECK_AND_RETURN_RET_LOG(deviceInfo != nullptr, flag, "Find device failed; use none flag"); for (auto &pipeIt : deviceInfo->supportPipeMap_) { @@ -409,8 +409,8 @@ void AudioPolicyConfigManager::GetStreamPropInfo(std::shared_ptr &info) { auto newDeviceDesc = desc->newDeviceDescs_.front(); - std::shared_ptr deviceInfo = audioPolicyConfig_.GetAdapterDeviceInfo( - newDeviceDesc->deviceType_, newDeviceDesc->deviceRole_, newDeviceDesc->networkId_, desc->audioFlag_); + std::shared_ptr deviceInfo = audioPolicyConfig_.GetAdapterDeviceInfo(newDeviceDesc->deviceType_, + newDeviceDesc->deviceRole_, newDeviceDesc->networkId_, desc->audioFlag_, newDeviceDesc->a2dpOffloadFlag_); CHECK_AND_RETURN_LOG(deviceInfo != nullptr, "Find device failed, none streamProp"); auto pipeIt = deviceInfo->supportPipeMap_.find(desc->routeFlag_); diff --git a/services/audio_policy/services/core/include/audio_core_service.h b/services/audio_policy/services/core/include/audio_core_service.h index f9a4be824c..0cbae7c6d8 100644 --- a/services/audio_policy/services/core/include/audio_core_service.h +++ b/services/audio_policy/services/core/include/audio_core_service.h @@ -315,8 +315,8 @@ private: void SendA2dpConnectedWhileRunning(const RendererState &rendererState, const uint32_t &sessionId); void UpdateSessionConnectionState(const int32_t &sessionID, const int32_t &state); void UpdateTrackerDeviceChange(const vector> &desc); - void SetPlaybackStreamFlag(std::shared_ptr &streamDesc); - AudioFlag CheckIsSpecialStream(std::shared_ptr &streamDesc); + void UpdatePlaybackStreamFlag(std::shared_ptr &streamDesc, bool isCreateProcess); + AudioFlag SetFlagForSpecialStream(std::shared_ptr &streamDesc, bool isCreateProcess); void SetRecordStreamFlag(std::shared_ptr streamDesc); std::vector FilterSourceOutputs(int32_t sessionId); std::vector GetSourceOutputs(); @@ -383,6 +383,7 @@ private: bool HandleInputStreamInRunning(std::shared_ptr &streamDesc); void HandleDualStartClient(std::vector> &activeDevices, std::shared_ptr &streamDesc); + void HandlePlaybackStreamInA2dp(std::shared_ptr &streamDesc, bool isCreateProcess); private: std::shared_ptr eventEntry_; std::shared_ptr audioPolicyServerHandler_ = nullptr; 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..f32c496cab 100644 --- a/services/audio_policy/services/core/src/audio_core_service.cpp +++ b/services/audio_policy/services/core/src/audio_core_service.cpp @@ -151,7 +151,7 @@ int32_t AudioCoreService::CreateRendererClient( AUDIO_INFO_LOG("Device type %{public}d", device->deviceType_); } - SetPlaybackStreamFlag(streamDesc); + UpdatePlaybackStreamFlag(streamDesc, true); AUDIO_INFO_LOG("Will use audio flag: %{public}u", streamDesc->audioFlag_); // Fetch pipe @@ -189,10 +189,12 @@ bool AudioCoreService::IsStreamSupportMultiChannel(std::shared_ptrnewDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_SPEAKER && - streamDesc->newDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP) { - AUDIO_INFO_LOG("normal stream, deviceType: %{public}d", streamDesc->newDeviceDescs_[0]->deviceType_); - return false; + (streamDesc->newDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP || + streamDesc->newDeviceDescs_[0]->a2dpOffloadFlag_ != A2DP_OFFLOAD)) { + AUDIO_INFO_LOG("normal stream, deviceType: %{public}d", streamDesc->newDeviceDescs_[0]->deviceType_); + return false; } if (streamDesc->streamInfo_.channels <= STEREO) { AUDIO_INFO_LOG("normal stream beacuse channels."); @@ -224,7 +226,7 @@ bool AudioCoreService::IsStreamSupportDirect(std::shared_ptr &streamDesc) +void AudioCoreService::UpdatePlaybackStreamFlag(std::shared_ptr &streamDesc, bool isCreateProcess) { AUDIO_INFO_LOG("deviceType: %{public}d", streamDesc->newDeviceDescs_.front()->deviceType_); // fast/normal has done in audioRendererPrivate @@ -265,11 +267,17 @@ void AudioCoreService::SetPlaybackStreamFlag(std::shared_ptraudioFlag_ = CheckIsSpecialStream(streamDesc); + streamDesc->audioFlag_ = SetFlagForSpecialStream(streamDesc, isCreateProcess); } -AudioFlag AudioCoreService::CheckIsSpecialStream(std::shared_ptr &streamDesc) +AudioFlag AudioCoreService::SetFlagForSpecialStream(std::shared_ptr &streamDesc, + bool isCreateProcess) { + CHECK_AND_RETURN_RET_LOG(streamDesc != nullptr && streamDesc->newDeviceDescs_.size() > 0 && + streamDesc->newDeviceDescs_[0] != nullptr, AUDIO_OUTPUT_FLAG_NORMAL, "Invalid stream desc"); + if (streamDesc->newDeviceDescs_[0]->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP) { + HandlePlaybackStreamInA2dp(streamDesc, isCreateProcess); + } if (IsStreamSupportDirect(streamDesc)) { return AUDIO_OUTPUT_FLAG_HD; } @@ -983,7 +991,7 @@ int32_t AudioCoreService::FetchOutputDeviceAndRoute(const AudioStreamDeviceChang AUDIO_INFO_LOG("DeviceType %{public}d, state: %{public}u", streamDesc->newDeviceDescs_[0]->deviceType_, streamDesc->streamStatus_); - SetPlaybackStreamFlag(streamDesc); + UpdatePlaybackStreamFlag(streamDesc, false); if (!HandleOutputStreamInRunning(streamDesc, reason)) { continue; } 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..01e0b38539 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 @@ -1578,12 +1578,15 @@ bool AudioCoreService::IsStreamSupportLowpower(std::shared_ptrnewDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_SPEAKER && - streamDesc->newDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_USB_HEADSET) { - AUDIO_INFO_LOG("normal stream, deviceType: %{public}d", streamDesc->newDeviceDescs_[0]->deviceType_); - return false; - } - return false; + streamDesc->newDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_USB_HEADSET && + (streamDesc->newDeviceDescs_[0]->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP || + streamDesc->newDeviceDescs_[0]->a2dpOffloadFlag_ != A2DP_OFFLOAD)) { + AUDIO_INFO_LOG("normal stream, deviceType: %{public}d", streamDesc->newDeviceDescs_[0]->deviceType_); + return false; + } + return true; } int32_t AudioCoreService::SetDefaultOutputDevice(const DeviceType deviceType, const uint32_t sessionID, @@ -2078,5 +2081,47 @@ void AudioCoreService::HandleDualStartClient(std::vectornewDeviceDescs_[1]->deviceType_, DeviceFlag::OUTPUT_DEVICES_FLAG)); } } + +void AudioCoreService::HandlePlaybackStreamInA2dp(std::shared_ptr &streamDesc, + bool isCreateProcess) +{ +#ifdef BLUETOOTH_ENABLE + CHECK_AND_RETURN_LOG(streamDesc != nullptr && streamDesc->newDeviceDescs_.size() > 0 && + streamDesc->newDeviceDescs_[0] != nullptr, "Invalid stream desc"); + vector allSessionInfos; + Bluetooth::A2dpStreamInfo a2dpStreamInfo; + vector> audioRendererChangeInfos; + streamCollector_.GetCurrentRendererChangeInfos(audioRendererChangeInfos); + AUDIO_INFO_LOG("Current renderer number: %{public}zu, isCreateProcess: %{public}d", + audioRendererChangeInfos.size(), isCreateProcess); + for (auto &changeInfo : audioRendererChangeInfos) { + a2dpStreamInfo.sessionId = changeInfo->sessionId; + a2dpStreamInfo.streamType = streamCollector_.GetStreamType(changeInfo->sessionId); + StreamUsage tempStreamUsage = changeInfo->rendererInfo.streamUsage; + AudioSpatializationState spatialState = + AudioSpatializationService::GetAudioSpatializationService().GetSpatializationState(tempStreamUsage); + a2dpStreamInfo.isSpatialAudio = spatialState.spatializationEnabled; + allSessionInfos.push_back(a2dpStreamInfo); + } + if (isCreateProcess) { + a2dpStreamInfo.sessionId = streamDesc->sessionId_; + StreamUsage tempStreamUsage = streamDesc->rendererInfo_.streamUsage; + a2dpStreamInfo.streamType = + streamCollector_.GetStreamType(streamDesc->rendererInfo_.contentType, tempStreamUsage); + AudioSpatializationState spatialState = + AudioSpatializationService::GetAudioSpatializationService().GetSpatializationState(tempStreamUsage); + a2dpStreamInfo.isSpatialAudio = spatialState.spatializationEnabled; + allSessionInfos.push_back(a2dpStreamInfo); + } + auto receiveOffloadFlag = + static_cast(Bluetooth::AudioA2dpManager::A2dpOffloadSessionRequest(allSessionInfos)); + AUDIO_INFO_LOG("A2dp offload flag: %{public}d", receiveOffloadFlag); + if (receiveOffloadFlag != A2DP_OFFLOAD) { + streamDesc->newDeviceDescs_[0]->a2dpOffloadFlag_ = receiveOffloadFlag; + return; + } + streamDesc->newDeviceDescs_[0]->a2dpOffloadFlag_ = A2DP_OFFLOAD; +#endif +} } } -- Gitee