Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 534f801e authored by Alice Kuo's avatar Alice Kuo
Browse files

Config LE ACL 1M PHY for undirectional CIS streaming

Set BLE ACL PHY setting as the ASE state entering the streaming state, set it back to the symmetric as the streaming back to IDLE or CODEC CONFIGURED. Use a flag to record the acl asymmetric setting to avoid to configuare several times.

Bug: 296574881
Bug: 314176433
Test: m com.android.btservices
Test: munual test for unidirectional / bidirectional streming, and later join / disappear case

Change-Id: Ie4ae1a501f10f4fd49ab27aabe50da07ce4d1d4a
parent b8b202cf
Loading
Loading
Loading
Loading
+50 −0
Original line number Diff line number Diff line
@@ -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"
@@ -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_);

@@ -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, "
@@ -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.
@@ -5605,6 +5624,7 @@ class LeAudioClientImpl : public LeAudioClient {
        CleanCachedMicrophoneData();

        if (group) {
          handleAsymmetricPhyForUnicast(group);
          UpdateLocationsAndContextsAvailability(group->group_id_);
          if (group->IsPendingConfiguration()) {
            SuspendedForReconfiguration();
@@ -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();
@@ -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,
+2 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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,
+6 −0
Original line number Diff line number Diff line
@@ -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!";
+5 −0
Original line number Diff line number Diff line
@@ -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;
};
@@ -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));
};

/**