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

Commit ab5f7bd9 authored by Alice Kuo's avatar Alice Kuo Committed by Gerrit Code Review
Browse files

Merge "Config LE ACL 1M PHY for undirectional CIS streaming" into main

parents 2dfddd77 534f801e
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));
};

/**