Loading system/bta/le_audio/client.cc +50 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ #include "osi/include/osi.h" #include "osi/include/properties.h" #include "stack/btm/btm_sec.h" #include "stack/include/acl_api.h" #include "stack/include/bt_types.h" #include "stack/include/main_thread.h" #include "state_machine.h" Loading Loading @@ -2371,6 +2372,7 @@ class LeAudioClientImpl : public LeAudioClient { return; } leAudioDevice->acl_asymmetric_ = false; BtaGattQueue::Clean(leAudioDevice->conn_id_); LeAudioDeviceGroup* group = aseGroups_.FindById(leAudioDevice->group_id_); Loading Loading @@ -5486,6 +5488,21 @@ class LeAudioClientImpl : public LeAudioClient { } } void handleAsymmetricPhyForUnicast(LeAudioDeviceGroup* group) { if (!group->asymmetric_phy_for_unidirectional_cis_supported) return; auto it = lastNotifiedGroupStreamStatusMap_.find(group->group_id_); if (it != lastNotifiedGroupStreamStatusMap_.end() && it->second == GroupStreamStatus::STREAMING && group->GetSduInterval(le_audio::types::kLeAudioDirectionSource) == 0) { SetAsymmetricBlePhy(group, true); return; } SetAsymmetricBlePhy(group, false); } void OnStateMachineStatusReportCb(int group_id, GroupStreamStatus status) { LOG_INFO( "status: %d , group_id: %d, audio_sender_state %s, " Loading Loading @@ -5518,6 +5535,8 @@ class LeAudioClientImpl : public LeAudioClient { return; } handleAsymmetricPhyForUnicast(group); if ((audio_sender_state_ == AudioState::IDLE) && (audio_receiver_state_ == AudioState::IDLE)) { /* Audio Framework is not interested in the stream anymore. Loading Loading @@ -5605,6 +5624,7 @@ class LeAudioClientImpl : public LeAudioClient { CleanCachedMicrophoneData(); if (group) { handleAsymmetricPhyForUnicast(group); UpdateLocationsAndContextsAvailability(group->group_id_); if (group->IsPendingConfiguration()) { SuspendedForReconfiguration(); Loading Loading @@ -5786,6 +5806,15 @@ class LeAudioClientImpl : public LeAudioClient { std::map<int, GroupStreamStatus> lastNotifiedGroupStreamStatusMap_; void ClientAudioInterfaceRelease() { auto group = aseGroups_.FindById(active_group_id_); if (!group) { LOG(ERROR) << __func__ << ", Invalid group: " << static_cast<int>(active_group_id_); } else { handleAsymmetricPhyForUnicast(group); LOG_VERBOSE("ClientAudioInterfaceRelease - cleanup"); } if (le_audio_source_hal_client_) { le_audio_source_hal_client_->Stop(); le_audio_source_hal_client_.reset(); Loading Loading @@ -5861,6 +5890,27 @@ class LeAudioClientImpl : public LeAudioClient { return false; } } void SetAsymmetricBlePhy(LeAudioDeviceGroup* group, bool asymmetric) { LeAudioDevice* leAudioDevice = group->GetFirstDevice(); if (leAudioDevice == nullptr) { LOG_ERROR("Shouldn't be called without a device."); return; } for (auto tmpDevice = leAudioDevice; tmpDevice != nullptr; tmpDevice = group->GetNextDevice(tmpDevice)) { if (tmpDevice->acl_asymmetric_ == asymmetric || !BTM_IsAclConnectionUp(tmpDevice->address_, BT_TRANSPORT_LE)) continue; LOG_VERBOSE("SetAsymmetricBlePhy: %d for %s", asymmetric, ADDRESS_TO_LOGGABLE_CSTR(tmpDevice->address_)); BTM_BleSetPhy(tmpDevice->address_, PHY_LE_2M, asymmetric ? PHY_LE_1M : PHY_LE_2M, 0); tmpDevice->acl_asymmetric_ = asymmetric; } } }; static void le_audio_health_status_callback(const RawAddress& addr, Loading system/bta/le_audio/devices.h +2 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,7 @@ class LeAudioDevice { uint16_t tmap_role_hdl_; std::string model_name_; bool allowlist_flag_; bool acl_asymmetric_; alarm_t* link_quality_timer; uint16_t link_quality_timer_data; Loading @@ -140,6 +141,7 @@ class LeAudioDevice { audio_directions_(0), model_name_(""), allowlist_flag_(false), acl_asymmetric_(false), link_quality_timer(nullptr), dsa_({{DsaMode::DISABLED}, types::DataPathState::IDLE, Loading system/bta/test/common/btm_api_mock.cc +6 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,12 @@ bool BTM_BleIsLinkKeyKnown(const RawAddress address) { return btm_interface->BTM_BleIsLinkKeyKnown(address); } bool BTM_IsAclConnectionUp(const RawAddress& remote_bda, tBT_TRANSPORT transport) { LOG_ASSERT(btm_interface) << "Mock btm interface not set!"; return btm_interface->BTM_IsAclConnectionUp(remote_bda, transport); } std::optional<tBLE_BD_ADDR> BTM_BleGetIdentityAddress( const RawAddress address) { LOG_ASSERT(btm_interface) << "Mock btm interface not set!"; Loading system/bta/test/common/btm_api_mock.h +5 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,8 @@ class BtmInterface { virtual bool BTM_BleIsLinkKeyKnown(const RawAddress address) = 0; virtual std::optional<tBLE_BD_ADDR> BTM_BleGetIdentityAddress( const RawAddress address) = 0; virtual bool BTM_IsAclConnectionUp(const RawAddress& remote_bda, tBT_TRANSPORT transport) = 0; virtual ~BtmInterface() = default; }; Loading Loading @@ -117,6 +119,9 @@ class MockBtmInterface : public BtmInterface { (override)); MOCK_METHOD((std::optional<tBLE_BD_ADDR>), BTM_BleGetIdentityAddress, (const RawAddress address), (override)); MOCK_METHOD((bool), BTM_IsAclConnectionUp, (const RawAddress& remote_bda, tBT_TRANSPORT transport), (override)); }; /** Loading Loading
system/bta/le_audio/client.cc +50 −0 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ #include "osi/include/osi.h" #include "osi/include/properties.h" #include "stack/btm/btm_sec.h" #include "stack/include/acl_api.h" #include "stack/include/bt_types.h" #include "stack/include/main_thread.h" #include "state_machine.h" Loading Loading @@ -2371,6 +2372,7 @@ class LeAudioClientImpl : public LeAudioClient { return; } leAudioDevice->acl_asymmetric_ = false; BtaGattQueue::Clean(leAudioDevice->conn_id_); LeAudioDeviceGroup* group = aseGroups_.FindById(leAudioDevice->group_id_); Loading Loading @@ -5486,6 +5488,21 @@ class LeAudioClientImpl : public LeAudioClient { } } void handleAsymmetricPhyForUnicast(LeAudioDeviceGroup* group) { if (!group->asymmetric_phy_for_unidirectional_cis_supported) return; auto it = lastNotifiedGroupStreamStatusMap_.find(group->group_id_); if (it != lastNotifiedGroupStreamStatusMap_.end() && it->second == GroupStreamStatus::STREAMING && group->GetSduInterval(le_audio::types::kLeAudioDirectionSource) == 0) { SetAsymmetricBlePhy(group, true); return; } SetAsymmetricBlePhy(group, false); } void OnStateMachineStatusReportCb(int group_id, GroupStreamStatus status) { LOG_INFO( "status: %d , group_id: %d, audio_sender_state %s, " Loading Loading @@ -5518,6 +5535,8 @@ class LeAudioClientImpl : public LeAudioClient { return; } handleAsymmetricPhyForUnicast(group); if ((audio_sender_state_ == AudioState::IDLE) && (audio_receiver_state_ == AudioState::IDLE)) { /* Audio Framework is not interested in the stream anymore. Loading Loading @@ -5605,6 +5624,7 @@ class LeAudioClientImpl : public LeAudioClient { CleanCachedMicrophoneData(); if (group) { handleAsymmetricPhyForUnicast(group); UpdateLocationsAndContextsAvailability(group->group_id_); if (group->IsPendingConfiguration()) { SuspendedForReconfiguration(); Loading Loading @@ -5786,6 +5806,15 @@ class LeAudioClientImpl : public LeAudioClient { std::map<int, GroupStreamStatus> lastNotifiedGroupStreamStatusMap_; void ClientAudioInterfaceRelease() { auto group = aseGroups_.FindById(active_group_id_); if (!group) { LOG(ERROR) << __func__ << ", Invalid group: " << static_cast<int>(active_group_id_); } else { handleAsymmetricPhyForUnicast(group); LOG_VERBOSE("ClientAudioInterfaceRelease - cleanup"); } if (le_audio_source_hal_client_) { le_audio_source_hal_client_->Stop(); le_audio_source_hal_client_.reset(); Loading Loading @@ -5861,6 +5890,27 @@ class LeAudioClientImpl : public LeAudioClient { return false; } } void SetAsymmetricBlePhy(LeAudioDeviceGroup* group, bool asymmetric) { LeAudioDevice* leAudioDevice = group->GetFirstDevice(); if (leAudioDevice == nullptr) { LOG_ERROR("Shouldn't be called without a device."); return; } for (auto tmpDevice = leAudioDevice; tmpDevice != nullptr; tmpDevice = group->GetNextDevice(tmpDevice)) { if (tmpDevice->acl_asymmetric_ == asymmetric || !BTM_IsAclConnectionUp(tmpDevice->address_, BT_TRANSPORT_LE)) continue; LOG_VERBOSE("SetAsymmetricBlePhy: %d for %s", asymmetric, ADDRESS_TO_LOGGABLE_CSTR(tmpDevice->address_)); BTM_BleSetPhy(tmpDevice->address_, PHY_LE_2M, asymmetric ? PHY_LE_1M : PHY_LE_2M, 0); tmpDevice->acl_asymmetric_ = asymmetric; } } }; static void le_audio_health_status_callback(const RawAddress& addr, Loading
system/bta/le_audio/devices.h +2 −0 Original line number Diff line number Diff line Loading @@ -119,6 +119,7 @@ class LeAudioDevice { uint16_t tmap_role_hdl_; std::string model_name_; bool allowlist_flag_; bool acl_asymmetric_; alarm_t* link_quality_timer; uint16_t link_quality_timer_data; Loading @@ -140,6 +141,7 @@ class LeAudioDevice { audio_directions_(0), model_name_(""), allowlist_flag_(false), acl_asymmetric_(false), link_quality_timer(nullptr), dsa_({{DsaMode::DISABLED}, types::DataPathState::IDLE, Loading
system/bta/test/common/btm_api_mock.cc +6 −0 Original line number Diff line number Diff line Loading @@ -115,6 +115,12 @@ bool BTM_BleIsLinkKeyKnown(const RawAddress address) { return btm_interface->BTM_BleIsLinkKeyKnown(address); } bool BTM_IsAclConnectionUp(const RawAddress& remote_bda, tBT_TRANSPORT transport) { LOG_ASSERT(btm_interface) << "Mock btm interface not set!"; return btm_interface->BTM_IsAclConnectionUp(remote_bda, transport); } std::optional<tBLE_BD_ADDR> BTM_BleGetIdentityAddress( const RawAddress address) { LOG_ASSERT(btm_interface) << "Mock btm interface not set!"; Loading
system/bta/test/common/btm_api_mock.h +5 −0 Original line number Diff line number Diff line Loading @@ -66,6 +66,8 @@ class BtmInterface { virtual bool BTM_BleIsLinkKeyKnown(const RawAddress address) = 0; virtual std::optional<tBLE_BD_ADDR> BTM_BleGetIdentityAddress( const RawAddress address) = 0; virtual bool BTM_IsAclConnectionUp(const RawAddress& remote_bda, tBT_TRANSPORT transport) = 0; virtual ~BtmInterface() = default; }; Loading Loading @@ -117,6 +119,9 @@ class MockBtmInterface : public BtmInterface { (override)); MOCK_METHOD((std::optional<tBLE_BD_ADDR>), BTM_BleGetIdentityAddress, (const RawAddress address), (override)); MOCK_METHOD((bool), BTM_IsAclConnectionUp, (const RawAddress& remote_bda, tBT_TRANSPORT transport), (override)); }; /** Loading