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

Commit 85e26f33 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "leaudio: Improve counting number of required CISes" into tm-qpr-dev

parents 5a8b59f7 c715827b
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -894,6 +894,15 @@ types::LeAudioConfigurationStrategy LeAudioDeviceGroup::GetGroupStrategy(void) {
  return types::LeAudioConfigurationStrategy::STEREO_ONE_CIS_PER_DEVICE;
}

int LeAudioDeviceGroup::GetAseCount(uint8_t direction) {
  int result = 0;
  for (const auto& device_iter : leAudioDevices_) {
    result += device_iter.lock()->GetAseCount(direction);
  }

  return result;
}

void LeAudioDeviceGroup::CigGenerateCisIds(
    types::LeAudioContextType context_type) {
  LOG_INFO("Group %p, group_id: %d, context_type: %s", this, group_id_,
@@ -910,7 +919,9 @@ void LeAudioDeviceGroup::CigGenerateCisIds(
  uint8_t cis_count_bidir = 0;
  uint8_t cis_count_unidir_sink = 0;
  uint8_t cis_count_unidir_source = 0;
  get_cis_count(confs, GetGroupStrategy(), &cis_count_bidir,
  get_cis_count(confs, GetGroupStrategy(),
                GetAseCount(types::kLeAudioDirectionSink),
                GetAseCount(types::kLeAudioDirectionSource), &cis_count_bidir,
                &cis_count_unidir_sink, &cis_count_unidir_source);

  uint8_t idx = 0;
@@ -1928,6 +1939,12 @@ struct ase* LeAudioDevice::GetAseByValHandle(uint16_t val_hdl) {
  return (iter == ases_.end()) ? nullptr : &(*iter);
}

int LeAudioDevice::GetAseCount(uint8_t direction) {
  return std::count_if(ases_.begin(), ases_.end(), [direction](const auto& a) {
    return a.direction == direction;
  });
}

struct ase* LeAudioDevice::GetFirstInactiveAseWithState(uint8_t direction,
                                                        AseState state) {
  auto iter = std::find_if(
+2 −0
Original line number Diff line number Diff line
@@ -104,6 +104,7 @@ class LeAudioDevice {
  void RegisterPACs(std::vector<struct types::acs_ac_record>* apr_db,
                    std::vector<struct types::acs_ac_record>* apr);
  struct types::ase* GetAseByValHandle(uint16_t val_hdl);
  int GetAseCount(uint8_t direction);
  struct types::ase* GetFirstActiveAse(void);
  struct types::ase* GetFirstActiveAseByDirection(uint8_t direction);
  struct types::ase* GetNextActiveAseWithSameDirection(
@@ -233,6 +234,7 @@ class LeAudioDeviceGroup {
  LeAudioDevice* GetFirstDeviceWithActiveContext(
      types::LeAudioContextType context_type);
  le_audio::types::LeAudioConfigurationStrategy GetGroupStrategy(void);
  int GetAseCount(uint8_t direction);
  LeAudioDevice* GetNextDevice(LeAudioDevice* leAudioDevice);
  LeAudioDevice* GetNextDeviceWithActiveContext(
      LeAudioDevice* leAudioDevice, types::LeAudioContextType context_type);
+42 −2
Original line number Diff line number Diff line
@@ -71,8 +71,12 @@ static uint8_t min_req_devices_cnt(

void get_cis_count(const AudioSetConfigurations* audio_set_confs,
                   types::LeAudioConfigurationStrategy strategy,
                   int group_ase_snk_cnt, int group_ase_src_count,
                   uint8_t* cis_count_bidir, uint8_t* cis_count_unidir_sink,
                   uint8_t* cis_count_unidir_source) {
  LOG_INFO(" strategy %d, sink ases: %d, source ases %d",
           static_cast<int>(strategy), group_ase_snk_cnt, group_ase_src_count);

  for (auto audio_set_conf : *audio_set_confs) {
    std::pair<uint8_t /* sink */, uint8_t /* source */> snk_src_pair(0, 0);
    uint8_t bidir_count = 0;
@@ -83,7 +87,7 @@ void get_cis_count(const AudioSetConfigurations* audio_set_confs,
    bool stategy_mismatch = false;
    for (auto ent : (*audio_set_conf).confs) {
      if (ent.strategy != strategy) {
        LOG_INFO("Strategy does not match (%d != %d)- skip this configuration",
        LOG_DEBUG("Strategy does not match (%d != %d)- skip this configuration",
                  static_cast<int>(ent.strategy), static_cast<int>(strategy));
        stategy_mismatch = true;
        break;
@@ -100,6 +104,42 @@ void get_cis_count(const AudioSetConfigurations* audio_set_confs,
      continue;
    }

    /* Before we start adding another CISes, ignore scenarios which cannot
     * satisfied because of the number of ases
     */

    if (group_ase_snk_cnt == 0 && snk_src_pair.first > 0) {
      LOG_DEBUG("Group does not have sink ASEs");
      continue;
    }

    if (group_ase_src_count == 0 && snk_src_pair.second > 0) {
      LOG_DEBUG("Group does not have source ASEs");
      continue;
    }

    /* Configuration list is set in the prioritized order.
     * it might happen that more prio configuration can be supported
     * and is already taken into account.
     * Now let's try to ignore ortogonal configuration which would just
     * increase our demant on number of CISes but will never happen
     */

    if (snk_src_pair.first == 0 &&
        (*cis_count_unidir_sink > 0 || *cis_count_bidir > 0)) {
      LOG_DEBUG(
          "More prio configuration using sink ASEs has been taken into "
          "account");
      continue;
    }
    if (snk_src_pair.second == 0 &&
        (*cis_count_unidir_source > 0 || *cis_count_bidir > 0)) {
      LOG_DEBUG(
          "More prio configuration using source ASEs has been taken into "
          "account");
      continue;
    }

    bidir_count = std::min(snk_src_pair.first, snk_src_pair.second);
    unidir_sink_count = ((snk_src_pair.first - bidir_count) > 0)
                            ? (snk_src_pair.first - bidir_count)
+1 −0
Original line number Diff line number Diff line
@@ -668,6 +668,7 @@ static constexpr uint32_t kChannelAllocationStereo =
/* Declarations */
void get_cis_count(const AudioSetConfigurations* audio_set_configurations,
                   types::LeAudioConfigurationStrategy strategy,
                   int group_ase_snk_cnt, int group_ase_src_count,
                   uint8_t* cis_count_bidir, uint8_t* cis_count_unidir_sink,
                   uint8_t* cis_count_unidir_source);
bool check_if_may_cover_scenario(