From 40fda05d589f51984662e390f547e3cf3b28dd1e Mon Sep 17 00:00:00 2001 From: huyue57 Date: Wed, 27 Mar 2024 04:08:49 +0000 Subject: [PATCH] not reconnect sco when user terminated from peripheral device Signed-off-by: huyue57 Change-Id: I8d08a6837a4585e15b86d7bc5b3faee2f470cd23 --- .../audio_bluetooth_manager.cpp | 4 ++-- .../bluetooth_device_manager.cpp | 10 +++++++-- .../bluetooth_device_manager.h | 2 +- .../include/service/audio_device_manager.h | 2 ++ .../include/service/audio_policy_service.h | 2 ++ .../src/service/audio_device_manager.cpp | 22 +++++++++++++++++-- .../src/service/audio_policy_service.cpp | 18 +++++++++++++++ 7 files changed, 53 insertions(+), 7 deletions(-) diff --git a/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp b/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp index 587da99de3..2a1d76ea19 100644 --- a/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp +++ b/frameworks/native/bluetoothclient/audio_bluetooth_manager.cpp @@ -377,7 +377,7 @@ void AudioHfpManager::UpdateAudioScene(AudioScene scene) void AudioHfpListener::OnScoStateChanged(const BluetoothRemoteDevice &device, int state, int reason) { - AUDIO_INFO_LOG("AudioHfpListener::OnScoStateChanged: state: [%{public}d]", state); + AUDIO_INFO_LOG("AudioHfpListener::OnScoStateChanged: state: [%{public}d] reason: [%{public}d]", state, reason); HfpScoConnectState scoState = static_cast(state); if (scoState == HfpScoConnectState::SCO_CONNECTED || scoState == HfpScoConnectState::SCO_DISCONNECTED) { if (device.GetDeviceAddr() == AudioHfpManager::GetCurrentActiveHfpDevice() && @@ -386,7 +386,7 @@ void AudioHfpListener::OnScoStateChanged(const BluetoothRemoteDevice &device, in AudioHfpManager::UpdateAudioScene(AUDIO_SCENE_DEFAULT); } bool isConnected = (scoState == HfpScoConnectState::SCO_CONNECTED) ? true : false; - HfpBluetoothDeviceManager::OnScoStateChanged(device, isConnected); + HfpBluetoothDeviceManager::OnScoStateChanged(device, isConnected, reason); } } diff --git a/frameworks/native/bluetoothclient/bluetooth_device_manager.cpp b/frameworks/native/bluetoothclient/bluetooth_device_manager.cpp index 5c76ac5d8c..bf44f8dc5e 100644 --- a/frameworks/native/bluetoothclient/bluetooth_device_manager.cpp +++ b/frameworks/native/bluetoothclient/bluetooth_device_manager.cpp @@ -32,6 +32,7 @@ const int USER_SELECTION = 1; const int ADDRESS_STR_LEN = 17; const int START_POS = 6; const int END_POS = 13; +const int HFP_AG_SCO_REMOTE_USER_TERMINATED = 2; const std::map, DeviceCategory> bluetoothDeviceCategoryMap_ = { {std::make_pair(BluetoothDevice::MAJOR_AUDIO_VIDEO, BluetoothDevice::AUDIO_VIDEO_HEADPHONES), BT_HEADPHONE}, {std::make_pair(BluetoothDevice::MAJOR_AUDIO_VIDEO, BluetoothDevice::AUDIO_VIDEO_WEARABLE_HEADSET), BT_HEADPHONE}, @@ -768,12 +769,17 @@ void HfpBluetoothDeviceManager::ClearAllHfpBluetoothDevice() wearDetectionStateMap_.clear(); } -void HfpBluetoothDeviceManager::OnScoStateChanged(const BluetoothRemoteDevice &device, bool isConnected) +void HfpBluetoothDeviceManager::OnScoStateChanged(const BluetoothRemoteDevice &device, bool isConnected, int reason) { AudioDeviceDescriptor desc; desc.deviceType_ = DEVICE_TYPE_BLUETOOTH_SCO; desc.macAddress_ = device.GetDeviceAddr(); - desc.connectState_ = isConnected == true ? ConnectState::CONNECTED : ConnectState::DEACTIVE_CONNECTED; + if (isConnected) { + desc.connectState_ = ConnectState::CONNECTED; + } else { + desc.connectState_ = reason == HFP_AG_SCO_REMOTE_USER_TERMINATED ? ConnectState::SUSPEND_CONNECTED + : ConnectState::DEACTIVE_CONNECTED; + } std::lock_guard observerLock(g_observerLock); if (g_deviceObserver != nullptr) { g_deviceObserver->OnDeviceInfoUpdated(desc, DeviceInfoUpdateCommand::CONNECTSTATE_UPDATE); diff --git a/frameworks/native/bluetoothclient/bluetooth_device_manager.h b/frameworks/native/bluetoothclient/bluetooth_device_manager.h index dd3fe4b5b8..ba35c2406c 100644 --- a/frameworks/native/bluetoothclient/bluetooth_device_manager.h +++ b/frameworks/native/bluetoothclient/bluetooth_device_manager.h @@ -89,7 +89,7 @@ public: static bool IsHfpBluetoothDeviceExist(const std::string& macAddress); static void UpdateHfpDeviceConfiguration(const BluetoothRemoteDevice &device, const AudioStandard::AudioStreamInfo &streamInfo); - static void OnScoStateChanged(const BluetoothRemoteDevice &device, bool isConnected); + static void OnScoStateChanged(const BluetoothRemoteDevice &device, bool isConnected, int reason); static int32_t GetConnectedHfpBluetoothDevice(const std::string& macAddress, BluetoothRemoteDevice &device); static void ClearAllHfpBluetoothDevice(); 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 708d91f2ff..1ca787249b 100644 --- a/services/audio_policy/server/include/service/audio_device_manager.h +++ b/services/audio_policy/server/include/service/audio_device_manager.h @@ -69,6 +69,8 @@ public: const std::string &macAddress); void UpdateScoState(const std::string &macAddress, bool isConnnected); void UpdateEarpieceStatus(const bool hasEarPiece); + vector> GetDevicesByFilter(DeviceType devType, DeviceRole devRole, + const string &macAddress, const string &networkId, ConnectState connectState); private: AudioDeviceManager(); 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 1a920d1172..1915102796 100644 --- a/services/audio_policy/server/include/service/audio_policy_service.h +++ b/services/audio_policy/server/include/service/audio_policy_service.h @@ -698,6 +698,8 @@ private: void RectifyModuleInfo(AudioModuleInfo moduleInfo, AudioAdapterInfo audioAdapterInfo, SourceInfo targetInfo); + void ClearScoDeviceSuspendState(string macAddress = ""); + 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 4a411eab3b..6140119b3e 100644 --- a/services/audio_policy/server/src/service/audio_device_manager.cpp +++ b/services/audio_policy/server/src/service/audio_device_manager.cpp @@ -791,8 +791,8 @@ void AudioDeviceManager::UpdateConnectState(const shared_ptrconnectState_ = SUSPEND_CONNECTED; } else if (desc->deviceType_ == DEVICE_TYPE_BLUETOOTH_A2DP && desc->connectState_ == SUSPEND_CONNECTED && - devDesc->connectState_ == DEACTIVE_CONNECTED) { - // sco deactive, a2dp CONNECTED + (devDesc->connectState_ == DEACTIVE_CONNECTED || devDesc->connectState_ == SUSPEND_CONNECTED)) { + // sco deactive or suspend, a2dp CONNECTED desc->connectState_ = CONNECTED; } } @@ -891,5 +891,23 @@ void AudioDeviceManager::RemoveCaptureDevices(const AudioDeviceDescriptor &devDe RemoveMatchDeviceInArray(devDesc, "capture privacy device", capturePrivacyDevices_); RemoveMatchDeviceInArray(devDesc, "capture public device", capturePublicDevices_); } + +vector> AudioDeviceManager::GetDevicesByFilter(DeviceType devType, DeviceRole devRole, + const string &macAddress, const string &networkId, ConnectState connectState) +{ + vector> audioDeviceDescriptors; + + lock_guard connectLock(connectedDevicesMutex_); + for (const auto &desc : connectedDevices_) { + if ((devType == DEVICE_TYPE_NONE || devType == desc->deviceType_) && + (devRole == DEVICE_ROLE_NONE || devRole == desc->deviceRole_) && + (macAddress == "" || macAddress == desc->macAddress_) && + (networkId == "" || networkId == desc->networkId_) && (connectState == desc->connectState_)) { + audioDeviceDescriptors.push_back(desc); + } + } + AUDIO_DEBUG_LOG("Filter device size %{public}zu", audioDeviceDescriptors.size()); + return audioDeviceDescriptors; +} } } 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 6ee5273c4a..eca91e3872 100644 --- a/services/audio_policy/server/src/service/audio_policy_service.cpp +++ b/services/audio_policy/server/src/service/audio_policy_service.cpp @@ -873,6 +873,9 @@ int32_t AudioPolicyService::SelectOutputDevice(sptr audioRe audioDeviceDescriptors[0]->isEnable_ = true; audioDeviceManager_.UpdateDevicesListInfo(audioDeviceDescriptors[0], ENABLE_UPDATE); } + if (audioDeviceDescriptors[0]->deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO) { + ClearScoDeviceSuspendState(audioDeviceDescriptors[0]->macAddress_); + } StreamUsage strUsage = audioRendererFilter->rendererInfo.streamUsage; if (strUsage == STREAM_USAGE_VOICE_COMMUNICATION || strUsage == STREAM_USAGE_VOICE_MODEM_COMMUNICATION || strUsage == STREAM_USAGE_VIDEO_COMMUNICATION) { @@ -2486,6 +2489,7 @@ int32_t AudioPolicyService::SetAudioScene(AudioScene audioScene) #ifdef BLUETOOTH_ENABLE Bluetooth::AudioHfpManager::DisconnectSco(); #endif + ClearScoDeviceSuspendState(); } // fetch input&output device @@ -3461,6 +3465,7 @@ void AudioPolicyService::OnForcedDeviceSelected(DeviceType devType, const std::s CHECK_AND_RETURN_LOG(res == SUCCESS, "DeviceParamsCheck no success"); if (devType == DEVICE_TYPE_BLUETOOTH_SCO) { audioStateManager_.SetPerferredCallRenderDevice(audioDeviceDescriptors[0]); + ClearScoDeviceSuspendState(audioDeviceDescriptors[0]->macAddress_); } else { audioStateManager_.SetPerferredMediaRenderDevice(audioDeviceDescriptors[0]); } @@ -5532,6 +5537,9 @@ int32_t AudioPolicyService::SetCallDeviceActive(InternalDeviceType deviceType, b CHECK_AND_RETURN_RET_LOG(itr != callDevices.end(), ERR_OPERATION_FAILED, "Requested device not available %{public}d ", deviceType); if (active) { + if (deviceType == DEVICE_TYPE_BLUETOOTH_SCO) { + ClearScoDeviceSuspendState(address); + } audioStateManager_.SetPerferredCallRenderDevice(new(std::nothrow) AudioDeviceDescriptor(**itr)); #ifdef BLUETOOTH_ENABLE if (currentActiveDevice_.deviceType_ == DEVICE_TYPE_BLUETOOTH_SCO && @@ -5597,5 +5605,15 @@ ConverterConfig AudioPolicyService::GetConverterConfig() AudioConverterParser &converterParser = AudioConverterParser::GetInstance(); return converterParser.LoadConfig(); } + +void AudioPolicyService::ClearScoDeviceSuspendState(string macAddress) +{ + AUDIO_DEBUG_LOG("Clear sco suspend state %{public}s", macAddress.c_str()); + vector> descs = audioDeviceManager_.GetDevicesByFilter( + DEVICE_TYPE_BLUETOOTH_SCO, DEVICE_ROLE_NONE, macAddress, "", SUSPEND_CONNECTED); + for (auto &desc : descs) { + desc->connectState_ = DEACTIVE_CONNECTED; + } +} } // namespace AudioStandard } // namespace OHOS -- Gitee