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

Commit e707d899 authored by Partha Sarathi Saha's avatar Partha Sarathi Saha Committed by Łukasz Rymanowski
Browse files

leaudio: Add functions for setting CIG parameters

Added functions for getting Maximum SDU Size and
Retransmission Number, for a particular Direction and CIS ID,
for setting the CIG parameters.

This patch is needed by the below mentioned patch
and resolves the review comment in the below patch
to keep the change as a separate patch

https://android-review.googlesource.com/c/platform/packages/modules/Bluetooth/+/2058269

Test: Verified Maximum SDU Size and Retransmission Number
      are obtained and set correctly in the CIG

Bug: 225020659
Tag: #feature
Test: atest BluetoothInstrumentationTests
Merged-In: If25fde195002ca5eb2b16f0f3eb1ff37c68e7afd
Change-Id: If25fde195002ca5eb2b16f0f3eb1ff37c68e7afd
(cherry picked from commit 9b3d08a1)
parent d3373521
Loading
Loading
Loading
Loading
+38 −0
Original line number Diff line number Diff line
@@ -447,6 +447,44 @@ void LeAudioDeviceGroup::SetTransportLatency(uint8_t direction,
  *transport_latency_us = new_transport_latency_us;
}

uint8_t LeAudioDeviceGroup::GetRtn(uint8_t direction, uint8_t cis_id) {
  LeAudioDevice* leAudioDevice = GetFirstActiveDevice();
  LOG_ASSERT(leAudioDevice)
      << __func__ << " Shouldn't be called without an active device.";

  do {
    auto ases_pair = leAudioDevice->GetAsesByCisId(cis_id);

    if (ases_pair.sink && direction == types::kLeAudioDirectionSink) {
      return ases_pair.sink->retrans_nb;
    } else if (ases_pair.source &&
               direction == types::kLeAudioDirectionSource) {
      return ases_pair.source->retrans_nb;
    }
  } while ((leAudioDevice = GetNextActiveDevice(leAudioDevice)));

  return 0;
}

uint16_t LeAudioDeviceGroup::GetMaxSduSize(uint8_t direction, uint8_t cis_id) {
  LeAudioDevice* leAudioDevice = GetFirstActiveDevice();
  LOG_ASSERT(leAudioDevice)
      << __func__ << " Shouldn't be called without an active device.";

  do {
    auto ases_pair = leAudioDevice->GetAsesByCisId(cis_id);

    if (ases_pair.sink && direction == types::kLeAudioDirectionSink) {
      return ases_pair.sink->max_sdu_size;
    } else if (ases_pair.source &&
               direction == types::kLeAudioDirectionSource) {
      return ases_pair.source->max_sdu_size;
    }
  } while ((leAudioDevice = GetNextActiveDevice(leAudioDevice)));

  return 0;
}

uint8_t LeAudioDeviceGroup::GetPhyBitmask(uint8_t direction) {
  LeAudioDevice* leAudioDevice = GetFirstActiveDevice();
  LOG_ASSERT(leAudioDevice)
+2 −0
Original line number Diff line number Diff line
@@ -243,6 +243,8 @@ class LeAudioDeviceGroup {
  uint16_t GetMaxTransportLatencyStom(void);
  uint16_t GetMaxTransportLatencyMtos(void);
  void SetTransportLatency(uint8_t direction, uint32_t transport_latency_us);
  uint8_t GetRtn(uint8_t direction, uint8_t cis_id);
  uint16_t GetMaxSduSize(uint8_t direction, uint8_t cis_id);
  uint8_t GetPhyBitmask(uint8_t direction);
  uint8_t GetTargetPhy(uint8_t direction);
  bool GetPresentationDelay(uint32_t* delay, uint8_t direction);
+8 −10
Original line number Diff line number Diff line
@@ -954,23 +954,21 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        /* CIS configuration already on list */
        if (iter != cis_cfgs.end()) continue;

        auto ases_pair = leAudioDevice->GetAsesByCisId(cis);
        EXT_CIS_CFG cis_cfg = {0, 0, 0, 0, 0, 0, 0};

        cis_cfg.cis_id = ase->cis_id;
        cis_cfg.max_sdu_size_mtos = group->GetMaxSduSize(
            le_audio::types::kLeAudioDirectionSink, ase->cis_id);
        cis_cfg.max_sdu_size_stom = group->GetMaxSduSize(
            le_audio::types::kLeAudioDirectionSource, ase->cis_id);
        cis_cfg.phy_mtos =
            group->GetPhyBitmask(le_audio::types::kLeAudioDirectionSink);
        cis_cfg.phy_stom =
            group->GetPhyBitmask(le_audio::types::kLeAudioDirectionSource);

        if (ases_pair.sink) {
          cis_cfg.max_sdu_size_mtos = ases_pair.sink->max_sdu_size;
          cis_cfg.rtn_mtos = ases_pair.sink->retrans_nb;
        }
        if (ases_pair.source) {
          cis_cfg.max_sdu_size_stom = ases_pair.source->max_sdu_size;
          cis_cfg.rtn_stom = ases_pair.source->retrans_nb;
        }
        cis_cfg.rtn_mtos =
            group->GetRtn(le_audio::types::kLeAudioDirectionSink, ase->cis_id);
        cis_cfg.rtn_stom = group->GetRtn(
            le_audio::types::kLeAudioDirectionSource, ase->cis_id);

        cis_cfgs.push_back(cis_cfg);
      } while ((ase = leAudioDevice->GetNextActiveAse(ase)));