From c8cdb7ac652f4faad55de1e2fb47d3b0eebe0e3f Mon Sep 17 00:00:00 2001 From: wisdom Date: Fri, 19 Jul 2024 16:50:51 +0800 Subject: [PATCH] =?UTF-8?q?Description:=20=E9=9F=B3=E9=A2=91=E6=A1=86?= =?UTF-8?q?=E6=9E=B6=E6=94=AF=E6=8C=81=E6=99=BA=E6=85=A7=E8=AF=AD=E9=9F=B3?= =?UTF-8?q?=E5=BD=95=E9=9F=B3=E9=BB=98=E8=AE=A4=E8=AE=BE=E5=A4=87=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=AD=96=E7=95=A5=20Sig:=20EMUI=20Feature=20or=20Bugf?= =?UTF-8?q?ix:=20Feature=20Binary=20Source:=20No?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wisdom --- .../audio_bluetooth_manager.cpp | 23 +++++++++++ .../bluetoothclient/audio_bluetooth_manager.h | 4 ++ .../audiocommon/include/audio_device_info.h | 1 + .../server/config/audio_device_privacy.xml | 2 +- .../include/service/audio_device_manager.h | 2 + .../include/service/audio_policy_service.h | 7 ++++ .../src/service/audio_device_manager.cpp | 15 +++++++ .../src/service/audio_policy_service.cpp | 39 +++++++++++++++++-- .../service/config/audio_device_parser.cpp | 2 + .../routers/privacy_priority_router.cpp | 8 ++++ 10 files changed, 99 insertions(+), 4 deletions(-) diff --git a/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp b/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp index a1b587711d..92eb6b2a5b 100644 --- a/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp +++ b/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp @@ -36,6 +36,7 @@ HandsFreeAudioGateway *AudioHfpManager::hfpInstance_ = nullptr; std::shared_ptr AudioHfpManager::hfpListener_ = std::make_shared(); AudioScene AudioHfpManager::scene_ = AUDIO_SCENE_DEFAULT; AudioScene AudioHfpManager::sceneFromPolicy_ = AUDIO_SCENE_DEFAULT; +OHOS::Bluetooth::ScoCategory AudioHfpManager::scoCategory = OHOS::Bluetooth::ScoCategory::SCO_DEFAULT; BluetoothRemoteDevice AudioHfpManager::activeHfpDevice_; std::mutex g_activehfpDeviceLock; std::mutex g_audioSceneLock; @@ -311,6 +312,28 @@ void AudioHfpManager::CheckHfpDeviceReconnect() } } +int32_t AudioHfpManager::HandleScoWithRecongnition(bool handleFlag, BluetoothRemoteDevice &device) +{ + CHECK_AND_RETURN_RET_LOG(hfpInstance_ != nullptr, ERROR, "HFP AG profile instance unavailable"); + int32_t ret; + if (handleFlag) { + AUDIO_INFO_LOG(" Recongnition sco connect"); + ret = hfpInstance_->OpenVoiceRecognition(device); + AudioHfpManager::scoCategory = ScoCategory::SCO_RECOGNITION; + } else { + AUDIO_INFO_LOG(" Recongnition sco close"); + ret = hfpInstance_->CloseVoiceRecognition(device); + AudioHfpManager::scoCategory = ScoCategory::SCO_DEFAULT; + } + CHECK_AND_RETURN_RET_LOG(ret == 0, ERROR, "HandleScoWithRecongnition failed, result: %{public}d", ret); + return SUCCESS; +} + +ScoCategory AudioHfpManager::GetScoCategory() +{ + return scoCategory; +} + int32_t AudioHfpManager::SetActiveHfpDevice(const std::string &macAddress) { AUDIO_INFO_LOG("AudioHfpManager::SetActiveHfpDevice"); diff --git a/frameworks/native/bluetoothclient/audio_bluetooth_manager.h b/frameworks/native/bluetoothclient/audio_bluetooth_manager.h index 3c531f3492..2493a3047d 100644 --- a/frameworks/native/bluetoothclient/audio_bluetooth_manager.h +++ b/frameworks/native/bluetoothclient/audio_bluetooth_manager.h @@ -21,6 +21,7 @@ #include "bluetooth_avrcp_tg.h" #include "bluetooth_hfp_ag.h" #include "audio_info.h" +#include "bluetooth_device_utils.h" namespace OHOS { namespace Bluetooth { @@ -113,6 +114,8 @@ public: static AudioStandard::AudioScene GetCurrentAudioScene(); static AudioStandard::AudioScene GetPolicyAudioScene(); static void SetAudioSceneFromPolicy(AudioStandard::AudioScene scene); + static int32_t HandleScoWithRecongnition(bool handleFlag, BluetoothRemoteDevice &device); + static ScoCategory GetScoCategory(); private: static HandsFreeAudioGateway *hfpInstance_; @@ -120,6 +123,7 @@ private: static AudioStandard::AudioScene scene_; static AudioStandard::AudioScene sceneFromPolicy_; static BluetoothRemoteDevice activeHfpDevice_; + static ScoCategory scoCategory; }; } } diff --git a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h index 090fdcf0d7..0fa02ea8f9 100644 --- a/interfaces/inner_api/native/audiocommon/include/audio_device_info.h +++ b/interfaces/inner_api/native/audiocommon/include/audio_device_info.h @@ -283,6 +283,7 @@ enum DeviceCategory { enum DeviceUsage { MEDIA = 1, VOICE = 2, + RECONGNITION = 3, ALL_USAGE, }; diff --git a/services/audio_policy/server/config/audio_device_privacy.xml b/services/audio_policy/server/config/audio_device_privacy.xml index e06b485554..58edd5d9f4 100644 --- a/services/audio_policy/server/config/audio_device_privacy.xml +++ b/services/audio_policy/server/config/audio_device_privacy.xml @@ -21,7 +21,7 @@ - + diff --git a/services/audio_policy/server/include/service/audio_device_manager.h b/services/audio_policy/server/include/service/audio_device_manager.h index d9503066d0..e3141f4355 100644 --- a/services/audio_policy/server/include/service/audio_device_manager.h +++ b/services/audio_policy/server/include/service/audio_device_manager.h @@ -57,6 +57,7 @@ public: vector> GetMediaCapturePublicDevices(); vector> GetCapturePrivacyDevices(); vector> GetCapturePublicDevices(); + vector> GetRecongnitionCapturePrivacyDevices(); unique_ptr GetCommRenderDefaultDevice(StreamUsage streamUsage); unique_ptr GetRenderDefaultDevice(); unique_ptr GetCaptureDefaultDevice(); @@ -144,6 +145,7 @@ private: vector> capturePrivacyDevices_; vector> capturePublicDevices_; vector> connectedDevices_; + vector> reconCapturePrivacyDevices_; unordered_map> devicePrivacyMaps_ = {}; sptr earpiece_ = nullptr; sptr speaker_ = nullptr; 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 d581e26526..259206cc24 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -656,6 +656,11 @@ private: void FetchInputDevice(vector> &capturerChangeInfos, const AudioStreamDeviceChangeReason reason = AudioStreamDeviceChangeReason::UNKNOWN); + void BluetoothScoFetch(unique_ptr desc, + vector> capturerChangeInfos, SourceType sourceType); + + void BluetoothScoDisconectForRecongnition(); + void FetchDevice(bool isOutputDevice = true, const AudioStreamDeviceChangeReasonExt reason = AudioStreamDeviceChangeReason::UNKNOWN); @@ -941,6 +946,8 @@ private: void UpdateEffectBtOffloadSupported(const bool &isSupported); + int32_t ScoInputDeviceFetchedForRecongnition(bool handleFlag, const std::string &address); + bool isUpdateRouteSupported_ = true; bool isCurrentRemoteRenderer = false; bool remoteCapturerSwitch_ = false; diff --git a/services/audio_policy/server/src/service/audio_device_manager.cpp b/services/audio_policy/server/src/service/audio_device_manager.cpp index c96175a618..e647cfa40c 100644 --- a/services/audio_policy/server/src/service/audio_device_manager.cpp +++ b/services/audio_policy/server/src/service/audio_device_manager.cpp @@ -304,6 +304,8 @@ void AudioDeviceManager::AddCaptureDevices(const shared_ptr &devDesc) @@ -559,6 +561,18 @@ vector> AudioDeviceManager::GetCapturePublicDe return descs; } +vector> AudioDeviceManager::GetRecongnitionCapturePrivacyDevices() +{ + vector> descs; + for (const auto &desc : reconCapturePrivacyDevices_) { + if (desc == nullptr) { + continue; + } + descs.push_back(make_unique(*desc)); + } + return descs; +} + unique_ptr AudioDeviceManager::GetCommRenderDefaultDevice(StreamUsage streamUsage) { if (streamUsage < STREAM_USAGE_UNKNOWN || streamUsage > STREAM_USAGE_VOICE_MODEM_COMMUNICATION) { @@ -934,6 +948,7 @@ void AudioDeviceManager::RemoveCaptureDevices(const AudioDeviceDescriptor &devDe { RemoveMatchDeviceInArray(devDesc, "capture privacy device", capturePrivacyDevices_); RemoveMatchDeviceInArray(devDesc, "capture public device", capturePublicDevices_); + RemoveMatchDeviceInArray(devDesc, "capture recon privacy device", reconCapturePrivacyDevices_); } vector> AudioDeviceManager::GetDevicesByFilter(DeviceType devType, DeviceRole devRole, 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 377936c417..d92933f0d0 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -2506,9 +2506,9 @@ void AudioPolicyService::FetchInputDevice(vectordeviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) { - int32_t ret = HandleScoInputDeviceFetched(desc, capturerChangeInfos); - CHECK_AND_RETURN_LOG(ret == SUCCESS, "sco [%{public}s] is not connected yet", - GetEncryptAddr(desc->macAddress_).c_str()); + BluetoothScoFetch(std::move(desc), std::move(capturerChangeInfos), sourceType); + desc = std::move_if_noexcept(desc); + capturerChangeInfos = std::move_if_noexcept(capturerChangeInfos); } if (needUpdateActiveDevice) { if (!IsSameDevice(desc, currentActiveInputDevice_)) { @@ -2526,6 +2526,7 @@ void AudioPolicyService::FetchInputDevice(vectorsessionId, desc->deviceType_); } + BluetoothScoDisconectForRecongnition(); if (isUpdateActiveDevice) { OnPreferredInputDeviceUpdated(currentActiveInputDevice_.deviceType_, currentActiveInputDevice_.networkId_); } @@ -2534,6 +2535,31 @@ void AudioPolicyService::FetchInputDevice(vector desc, + vector> capturerChangeInfos, SourceType sourceType) +{ + int32_t ret; + unique_ptr localDesc = std::move(desc); + vector> localCapturerChangeInfos = std::move(capturerChangeInfos); + if (sourceType == SOURCE_TYPE_VOICE_RECOGNITION) { + ret = ScoInputDeviceFetchedForRecongnition(true, localDesc->macAddress_); + } else { + ret = HandleScoInputDeviceFetched(localDesc, localCapturerChangeInfos); + } + CHECK_AND_RETURN_LOG(ret == SUCCESS, "sco [%{public}s] is not connected yet", + GetEncryptAddr(localDesc->macAddress_).c_str()); +} + +void AudioPolicyService::BluetoothScoDisconectForRecongnition() +{ + if (Bluetooth::AudioHfpManager::GetScoCategory() != Bluetooth::ScoCategory::SCO_RECOGNITION && + currentActiveInputDevice_.deviceType_ != DEVICE_TYPE_BLUETOOTH_SCO && audioDeviceManager_.GetScoState()) { + int32_t ret = ScoInputDeviceFetchedForRecongnition(false, currentActiveInputDevice_.macAddress_); + CHECK_AND_RETURN_LOG(ret == SUCCESS, "sco [%{public}s] disconnected failed", + GetEncryptAddr(currentActiveInputDevice_.macAddress_).c_str()); + } +} + void AudioPolicyService::WriteInputRouteChangeEvent(unique_ptr &desc, const AudioStreamDeviceChangeReason reason) { @@ -8111,5 +8137,12 @@ void AudioPolicyService::UpdateEffectBtOffloadSupported(const bool &isSupported) IPCSkeleton::SetCallingIdentity(identity); return; } + +int32_t AudioPolicyService::ScoInputDeviceFetchedForRecongnition(bool handleFlag, const std::string &address) +{ + Bluetooth::BluetoothRemoteDevice device = Bluetooth::BluetoothRemoteDevice(address); + return Bluetooth::AudioHfpManager::HandleScoWithRecongnition(handleFlag, device); +} + } // namespace AudioStandard } // namespace OHOS diff --git a/services/audio_policy/server/src/service/config/audio_device_parser.cpp b/services/audio_policy/server/src/service/config/audio_device_parser.cpp index 2f965a0a9d..ce7aa40a9e 100644 --- a/services/audio_policy/server/src/service/config/audio_device_parser.cpp +++ b/services/audio_policy/server/src/service/config/audio_device_parser.cpp @@ -255,6 +255,8 @@ void AudioDeviceParser::ParseDeviceUsage(const std::string &deviceUsage, uint32_ deviceUsageFlag |= DeviceUsage::MEDIA; } else if (usage == "voice") { deviceUsageFlag |= DeviceUsage::VOICE; + } else if (usage == "recongnition") { + deviceUsageFlag |= DeviceUsage::RECONGNITION; } } } diff --git a/services/audio_policy/server/src/service/routers/privacy_priority_router.cpp b/services/audio_policy/server/src/service/routers/privacy_priority_router.cpp index a9807e9b0e..e17863306c 100644 --- a/services/audio_policy/server/src/service/routers/privacy_priority_router.cpp +++ b/services/audio_policy/server/src/service/routers/privacy_priority_router.cpp @@ -113,6 +113,14 @@ vector> PrivacyPriorityRouter::GetRingRen unique_ptr PrivacyPriorityRouter::GetRecordCaptureDevice(SourceType sourceType, int32_t clientUID) { + if (sourceType == SOURCE_TYPE_VOICE_RECOGNITION) { + vector> descs = + AudioDeviceManager::GetAudioDeviceManager().GetRecongnitionCapturePrivacyDevices(); + unique_ptr desc = GetLatestConnectDeivce(descs); + AUDIO_DEBUG_LOG(" RecongnitionsourceType %{public}d clientUID %{public}d fetch device %{public}d", sourceType, + clientUID, desc->deviceType_); + return desc; + } vector> descs = AudioDeviceManager::GetAudioDeviceManager().GetMediaCapturePrivacyDevices(); unique_ptr desc = GetLatestConnectDeivce(descs); -- Gitee