From 15a0811a68f9ee18deb9e4cb6337c12a3227e461 Mon Sep 17 00:00:00 2001 From: dlluhj Date: Tue, 3 Sep 2024 23:05:23 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BC=BA=E9=80=89=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E4=B8=8E=E5=BD=93=E5=89=8D=E6=B5=81=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=E6=98=AF=E5=90=A6=E7=9B=B8=E7=AC=A6=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: dlluhj --- .../include/service/audio_policy_service.h | 2 +- .../src/service/audio_policy_service.cpp | 45 ++++++++++++++----- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/services/audio_policy/server/include/service/audio_policy_service.h b/services/audio_policy/server/include/service/audio_policy_service.h index 0c8598cb60..1bc7dfc3d0 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -657,7 +657,7 @@ private: void MoveToNewInputDevice(unique_ptr &capturerChangeInfo, unique_ptr &inputDevice); - void SetRenderDeviceForUsage(StreamUsage streamUsage, sptr desc); + int32_t SetRenderDeviceForUsage(StreamUsage streamUsage, sptr desc); void SetCaptureDeviceForUsage(AudioScene scene, SourceType srcType, sptr desc); diff --git a/services/audio_policy/server/src/service/audio_policy_service.cpp b/services/audio_policy/server/src/service/audio_policy_service.cpp index e1859507c7..65f1498e0a 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -1145,13 +1145,33 @@ void AudioPolicyService::NotifyUserSelectionEventToBt(sptr desc) +int32_t AudioPolicyService::SetRenderDeviceForUsage(StreamUsage streamUsage, sptr desc) { + auto isPresent = [&desc] (const unique_ptr &device) { + return (desc->deviceType_ == device->deviceType_) && + (desc->macAddress_ == device->macAddress_) && + (desc->networkId_ == device->networkId_) && + (desc->deviceId_ == device->deviceId_); + }; if (streamUsage == STREAM_USAGE_VOICE_COMMUNICATION || streamUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION || streamUsage == STREAM_USAGE_VIDEO_COMMUNICATION) { - SetPreferredDevice(AUDIO_CALL_RENDER, desc); + std::vector> devices = GetAvailableDevicesInner(CALL_OUTPUT_DEVICES); + auto itr = std::find_if(devices.begin(), devices.end(), isPresent); + CHECK_AND_RETURN_RET_LOG(itr != devices.end(), ERR_INVALID_OPERATION, + "device not available type:%{public}d macAddress:%{public}s id:%{public}d networkId:%{public}s", + desc->deviceType_, GetEncryptStr(desc->networkId_).c_str(), + desc->deviceId_, GetEncryptAddr(desc->macAddress_).c_str()); + SetPreferredDevice(AUDIO_CALL_RENDER, new(std::nothrow) AudioDeviceDescriptor(**itr)); + return SUCCESS; } else { - SetPreferredDevice(AUDIO_MEDIA_RENDER, desc); + std::vector> devices = GetAvailableDevicesInner(MEDIA_OUTPUT_DEVICES); + auto itr = std::find_if(devices.begin(), devices.end(), isPresent); + CHECK_AND_RETURN_RET_LOG(itr != devices.end(), ERR_INVALID_OPERATION, + "device not available type:%{public}d macAddress:%{public}s id:%{public}d networkId:%{public}s", + desc->deviceType_, GetEncryptStr(desc->networkId_).c_str(), + desc->deviceId_, GetEncryptAddr(desc->macAddress_).c_str()); + SetPreferredDevice(AUDIO_MEDIA_RENDER, new(std::nothrow) AudioDeviceDescriptor(**itr)); + return SUCCESS; } } @@ -1174,11 +1194,12 @@ int32_t AudioPolicyService::SelectOutputDevice(sptr audioRe AUDIO_INFO_LOG("uid[%{public}d] type[%{public}d] mac[%{public}s] streamUsage[%{public}d] pid[%{public}d]", audioRendererFilter->uid, selectedDesc[0]->deviceType_, GetEncryptAddr(selectedDesc[0]->macAddress_).c_str(), audioRendererFilter->rendererInfo.streamUsage, IPCSkeleton::GetCallingPid()); - // check size == 1 && output device - int32_t res = DeviceParamsCheck(DeviceRole::OUTPUT_DEVICE, selectedDesc); - CHECK_AND_RETURN_RET_LOG(res == SUCCESS, res, "DeviceParamsCheck no success"); + + CHECK_AND_RETURN_RET_LOG((selectedDesc[0]->deviceRole_ == DeviceRole::OUTPUT_DEVICE) && + (selectedDesc.size() == 1), ERR_INVALID_OPERATION, "DeviceCheck no success"); if (audioRendererFilter->rendererInfo.rendererFlags == STREAM_FLAG_FAST) { - SetRenderDeviceForUsage(audioRendererFilter->rendererInfo.streamUsage, selectedDesc[0]); + int32_t res = SetRenderDeviceForUsage(audioRendererFilter->rendererInfo.streamUsage, selectedDesc[0]); + CHECK_AND_RETURN_RET_LOG(res == SUCCESS, res, "SetRenderDeviceForUsage fail"); SelectFastOutputDevice(audioRendererFilter, selectedDesc[0]); FetchDevice(true, AudioStreamDeviceChangeReason::OVERRODE); return true; @@ -1197,7 +1218,8 @@ int32_t AudioPolicyService::SelectOutputDevice(sptr audioRe ClearScoDeviceSuspendState(selectedDesc[0]->macAddress_); } StreamUsage strUsage = audioRendererFilter->rendererInfo.streamUsage; - SetRenderDeviceForUsage(strUsage, selectedDesc[0]); + int32_t res = SetRenderDeviceForUsage(strUsage, selectedDesc[0]); + CHECK_AND_RETURN_RET_LOG(res == SUCCESS, res, "SetRenderDeviceForUsage fail"); // If the selected device is virtual device, connect it. if (isVirtualDevice) { @@ -1208,14 +1230,13 @@ int32_t AudioPolicyService::SelectOutputDevice(sptr audioRe } NotifyUserSelectionEventToBt(selectedDesc[0]); - std::string networkId = selectedDesc[0]->networkId_; - DeviceType deviceType = selectedDesc[0]->deviceType_; FetchDevice(true, AudioStreamDeviceChangeReason::OVERRODE); FetchDevice(false); - if ((deviceType != DEVICE_TYPE_BLUETOOTH_A2DP) || (networkId != LOCAL_NETWORK_ID)) { + if ((selectedDesc[0]->deviceType_ != DEVICE_TYPE_BLUETOOTH_A2DP) || + (selectedDesc[0]->networkId_ != LOCAL_NETWORK_ID)) { UpdateOffloadWhenActiveDeviceSwitchFromA2dp(); } else { - UpdateA2dpOffloadFlagForAllStream(deviceType); + UpdateA2dpOffloadFlagForAllStream(selectedDesc[0]->deviceType_); } OnPreferredOutputDeviceUpdated(currentActiveDevice_); WriteSelectOutputSysEvents(selectedDesc, strUsage); -- Gitee