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

Commit 0987b481 authored by Łukasz Rymanowski's avatar Łukasz Rymanowski Committed by Automerger Merge Worker
Browse files

Merge changes I59cfa231,I67168805,I1a2106b5,Ic72f7d84 into main am: a383cd99

parents a6e524e0 a383cd99
Loading
Loading
Loading
Loading
+19 −15
Original line number Diff line number Diff line
@@ -44,7 +44,7 @@ using ::bluetooth::audio::aidl::BluetoothAudioCtrlAck;
using ::bluetooth::audio::le_audio::LeAudioClientInterface;
using ::bluetooth::audio::le_audio::StartRequestState;
using ::bluetooth::audio::le_audio::StreamCallbacks;
using ::bluetooth::le_audio::set_configurations::SetConfiguration;
using ::bluetooth::le_audio::set_configurations::AseConfiguration;
using ::bluetooth::le_audio::types::LeAudioCoreCodecConfig;

static ChannelMode le_audio_channel_mode2audio_hal(uint8_t channels_count) {
@@ -747,33 +747,37 @@ std::vector<AudioSetConfiguration> get_offload_capabilities() {
    str_capability_log.clear();

    if (hal_ucast_capability_to_stack_format(hal_encode_cap, encode_cap)) {
      audio_set_config.confs.push_back(SetConfiguration(
          ::bluetooth::le_audio::types::kLeAudioDirectionSink,
          hal_encode_cap.deviceCount,
          hal_encode_cap.deviceCount * hal_encode_cap.channelCountPerDevice,
          encode_cap));
      auto ase_cnt =
          hal_encode_cap.deviceCount * hal_encode_cap.channelCountPerDevice;
      while (ase_cnt--) {
        audio_set_config.confs.sink.push_back(AseConfiguration(encode_cap));
      }
      str_capability_log = " Encode Capability: " + hal_encode_cap.toString();
    }

    if (hal_ucast_capability_to_stack_format(hal_decode_cap, decode_cap)) {
      audio_set_config.confs.push_back(SetConfiguration(
          ::bluetooth::le_audio::types::kLeAudioDirectionSource,
          hal_decode_cap.deviceCount,
          hal_decode_cap.deviceCount * hal_decode_cap.channelCountPerDevice,
          decode_cap));
      auto ase_cnt =
          hal_decode_cap.deviceCount * hal_decode_cap.channelCountPerDevice;
      while (ase_cnt--) {
        audio_set_config.confs.source.push_back(AseConfiguration(decode_cap));
      }
      str_capability_log += " Decode Capability: " + hal_decode_cap.toString();
    }

    audio_set_config.topology_info = {
        {{static_cast<uint8_t>(hal_decode_cap.deviceCount),
          static_cast<uint8_t>(hal_encode_cap.deviceCount)}}};

    if (hal_bcast_capability_to_stack_format(hal_bcast_cap, bcast_cap)) {
      // Set device_cnt, ase_cnt to zero to ignore these fields for broadcast
      audio_set_config.confs.push_back(
          SetConfiguration(::bluetooth::le_audio::types::kLeAudioDirectionSink,
                           0, 0, bcast_cap));
      audio_set_config.topology_info = {{{0, 0}}};
      audio_set_config.confs.sink.push_back(AseConfiguration(bcast_cap));
      str_capability_log +=
          " Broadcast Capability: " + hal_bcast_cap.toString();
    }

    if (!audio_set_config.confs.empty()) {
    if (!audio_set_config.confs.sink.empty() ||
        !audio_set_config.confs.source.empty()) {
      offload_capabilities.push_back(audio_set_config);
      LOG(INFO) << __func__
                << ": Supported codec capability =" << str_capability_log;
+30 −20
Original line number Diff line number Diff line
@@ -172,6 +172,11 @@
            "codec_config_name": "SingleDev_OneChanMonoSnk_32_1",
            "qos_config_name": ["QoS_Config_32_1_1"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_32_1_2",
            "codec_config_name": "SingleDev_OneChanMonoSnk_32_1",
            "qos_config_name": ["QoS_Config_32_1_2"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_32_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanMonoSnk_32_2",
@@ -182,6 +187,11 @@
            "codec_config_name": "SingleDev_OneChanMonoSnk_32_2",
            "qos_config_name": ["QoS_Config_32_2_1"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_32_2_2",
            "codec_config_name": "SingleDev_OneChanMonoSnk_32_2",
            "qos_config_name": ["QoS_Config_32_2_2"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_16_1_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
@@ -943,42 +953,42 @@
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_TwoChanStereoSnk_48_4_1_OneChanMonoSrc_24_2_Balanced_Reliability",
            "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_TwoChanStereoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
            "name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_32_2_Balanced_Reliability",
            "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_24_2_Balanced_Reliability",
            "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanStereoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
            "name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_32_2_Balanced_Reliability",
            "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_24_2_1_Balanced_Reliability",
            "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
        {
            "name": "SingleDev_OneChanMonoSnk_48_4_1_OneChanMonoSrc_16_2_Balanced_Reliability",
            "name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
            "codec_config_name": "SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2",
            "qos_config_name": ["QoS_Config_Balanced_Reliability"]
        },
@@ -5991,7 +6001,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -6118,7 +6128,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
@@ -6372,7 +6382,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -6499,7 +6509,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
@@ -6757,7 +6767,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -6886,7 +6896,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
@@ -7142,7 +7152,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -7270,7 +7280,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
@@ -7526,7 +7536,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -7654,7 +7664,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
@@ -7908,7 +7918,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    60,
                                    0
                                ]
                            }
@@ -8035,7 +8045,7 @@
                            "type": 4,
                            "compound_value": {
                                "value": [
                                    80,
                                    40,
                                    0
                                ]
                            }
+1 −2
Original line number Diff line number Diff line
@@ -60,8 +60,7 @@
                "SingleDev_OneChanMonoSrc_24_1_Balanced_Reliability",
                "SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability",
                "SingleDev_OneChanMonoSrc_16_1_Balanced_Reliability",
                "VND_SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32khz_Server_Prefered_1",
                "VND_SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32khz_60oct_R3_L22_1",
                "VND_SingleDev_TwoChanStereoSnk_OneChanStereoSrc_32khz_60oct_R3_L22_1",
                "DualDev_OneChanMonoSnk_16_2_Balanced_Reliability",
                "SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
                "SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
+8 −17
Original line number Diff line number Diff line
@@ -552,6 +552,7 @@ class LeAudioClientImpl : public LeAudioClient {
    if (group_conf_changed) {
      /* All the configurations should be recalculated for the new conditions */
      group->InvalidateCachedConfigurations();
      group->InvalidateGroupStrategy();
      callbacks_->OnAudioConf(group->audio_directions_, group->group_id_,
                              group->snk_audio_locations_.to_ulong(),
                              group->src_audio_locations_.to_ulong(),
@@ -559,13 +560,6 @@ class LeAudioClientImpl : public LeAudioClient {
    }
  }

  void UpdateLocationsAndContextsAvailability(int group_id) {
    LeAudioDeviceGroup* group = aseGroups_.FindById(group_id);
    if (group) {
      UpdateLocationsAndContextsAvailability(group);
    }
  }

  void SuspendedForReconfiguration() {
    if (audio_sender_state_ > AudioState::IDLE) {
      LeAudioLogHistory::Get()->AddLogHistory(
@@ -643,7 +637,6 @@ class LeAudioClientImpl : public LeAudioClient {
    LeAudioDevice* leAudioDevice = leAudioDevices_.FindByAddress(address);
    LeAudioDeviceGroup* new_group;
    LeAudioDeviceGroup* old_group = nullptr;
    int old_group_id = bluetooth::groups::kGroupUnknown;

    if (!leAudioDevice) {
      /* TODO This part possible to remove as this is to handle adding device to
@@ -661,7 +654,6 @@ class LeAudioClientImpl : public LeAudioClient {
    } else {
      if (leAudioDevice->group_id_ != bluetooth::groups::kGroupUnknown) {
        old_group = aseGroups_.FindById(leAudioDevice->group_id_);
        old_group_id = old_group->group_id_;
      }
    }

@@ -709,11 +701,6 @@ class LeAudioClientImpl : public LeAudioClient {
    if (leAudioDevice->conn_id_ != GATT_INVALID_CONN_ID)
      AseInitialStateReadRequest(leAudioDevice);

    /* Group may be destroyed once moved its last node to new group, so don't
     * use `old_group` pointer anymore.
     * Removing node from group requires updating group context availability */
    UpdateLocationsAndContextsAvailability(old_group_id);

    if (leAudioDevice->GetConnectionState() == DeviceConnectState::CONNECTED) {
      UpdateLocationsAndContextsAvailability(new_group);
    }
@@ -1782,6 +1769,8 @@ class LeAudioClientImpl : public LeAudioClient {
       * PACs are updated.
       */
      if (group) {
        /* Changes in PAC record channel counts may change the strategy */
        group->InvalidateGroupStrategy();
        group->InvalidateCachedConfigurations();
      }
      if (notify) {
@@ -1808,6 +1797,8 @@ class LeAudioClientImpl : public LeAudioClient {
       * PACs are updated.
       */
      if (group) {
        /* Changes in PAC record channel counts may change the strategy */
        group->InvalidateGroupStrategy();
        group->InvalidateCachedConfigurations();
      }
      if (notify) {
@@ -1844,7 +1835,7 @@ class LeAudioClientImpl : public LeAudioClient {
            leAudioDevice->snk_audio_locations_.to_ulong(),
            leAudioDevice->src_audio_locations_.to_ulong());
        if (group && group->IsReleasingOrIdle()) {
          UpdateLocationsAndContextsAvailability(leAudioDevice->group_id_);
          UpdateLocationsAndContextsAvailability(group);
        }
      }
    } else if (hdl == leAudioDevice->src_audio_locations_hdls_.val_hdl) {
@@ -1872,7 +1863,7 @@ class LeAudioClientImpl : public LeAudioClient {
            leAudioDevice->snk_audio_locations_.to_ulong(),
            leAudioDevice->src_audio_locations_.to_ulong());
        if (group && group->IsReleasingOrIdle()) {
          UpdateLocationsAndContextsAvailability(leAudioDevice->group_id_);
          UpdateLocationsAndContextsAvailability(group);
        }
      }
    } else if (hdl == leAudioDevice->audio_avail_hdls_.val_hdl) {
@@ -5673,7 +5664,7 @@ class LeAudioClientImpl : public LeAudioClient {

        if (group) {
          handleAsymmetricPhyForUnicast(group);
          UpdateLocationsAndContextsAvailability(group->group_id_);
          UpdateLocationsAndContextsAvailability(group);
          if (group->IsPendingConfiguration()) {
            SuspendedForReconfiguration();
            auto remote_direction =
+115 −70
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@
#include "broadcaster/broadcast_configuration_provider.h"
#include "broadcaster/broadcaster_types.h"
#include "device/include/controller.h"
#include "le_audio/le_audio_types.h"
#include "le_audio_set_configuration_provider.h"
#include "le_audio_utils.h"
#include "os/log.h"
@@ -39,9 +40,9 @@ using bluetooth::legacy::hci::GetInterface;
using bluetooth::le_audio::AudioSetConfigurationProvider;
using bluetooth::le_audio::btle_audio_codec_config_t;
using bluetooth::le_audio::btle_audio_codec_index_t;
using bluetooth::le_audio::set_configurations::AseConfiguration;
using bluetooth::le_audio::set_configurations::AudioSetConfiguration;
using bluetooth::le_audio::set_configurations::AudioSetConfigurations;
using bluetooth::le_audio::set_configurations::SetConfiguration;

typedef struct offloader_stream_maps {
  std::vector<bluetooth::le_audio::stream_map_info> streams_map_target;
@@ -240,11 +241,15 @@ struct codec_manager_impl {
    LOG_INFO("UpdateSupportedBroadcastConfig");

    for (const auto& adsp_audio_set_conf : adsp_capabilities) {
      if (adsp_audio_set_conf.confs.size() != 1 ||
          adsp_audio_set_conf.confs[0].device_cnt != 0) {
      ASSERT_LOG(
          adsp_audio_set_conf.topology_info.has_value(),
          "No topology info, which is required to properly configure the ASEs");
      if (adsp_audio_set_conf.confs.sink.size() != 1 ||
          adsp_audio_set_conf.topology_info->device_count.sink != 0 ||
          adsp_audio_set_conf.topology_info->device_count.source != 0) {
        continue;
      }
      auto& adsp_config = adsp_audio_set_conf.confs[0];
      auto& adsp_config = adsp_audio_set_conf.confs.sink[0];

      const types::LeAudioCoreCodecConfig core_config =
          adsp_config.codec.params.GetAsCoreCodecConfig();
@@ -627,59 +632,89 @@ struct codec_manager_impl {
    return true;
  }

  bool IsSetConfigurationMatched(const SetConfiguration& software_set_config,
                                 const SetConfiguration& adsp_set_config) {
    // Skip the check of stategry and ase_cnt due to ADSP doesn't have the info
    return (
        software_set_config.direction == adsp_set_config.direction &&
        software_set_config.device_cnt == adsp_set_config.device_cnt &&
        IsLc3ConfigMatched(software_set_config.codec, adsp_set_config.codec));
  bool IsAseConfigurationMatched(const AseConfiguration& software_ase_config,
                                 const AseConfiguration& adsp_ase_config) {
    // Skip the check of strategy due to ADSP doesn't have the info
    return IsLc3ConfigMatched(software_ase_config.codec, adsp_ase_config.codec);
  }

  bool IsAudioSetConfigurationMatched(
      const AudioSetConfiguration* software_audio_set_conf,
      std::unordered_set<uint8_t>& offload_preference_set,
      const std::vector<AudioSetConfiguration>& adsp_capabilities) {
    if (software_audio_set_conf->confs.empty()) {
    if (software_audio_set_conf->confs.sink.empty() &&
        software_audio_set_conf->confs.source.empty()) {
      return false;
    }

    std::unordered_map<uint8_t, const SetConfiguration&>
        software_set_conf_direction_map;

    for (auto& software_set_conf : software_audio_set_conf->confs) {
      // Checks offload preference supports the codec
      if (offload_preference_set.find(
              software_set_conf.codec.id.coding_format) ==
    // No match if the codec is not on the preference list
    for (auto direction : {le_audio::types::kLeAudioDirectionSink,
                           le_audio::types::kLeAudioDirectionSource}) {
      for (auto const& conf : software_audio_set_conf->confs.get(direction)) {
        if (offload_preference_set.find(conf.codec.id.coding_format) ==
            offload_preference_set.end()) {
          return false;
        }
      software_set_conf_direction_map.emplace(software_set_conf.direction,
                                              software_set_conf);
      }
    }

    // Checks any of offload config matches the input audio set config
    for (const auto& adsp_audio_set_conf : adsp_capabilities) {
      if (adsp_audio_set_conf.confs.size() !=
          software_audio_set_conf->confs.size()) {
      size_t match_cnt = 0;
      size_t expected_match_cnt = 0;

      ASSERT_LOG(adsp_audio_set_conf.topology_info.has_value(),
                 "ADSP capability is missing the topology information.");

      for (auto direction : {le_audio::types::kLeAudioDirectionSink,
                             le_audio::types::kLeAudioDirectionSource}) {
        if (software_audio_set_conf->topology_info->device_count.get(
                direction) !=
            adsp_audio_set_conf.topology_info->device_count.get(direction)) {
          continue;
        }

      size_t match_cnt = 0;
        auto const& software_set_ase_confs =
            software_audio_set_conf->confs.get(direction);
        auto const& adsp_set_ase_confs =
            adsp_audio_set_conf.confs.get(direction);

      for (auto& adsp_set_conf : adsp_audio_set_conf.confs) {
        auto it = software_set_conf_direction_map.find(adsp_set_conf.direction);
        if (!software_set_ase_confs.size() || !adsp_set_ase_confs.size()) {
          continue;
        }

        if (it == software_set_conf_direction_map.end()) {
        // Check for number of ASEs mismatch
        if (adsp_set_ase_confs.size() != software_set_ase_confs.size()) {
          LOG_ERROR(
              "%s: ADSP config size mismatches the software: %zu != %zu",
              direction == types::kLeAudioDirectionSink ? "Sink" : "Source",
              adsp_set_ase_confs.size(), software_set_ase_confs.size());
          continue;
        }

        if (IsSetConfigurationMatched(it->second, adsp_set_conf)) {
        // The expected number of ASE configs, the ADSP config needs to match
        expected_match_cnt += software_set_ase_confs.size();
        if (expected_match_cnt == 0) {
          continue;
        }

        // Check for matching configs
        for (auto const& adsp_set_conf : adsp_set_ase_confs) {
          for (auto const& software_set_conf : software_set_ase_confs) {
            if (IsAseConfigurationMatched(software_set_conf, adsp_set_conf)) {
              match_cnt++;
              // Check the next adsp config if the first software config matches
              break;
            }
          }
        }
        if (match_cnt != expected_match_cnt) {
          break;
        }
      }

      if (match_cnt == software_set_conf_direction_map.size()) {
      // Check the match count
      if (match_cnt == expected_match_cnt) {
        return true;
      }
    }
@@ -730,42 +765,52 @@ struct codec_manager_impl {
      const std::vector<btle_audio_codec_config_t>& offload_preference_set) {
    LOG_DEBUG("Print adsp_capabilities:");

    for (auto adsp : adsp_capabilities) {
      LOG_DEBUG("%s, number of confs %d", adsp.name.c_str(),
                (int)(adsp.confs.size()));
      for (auto conf : adsp.confs) {
    for (auto& adsp : adsp_capabilities) {
      LOG_DEBUG("'%s':", adsp.name.c_str());
      for (auto direction : {le_audio::types::kLeAudioDirectionSink,
                             le_audio::types::kLeAudioDirectionSource}) {
        LOG_DEBUG(
            "dir: %s: number of confs %d:",
            (direction == types::kLeAudioDirectionSink ? "sink" : "source"),
            (int)(adsp.confs.get(direction).size()));
        for (auto conf : adsp.confs.sink) {
          LOG_DEBUG(
            "codecId: %d dir: %s, dev_cnt: %d ase_cnt: %d, strategy: %s, "
            "sample_freq: %d, interval %d, channel_cnt: %d",
            conf.codec.id.coding_format,
            (conf.direction == types::kLeAudioDirectionSink ? "sink"
                                                            : "source"),
            conf.device_cnt, conf.ase_cnt,
            getStrategyString(conf.strategy).c_str(),
            conf.codec.GetSamplingFrequencyHz(), conf.codec.GetDataIntervalUs(),
              "codecId: %d, sample_freq: %d, interval %d, channel_cnt: %d",
              conf.codec.id.coding_format, conf.codec.GetSamplingFrequencyHz(),
              conf.codec.GetDataIntervalUs(),
              conf.codec.GetChannelCountPerIsoStream());

          /* TODO: How to get bits_per_sample ? */
          btle_audio_codec_config_t capa_to_add = {
              .codec_type = (conf.codec.id.coding_format ==
                             types::kLeAudioCodingFormatLC3)
                                ? btle_audio_codec_index_t::
                                      LE_AUDIO_CODEC_INDEX_SOURCE_LC3
                                : btle_audio_codec_index_t::
                                      LE_AUDIO_CODEC_INDEX_SOURCE_INVALID,
              .sample_rate = utils::translateToBtLeAudioCodecConfigSampleRate(
                  conf.codec.GetSamplingFrequencyHz()),
              .bits_per_sample =
                  utils::translateToBtLeAudioCodecConfigBitPerSample(16),
            .channel_count = utils::translateToBtLeAudioCodecConfigChannelCount(
              .channel_count =
                  utils::translateToBtLeAudioCodecConfigChannelCount(
                      conf.codec.GetChannelCountPerIsoStream()),
              .frame_duration =
                  utils::translateToBtLeAudioCodecConfigFrameDuration(
                      conf.codec.GetDataIntervalUs()),
          };

        if (conf.direction == types::kLeAudioDirectionSink) {
          LOG_DEBUG("Adding output capa %d",
                    static_cast<int>(codec_output_capa.size()));
          codec_output_capa.push_back(capa_to_add);
        } else {
          LOG_DEBUG("Adding input capa %d",
                    static_cast<int>(codec_input_capa.size()));
          codec_input_capa.push_back(capa_to_add);
          auto& capa_container = (direction == types::kLeAudioDirectionSink)
                                     ? codec_output_capa
                                     : codec_input_capa;
          if (std::find(capa_container.begin(), capa_container.end(),
                        capa_to_add) == capa_container.end()) {
            LOG_DEBUG("Adding %s capa %d",
                      (direction == types::kLeAudioDirectionSink) ? "output"
                                                                  : "input",
                      static_cast<int>(capa_container.size()));
            capa_container.push_back(capa_to_add);
          }
        }
      }
    }
Loading