diff --git a/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp b/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp index a1b587711dca27d8684e213df7914694a33f3c35..92eb6b2a5b4cc8e79851048c87ede8544e9dcff8 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 3c531f349222387727744e9869090fe7e932deb4..2493a3047dc2df1e7c25b1e901b32612974c0204 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 090fdcf0d773abb2009e3ed55e4b97c61402eb3a..0fa02ea8f954e155abbe3b98c8400c2423f47b58 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 e06b4855542974aaf22ecac91aa2bbf4fd88a299..58edd5d9f4263e36ef2793e0038849bca12713e3 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 d9503066d0cce6924cfd215272a65fc1519defe1..e3141f4355337216f5008d431252687d6e5458b4 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 d581e265264b00a2620799498cfc97e0a98b40b8..259206cc2461545537f653bd6e21eb149ba089f4 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 c96175a61807e4e19925f753428af926e546d119..e647cfa40cfd2776597e02864b08130a55e278ce 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 377936c417b43a4358996daa4d25d4aff7806b55..d92933f0d0db4b6ab7acc299fbc5b49b682bfd28 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 2f965a0a9df71cdfd35eb71a708ed7015c112541..ce7aa40a9e5a56009f78b1ce247d5d03a087062b 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 a9807e9b0ebc9e2e43fdc2ce33eed9004ffc2986..e17863306cc7f3a53f7efb25cb77a6a560bca968 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);