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

Commit 6dc7ff42 authored by Himanshu Rawat's avatar Himanshu Rawat
Browse files

Change CIG parameters for DSA

Change the CIG parameters for the individual CIG devices when DSA mode
ISO_SW or ISO_HW is selected.

Test: mmm packages/modules/Bluetooth
Bug: 270985689
Change-Id: I59944985630cb8ae529b0299ebea777bb6ecd060
parent 1c30335d
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -4520,6 +4520,8 @@ class LeAudioClientImpl : public LeAudioClient {
        ToString(audio_receiver_state_).c_str(),
        ToString(audio_sender_state_).c_str());

    group->dsa_mode_ = dsa_mode;

    /* Set the remote sink metadata context from the playback tracks metadata */
    local_metadata_context_types_.source =
        GetAudioContextsFromSourceMetadata(source_metadata);
+15 −0
Original line number Diff line number Diff line
@@ -81,12 +81,14 @@ class LeAudioDeviceGroup {
  /* Whether LE Audio is preferred for OUTPUT_ONLY and DUPLEX cases */
  bool is_output_preference_le_audio;
  bool is_duplex_preference_le_audio;
  DsaMode dsa_mode_;

  explicit LeAudioDeviceGroup(const int group_id)
      : group_id_(group_id),
        cig(this),
        stream_conf({}),
        audio_directions_(0),
        dsa_mode_(DsaMode::DISABLED),
        is_enabled_(true),
        transport_latency_mtos_us_(0),
        transport_latency_stom_us_(0),
@@ -311,6 +313,19 @@ class LeAudioDeviceGroup {
    return dsa_modes;
  }

  std::vector<DsaModes> GetAllowedDsaModesList() {
    std::vector<DsaModes> dsa_modes_list = {};
    for (auto leAudioDevice : leAudioDevices_) {
      DsaModes dsa_modes = {};

      if (!leAudioDevice.expired()) {
        dsa_modes = leAudioDevice.lock()->GetDsaModes();
      }
      dsa_modes_list.push_back(dsa_modes);
    }
    return dsa_modes_list;
  }

  types::BidirectionalPair<types::AudioContexts> GetLatestAvailableContexts(
      void) const;

+53 −0
Original line number Diff line number Diff line
@@ -99,6 +99,8 @@ using le_audio::LeAudioGroupStateMachine;

using bluetooth::hci::ErrorCode;
using bluetooth::hci::ErrorCodeText;
using le_audio::DsaMode;
using le_audio::DsaModes;
using le_audio::types::ase;
using le_audio::types::AseState;
using le_audio::types::AudioContexts;
@@ -1279,6 +1281,55 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    return ((1000 * max_latency_ms) >= sdu_interval_us);
  }

  void ApplyDsaParams(LeAudioDeviceGroup* group,
                      bluetooth::hci::iso_manager::cig_create_params& param) {
    if (!IS_FLAG_ENABLED(leaudio_dynamic_spatial_audio)) {
      return;
    }

    LOG_INFO("DSA mode selected: %d", (int)group->dsa_mode_);

    /* Unidirectional streaming */
    if (param.sdu_itv_stom != 0) {
      LOG_INFO("Media streaming, apply DSA parameters");

      switch (group->dsa_mode_) {
        case DsaMode::ISO_HW:
        case DsaMode::ISO_SW: {
          auto& cis_cfgs = param.cis_cfgs;
          auto it = cis_cfgs.begin();

          for (auto dsa_modes : group->GetAllowedDsaModesList()) {
            if (!dsa_modes.empty() && it != cis_cfgs.end()) {
              if (std::find(dsa_modes.begin(), dsa_modes.end(),
                            group->dsa_mode_) != dsa_modes.end()) {
                LOG_INFO("Device found with support for selected DsaMode");

                param.sdu_itv_stom = 20000;
                param.max_trans_lat_stom = 10;
                it->max_sdu_size_stom = 15;
                it->rtn_stom = 2;

                it++;
              }
            }
          }
        } break;

        case DsaMode::ACL:
          /* Todo: Prioritize the ACL */
          break;

        case DsaMode::DISABLED:
        default:
          /* No need to change ISO parameters */
          break;
      }
    } else {
      LOG_DEBUG("Bidirection streaming, ignore DSA mode");
    }
  }

  bool CigCreate(LeAudioDeviceGroup* group) {
    uint32_t sdu_interval_mtos, sdu_interval_stom;
    uint16_t max_trans_lat_mtos, max_trans_lat_stom;
@@ -1398,6 +1449,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        .cis_cfgs = std::move(cis_cfgs),
    };

    ApplyDsaParams(group, param);

    log_history_->AddLogHistory(
        kLogStateMachineTag, group->group_id_, RawAddress::kEmpty,
        kLogCigCreateOp + "#CIS: " + std::to_string(param.cis_cfgs.size()));