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

Commit 2b144409 authored by Łukasz Rymanowski's avatar Łukasz Rymanowski
Browse files

leaudio: Fix for handling multiple LeAudio headsets

Make sure to get proper CIG ID when handling CisEstablished event

Bug: 241883130
Test: atest BluetoothInstrumentationTests
Test: manual: connect two LeAudio headsets and make a phone call
Tag: #feature
Merged-In: Ic945638c6c3a9e0e87a868bc26d5f6a3590a51ff
Change-Id: Ic945638c6c3a9e0e87a868bc26d5f6a3590a51ff
(cherry picked from commit 45952e25)
parent 1575f43a
Loading
Loading
Loading
Loading
+9 −9
Original line number Diff line number Diff line
@@ -3625,8 +3625,8 @@ class LeAudioClientImpl : public LeAudioClient {
            static_cast<bluetooth::hci::iso_manager::cis_establish_cmpl_evt*>(
                data);

        LeAudioDevice* leAudioDevice =
            leAudioDevices_.FindByCisConnHdl(event->cis_conn_hdl);
        LeAudioDevice* leAudioDevice = leAudioDevices_.FindByCisConnHdl(
            event->cig_id, event->cis_conn_hdl);
        if (!leAudioDevice) {
          LOG(ERROR) << __func__ << ", no bonded Le Audio Device with CIS: "
                     << +event->cis_conn_hdl;
@@ -3650,8 +3650,8 @@ class LeAudioClientImpl : public LeAudioClient {
            static_cast<bluetooth::hci::iso_manager::cis_disconnected_evt*>(
                data);

        LeAudioDevice* leAudioDevice =
            leAudioDevices_.FindByCisConnHdl(event->cis_conn_hdl);
        LeAudioDevice* leAudioDevice = leAudioDevices_.FindByCisConnHdl(
            event->cig_id, event->cis_conn_hdl);
        if (!leAudioDevice) {
          LOG(ERROR) << __func__ << ", no bonded Le Audio Device with CIS: "
                     << +event->cis_conn_hdl;
@@ -3670,9 +3670,9 @@ class LeAudioClientImpl : public LeAudioClient {
  }

  void IsoSetupIsoDataPathCb(uint8_t status, uint16_t conn_handle,
                             uint8_t /* cig_id */) {
                             uint8_t cig_id) {
    LeAudioDevice* leAudioDevice =
        leAudioDevices_.FindByCisConnHdl(conn_handle);
        leAudioDevices_.FindByCisConnHdl(cig_id, conn_handle);
    LeAudioDeviceGroup* group = aseGroups_.FindById(leAudioDevice->group_id_);

    instance->groupStateMachine_->ProcessHciNotifSetupIsoDataPath(
@@ -3680,9 +3680,9 @@ class LeAudioClientImpl : public LeAudioClient {
  }

  void IsoRemoveIsoDataPathCb(uint8_t status, uint16_t conn_handle,
                              uint8_t /* cig_id */) {
                              uint8_t cig_id) {
    LeAudioDevice* leAudioDevice =
        leAudioDevices_.FindByCisConnHdl(conn_handle);
        leAudioDevices_.FindByCisConnHdl(cig_id, conn_handle);
    LeAudioDeviceGroup* group = aseGroups_.FindById(leAudioDevice->group_id_);

    instance->groupStateMachine_->ProcessHciNotifRemoveIsoDataPath(
@@ -3695,7 +3695,7 @@ class LeAudioClientImpl : public LeAudioClient {
      uint32_t retransmittedPackets, uint32_t crcErrorPackets,
      uint32_t rxUnreceivedPackets, uint32_t duplicatePackets) {
    LeAudioDevice* leAudioDevice =
        leAudioDevices_.FindByCisConnHdl(conn_handle);
        leAudioDevices_.FindByCisConnHdl(cig_id, conn_handle);
    if (!leAudioDevice) {
      LOG(WARNING) << __func__ << ", device under connection handle: "
                   << loghex(conn_handle)
+7 −2
Original line number Diff line number Diff line
@@ -2589,13 +2589,18 @@ LeAudioDevice* LeAudioDevices::FindByConnId(uint16_t conn_id) {
  return (iter == leAudioDevices_.end()) ? nullptr : iter->get();
}

LeAudioDevice* LeAudioDevices::FindByCisConnHdl(const uint16_t conn_hdl) {
LeAudioDevice* LeAudioDevices::FindByCisConnHdl(uint8_t cig_id,
                                                uint16_t conn_hdl) {
  auto iter = std::find_if(leAudioDevices_.begin(), leAudioDevices_.end(),
                           [&conn_hdl](auto& d) {
                           [&conn_hdl, &cig_id](auto& d) {
                             LeAudioDevice* dev;
                             BidirectAsesPair ases;

                             dev = d.get();
                             if (dev->group_id_ != cig_id) {
                               return false;
                             }

                             ases = dev->GetAsesByCisConnHdl(conn_hdl);
                             if (ases.sink || ases.source)
                               return true;
+1 −1
Original line number Diff line number Diff line
@@ -177,7 +177,7 @@ class LeAudioDevices {
  LeAudioDevice* FindByAddress(const RawAddress& address);
  std::shared_ptr<LeAudioDevice> GetByAddress(const RawAddress& address);
  LeAudioDevice* FindByConnId(uint16_t conn_id);
  LeAudioDevice* FindByCisConnHdl(const uint16_t conn_hdl);
  LeAudioDevice* FindByCisConnHdl(uint8_t cig_id, uint16_t conn_hdl);
  size_t Size(void);
  void Dump(int fd, int group_id);
  void Cleanup(void);