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

Commit 2233a9b2 authored by Bao Do's avatar Bao Do Committed by Gerrit Code Review
Browse files

Merge "Remove debug name from MetadataLtv and store in in-memory structure." into main

parents 684b4949 a73199af
Loading
Loading
Loading
Loading
+48 −65
Original line number Original line Diff line number Diff line
@@ -123,40 +123,6 @@ bool LeAudioOffloadAudioProvider::isValid(const SessionType& sessionType) {
  return (sessionType == session_type_);
  return (sessionType == session_type_);
}
}


std::string getSettingOutputString(
    IBluetoothAudioProvider::LeAudioAseConfigurationSetting& setting) {
  std::stringstream ss;
  std::string name = "";
  if (!setting.sinkAseConfiguration.has_value() &&
      !setting.sourceAseConfiguration.has_value())
    return "";
  std::vector<
      std::optional<LeAudioAseConfigurationSetting::AseDirectionConfiguration>>*
      directionAseConfiguration;
  if (setting.sinkAseConfiguration.has_value() &&
      !setting.sinkAseConfiguration.value().empty())
    directionAseConfiguration = &setting.sinkAseConfiguration.value();
  else
    directionAseConfiguration = &setting.sourceAseConfiguration.value();
  for (auto& aseConfiguration : *directionAseConfiguration) {
    if (aseConfiguration.has_value() &&
        aseConfiguration.value().aseConfiguration.metadata.has_value()) {
      for (auto& meta :
           aseConfiguration.value().aseConfiguration.metadata.value()) {
        if (meta.has_value() &&
            meta.value().getTag() == MetadataLtv::vendorSpecific) {
          auto k = meta.value().get<MetadataLtv::vendorSpecific>().opaqueValue;
          name = std::string(k.begin(), k.end());
          break;
        }
      }
    }
  }

  ss << "setting name: " << name << ", setting: " << setting.toString();
  return ss.str();
}

ndk::ScopedAStatus LeAudioOffloadAudioProvider::startSession(
ndk::ScopedAStatus LeAudioOffloadAudioProvider::startSession(
    const std::shared_ptr<IBluetoothAudioPort>& host_if,
    const std::shared_ptr<IBluetoothAudioPort>& host_if,
    const AudioConfiguration& audio_config,
    const AudioConfiguration& audio_config,
@@ -742,9 +708,11 @@ LeAudioOffloadAudioProvider::getRequirementMatchedAseConfigurationSettings(
  return filtered_setting;
  return filtered_setting;
}
}


std::optional<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
std::optional<std::pair<
    std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
LeAudioOffloadAudioProvider::matchWithRequirement(
LeAudioOffloadAudioProvider::matchWithRequirement(
    std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
    std::vector<std::pair<
        std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>&
        matched_ase_configuration_settings,
        matched_ase_configuration_settings,
    const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement,
    const IBluetoothAudioProvider::LeAudioConfigurationRequirement& requirement,
    bool isMatchContext, bool isExact, bool isMatchFlags) {
    bool isMatchContext, bool isExact, bool isMatchFlags) {
@@ -758,14 +726,15 @@ LeAudioOffloadAudioProvider::matchWithRequirement(
    if (!requirement.flags.has_value()) return std::nullopt;
    if (!requirement.flags.has_value()) return std::nullopt;
    requirement_flags_bitmask = requirement.flags.value().bitmask;
    requirement_flags_bitmask = requirement.flags.value().bitmask;
  }
  }
  for (auto& setting : matched_ase_configuration_settings) {
  for (auto& [setting_name, setting] : matched_ase_configuration_settings) {
    // Try to match context.
    // Try to match context.
    if (isMatchContext) {
    if (isMatchContext) {
      if ((setting.audioContext.bitmask & requirement.audioContext.bitmask) !=
      if ((setting.audioContext.bitmask & requirement.audioContext.bitmask) !=
          requirement.audioContext.bitmask)
          requirement.audioContext.bitmask)
        continue;
        continue;
      LOG(DEBUG) << __func__ << ": Setting with matched context: "
      LOG(DEBUG) << __func__
                 << getSettingOutputString(setting);
                 << ": Setting with matched context: name: " << setting_name
                 << ", setting: " << setting.toString();
    }
    }


    // Try to match configuration flags
    // Try to match configuration flags
@@ -774,19 +743,20 @@ LeAudioOffloadAudioProvider::matchWithRequirement(
      if ((setting.flags.value().bitmask & requirement_flags_bitmask) !=
      if ((setting.flags.value().bitmask & requirement_flags_bitmask) !=
          requirement_flags_bitmask)
          requirement_flags_bitmask)
        continue;
        continue;
      LOG(DEBUG) << __func__ << ": Setting with matched flags: "
      LOG(DEBUG) << __func__
                 << getSettingOutputString(setting);
                 << ": Setting with matched flags: name: " << setting_name
                 << ", setting: " << setting.toString();
    }
    }


    auto filtered_ase_configuration_setting =
    auto filtered_ase_configuration_setting =
        getRequirementMatchedAseConfigurationSettings(setting, requirement,
        getRequirementMatchedAseConfigurationSettings(setting, requirement,
                                                      isExact);
                                                      isExact);
    if (filtered_ase_configuration_setting.has_value()) {
    if (filtered_ase_configuration_setting.has_value()) {
      LOG(INFO) << __func__ << ": Result found: "
      LOG(INFO) << __func__ << ": Result found: name: " << setting_name
                << getSettingOutputString(
                << ", setting: "
                       filtered_ase_configuration_setting.value());
                << filtered_ase_configuration_setting.value().toString();
      // Found a matched setting, ignore other settings
      // Found a matched setting, ignore other settings
      return filtered_ase_configuration_setting;
      return {{setting_name, filtered_ase_configuration_setting.value()}};
    }
    }
  }
  }
  // If cannot satisfy this requirement, return nullopt
  // If cannot satisfy this requirement, return nullopt
@@ -812,7 +782,8 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
    std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>*
    std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>*
        _aidl_return) {
        _aidl_return) {
  // Get all configuration settings
  // Get all configuration settings
  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
  std::vector<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
      ase_configuration_settings =
      ase_configuration_settings =
          BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings();
          BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings();


@@ -822,15 +793,17 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
  }
  }


  // Matched ASE configuration with ignored audio context
  // Matched ASE configuration with ignored audio context
  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
  std::vector<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
      sink_matched_ase_configuration_settings;
      sink_matched_ase_configuration_settings;
  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
  std::vector<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
      matched_ase_configuration_settings;
      matched_ase_configuration_settings;


  // A setting must match both source and sink.
  // A setting must match both source and sink.
  // First filter all setting matched with sink capability
  // First filter all setting matched with sink capability
  if (in_remoteSinkAudioCapabilities.has_value()) {
  if (in_remoteSinkAudioCapabilities.has_value()) {
    for (auto& setting : ase_configuration_settings) {
    for (auto& [setting_name, setting] : ase_configuration_settings) {
      for (auto& capability : in_remoteSinkAudioCapabilities.value()) {
      for (auto& capability : in_remoteSinkAudioCapabilities.value()) {
        if (!capability.has_value()) continue;
        if (!capability.has_value()) continue;
        auto filtered_ase_configuration_setting =
        auto filtered_ase_configuration_setting =
@@ -838,7 +811,7 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
                setting, capability.value(), kLeAudioDirectionSink);
                setting, capability.value(), kLeAudioDirectionSink);
        if (filtered_ase_configuration_setting.has_value()) {
        if (filtered_ase_configuration_setting.has_value()) {
          sink_matched_ase_configuration_settings.push_back(
          sink_matched_ase_configuration_settings.push_back(
              filtered_ase_configuration_setting.value());
              {setting_name, filtered_ase_configuration_setting.value()});
        }
        }
      }
      }
    }
    }
@@ -848,7 +821,8 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(


  // Combine filter every source capability
  // Combine filter every source capability
  if (in_remoteSourceAudioCapabilities.has_value()) {
  if (in_remoteSourceAudioCapabilities.has_value()) {
    for (auto& setting : sink_matched_ase_configuration_settings)
    for (auto& [setting_name, setting] :
         sink_matched_ase_configuration_settings)
      for (auto& capability : in_remoteSourceAudioCapabilities.value()) {
      for (auto& capability : in_remoteSourceAudioCapabilities.value()) {
        if (!capability.has_value()) continue;
        if (!capability.has_value()) continue;
        auto filtered_ase_configuration_setting =
        auto filtered_ase_configuration_setting =
@@ -856,7 +830,7 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
                setting, capability.value(), kLeAudioDirectionSource);
                setting, capability.value(), kLeAudioDirectionSource);
        if (filtered_ase_configuration_setting.has_value()) {
        if (filtered_ase_configuration_setting.has_value()) {
          matched_ase_configuration_settings.push_back(
          matched_ase_configuration_settings.push_back(
              filtered_ase_configuration_setting.value());
              {setting_name, filtered_ase_configuration_setting.value()});
        }
        }
      }
      }
  } else {
  } else {
@@ -864,7 +838,11 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
        sink_matched_ase_configuration_settings;
        sink_matched_ase_configuration_settings;
  }
  }


  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting> result;
  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
      result_no_name;
  std::vector<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
      result;
  for (auto& requirement : in_requirements) {
  for (auto& requirement : in_requirements) {
    // For each requirement, try to match with a setting.
    // For each requirement, try to match with a setting.
    // If we cannot match, return an empty result.
    // If we cannot match, return an empty result.
@@ -896,18 +874,19 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseConfiguration(
    if (!found) {
    if (!found) {
      LOG(ERROR) << __func__
      LOG(ERROR) << __func__
                 << ": Cannot find any match for this requirement, exitting...";
                 << ": Cannot find any match for this requirement, exitting...";
      result.clear();
      *_aidl_return = result_no_name;
      *_aidl_return = result;
      return ndk::ScopedAStatus::ok();
      return ndk::ScopedAStatus::ok();
    }
    }
  }
  }


  LOG(INFO) << __func__
  LOG(INFO) << __func__
            << ": Found matches for all requirements, chosen settings:";
            << ": Found matches for all requirements, chosen settings:";
  for (auto& setting : result) {
  for (auto& [setting_name, setting] : result) {
    LOG(INFO) << __func__ << ": " << getSettingOutputString(setting);
    LOG(INFO) << __func__ << ": name: " << setting_name
              << ", setting: " << setting.toString();
    result_no_name.push_back(setting);
  }
  }
  *_aidl_return = result;
  *_aidl_return = result_no_name;
  return ndk::ScopedAStatus::ok();
  return ndk::ScopedAStatus::ok();
};
};


@@ -937,7 +916,8 @@ LeAudioOffloadAudioProvider::getDirectionQosConfiguration(
    uint8_t direction,
    uint8_t direction,
    const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
    const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
        qosRequirement,
        qosRequirement,
    std::vector<LeAudioAseConfigurationSetting>& ase_configuration_settings,
    std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>&
        ase_configuration_settings,
    bool isExact, bool isMatchFlags) {
    bool isExact, bool isMatchFlags) {
  auto requirement_flags_bitmask = 0;
  auto requirement_flags_bitmask = 0;
  if (isMatchFlags) {
  if (isMatchFlags) {
@@ -955,13 +935,14 @@ LeAudioOffloadAudioProvider::getDirectionQosConfiguration(
    direction_qos_requirement = qosRequirement.sourceAseQosRequirement.value();
    direction_qos_requirement = qosRequirement.sourceAseQosRequirement.value();
  }
  }


  for (auto& setting : ase_configuration_settings) {
  for (auto& [setting_name, setting] : ase_configuration_settings) {
    // Context matching
    // Context matching
    if ((setting.audioContext.bitmask & qosRequirement.audioContext.bitmask) !=
    if ((setting.audioContext.bitmask & qosRequirement.audioContext.bitmask) !=
        qosRequirement.audioContext.bitmask)
        qosRequirement.audioContext.bitmask)
      continue;
      continue;
    LOG(DEBUG) << __func__ << ": Setting with matched context: "
    LOG(DEBUG) << __func__
               << getSettingOutputString(setting);
               << ": Setting with matched context: name: " << setting_name
               << ", setting: " << setting.toString();


    // Match configuration flags
    // Match configuration flags
    if (isMatchFlags) {
    if (isMatchFlags) {
@@ -969,8 +950,9 @@ LeAudioOffloadAudioProvider::getDirectionQosConfiguration(
      if ((setting.flags.value().bitmask & requirement_flags_bitmask) !=
      if ((setting.flags.value().bitmask & requirement_flags_bitmask) !=
          requirement_flags_bitmask)
          requirement_flags_bitmask)
        continue;
        continue;
      LOG(DEBUG) << __func__ << ": Setting with matched flags: "
      LOG(DEBUG) << __func__
                 << getSettingOutputString(setting);
                 << ": Setting with matched flags: name: " << setting_name
                 << ", setting: " << setting.toString();
    }
    }


    // Get a list of all matched AseDirectionConfiguration
    // Get a list of all matched AseDirectionConfiguration
@@ -1041,7 +1023,8 @@ ndk::ScopedAStatus LeAudioOffloadAudioProvider::getLeAudioAseQosConfiguration(
  IBluetoothAudioProvider::LeAudioAseQosConfigurationPair result;
  IBluetoothAudioProvider::LeAudioAseQosConfigurationPair result;


  // Get all configuration settings
  // Get all configuration settings
  std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
  std::vector<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
      ase_configuration_settings =
      ase_configuration_settings =
          BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings();
          BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings();


+7 −3
Original line number Original line Diff line number Diff line
@@ -163,15 +163,19 @@ class LeAudioOffloadAudioProvider : public BluetoothAudioProvider {
      uint8_t direction,
      uint8_t direction,
      const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
      const IBluetoothAudioProvider::LeAudioAseQosConfigurationRequirement&
          qosRequirement,
          qosRequirement,
      std::vector<LeAudioAseConfigurationSetting>& ase_configuration_settings,
      std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>&
          ase_configuration_settings,
      bool isExact, bool isMatchedFlag);
      bool isExact, bool isMatchedFlag);
  bool isSubgroupConfigurationMatchedContext(
  bool isSubgroupConfigurationMatchedContext(
      AudioContext requirement_context,
      AudioContext requirement_context,
      IBluetoothAudioProvider::BroadcastQuality quality,
      IBluetoothAudioProvider::BroadcastQuality quality,
      LeAudioBroadcastSubgroupConfiguration configuration);
      LeAudioBroadcastSubgroupConfiguration configuration);
  std::optional<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>
  std::optional<std::pair<
      std::string, IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>
  matchWithRequirement(
  matchWithRequirement(
      std::vector<IBluetoothAudioProvider::LeAudioAseConfigurationSetting>&
      std::vector<
          std::pair<std::string,
                    IBluetoothAudioProvider::LeAudioAseConfigurationSetting>>&
          matched_ase_configuration_settings,
          matched_ase_configuration_settings,
      const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
      const IBluetoothAudioProvider::LeAudioConfigurationRequirement&
          requirements,
          requirements,
+1 −1
Original line number Original line Diff line number Diff line
@@ -452,7 +452,7 @@ std::vector<CodecInfo> BluetoothAudioCodecs::GetHfpOffloadCodecInfo() {
  return kDefaultOffloadHfpCodecInfo;
  return kDefaultOffloadHfpCodecInfo;
}
}


std::vector<LeAudioAseConfigurationSetting>
std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>
BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings() {
BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings() {
  return AudioSetConfigurationProviderJson::
  return AudioSetConfigurationProviderJson::
      GetLeAudioAseConfigurationSettings();
      GetLeAudioAseConfigurationSettings();
+1 −1
Original line number Original line Diff line number Diff line
@@ -54,7 +54,7 @@ class BluetoothAudioCodecs {
  static std::vector<CodecInfo> GetLeAudioOffloadCodecInfo(
  static std::vector<CodecInfo> GetLeAudioOffloadCodecInfo(
      const SessionType& session_type);
      const SessionType& session_type);


  static std::vector<LeAudioAseConfigurationSetting>
  static std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>
  GetLeAudioAseConfigurationSettings();
  GetLeAudioAseConfigurationSettings();


  static std::vector<CodecInfo> GetHfpOffloadCodecInfo();
  static std::vector<CodecInfo> GetHfpOffloadCodecInfo();
+12 −20
Original line number Original line Diff line number Diff line
@@ -65,7 +65,8 @@ std::map<std::string,
                    ConfigurationFlags>>
                    ConfigurationFlags>>
    configurations_;
    configurations_;


std::vector<LeAudioAseConfigurationSetting> ase_configuration_settings_;
std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>
    ase_configuration_settings_;


constexpr uint8_t kIsoDataPathHci = 0x00;
constexpr uint8_t kIsoDataPathHci = 0x00;
constexpr uint8_t kIsoDataPathPlatformDefault = 0x01;
constexpr uint8_t kIsoDataPathPlatformDefault = 0x01;
@@ -273,7 +274,7 @@ static const std::vector<


/* Implementation */
/* Implementation */


std::vector<LeAudioAseConfigurationSetting>
std::vector<std::pair<std::string, LeAudioAseConfigurationSetting>>
AudioSetConfigurationProviderJson::GetLeAudioAseConfigurationSettings() {
AudioSetConfigurationProviderJson::GetLeAudioAseConfigurationSettings() {
  AudioSetConfigurationProviderJson::LoadAudioSetConfigurationProviderJson();
  AudioSetConfigurationProviderJson::LoadAudioSetConfigurationProviderJson();
  return ase_configuration_settings_;
  return ase_configuration_settings_;
@@ -392,7 +393,7 @@ void AudioSetConfigurationProviderJson::populateConfigurationData(
}
}


void AudioSetConfigurationProviderJson::populateAseConfiguration(
void AudioSetConfigurationProviderJson::populateAseConfiguration(
    const std::string& name, LeAudioAseConfiguration& ase,
    LeAudioAseConfiguration& ase,
    const le_audio::AudioSetSubConfiguration* flat_subconfig,
    const le_audio::AudioSetSubConfiguration* flat_subconfig,
    const le_audio::QosConfiguration* qos_cfg,
    const le_audio::QosConfiguration* qos_cfg,
    ConfigurationFlags& configurationFlags) {
    ConfigurationFlags& configurationFlags) {
@@ -431,12 +432,6 @@ void AudioSetConfigurationProviderJson::populateAseConfiguration(
  }
  }
  // Codec configuration data
  // Codec configuration data
  populateConfigurationData(ase, flat_subconfig->codec_configuration());
  populateConfigurationData(ase, flat_subconfig->codec_configuration());
  // Populate the config name for easier debug
  auto meta = std::vector<std::optional<MetadataLtv>>();
  MetadataLtv::VendorSpecific cfg_name;
  cfg_name.opaqueValue = std::vector<uint8_t>(name.begin(), name.end());
  meta.push_back(cfg_name);
  ase.metadata = meta;
}
}


void AudioSetConfigurationProviderJson::populateAseQosConfiguration(
void AudioSetConfigurationProviderJson::populateAseQosConfiguration(
@@ -507,7 +502,6 @@ void AudioSetConfigurationProviderJson::populateAseQosConfiguration(
// Parse into AseDirectionConfiguration
// Parse into AseDirectionConfiguration
AseDirectionConfiguration
AseDirectionConfiguration
AudioSetConfigurationProviderJson::SetConfigurationFromFlatSubconfig(
AudioSetConfigurationProviderJson::SetConfigurationFromFlatSubconfig(
    const std::string& name,
    const le_audio::AudioSetSubConfiguration* flat_subconfig,
    const le_audio::AudioSetSubConfiguration* flat_subconfig,
    const le_audio::QosConfiguration* qos_cfg, CodecLocation location,
    const le_audio::QosConfiguration* qos_cfg, CodecLocation location,
    ConfigurationFlags& configurationFlags) {
    ConfigurationFlags& configurationFlags) {
@@ -518,8 +512,7 @@ AudioSetConfigurationProviderJson::SetConfigurationFromFlatSubconfig(
  LeAudioDataPathConfiguration path;
  LeAudioDataPathConfiguration path;


  // Translate into LeAudioAseConfiguration
  // Translate into LeAudioAseConfiguration
  populateAseConfiguration(name, ase, flat_subconfig, qos_cfg,
  populateAseConfiguration(ase, flat_subconfig, qos_cfg, configurationFlags);
                           configurationFlags);


  // Translate into LeAudioAseQosConfiguration
  // Translate into LeAudioAseQosConfiguration
  populateAseQosConfiguration(qos, qos_cfg, ase,
  populateAseQosConfiguration(qos, qos_cfg, ase,
@@ -553,15 +546,14 @@ AudioSetConfigurationProviderJson::SetConfigurationFromFlatSubconfig(
// Parse into AseDirectionConfiguration and the ConfigurationFlags
// Parse into AseDirectionConfiguration and the ConfigurationFlags
// and put them in the given list.
// and put them in the given list.
void AudioSetConfigurationProviderJson::processSubconfig(
void AudioSetConfigurationProviderJson::processSubconfig(
    const std::string& name,
    const le_audio::AudioSetSubConfiguration* subconfig,
    const le_audio::AudioSetSubConfiguration* subconfig,
    const le_audio::QosConfiguration* qos_cfg,
    const le_audio::QosConfiguration* qos_cfg,
    std::vector<std::optional<AseDirectionConfiguration>>&
    std::vector<std::optional<AseDirectionConfiguration>>&
        directionAseConfiguration,
        directionAseConfiguration,
    CodecLocation location, ConfigurationFlags& configurationFlags) {
    CodecLocation location, ConfigurationFlags& configurationFlags) {
  auto ase_cnt = subconfig->ase_cnt();
  auto ase_cnt = subconfig->ase_cnt();
  auto config = SetConfigurationFromFlatSubconfig(name, subconfig, qos_cfg,
  auto config = SetConfigurationFromFlatSubconfig(subconfig, qos_cfg, location,
                                                  location, configurationFlags);
                                                  configurationFlags);
  directionAseConfiguration.push_back(config);
  directionAseConfiguration.push_back(config);
  // Put the same setting again.
  // Put the same setting again.
  if (ase_cnt == 2) directionAseConfiguration.push_back(config);
  if (ase_cnt == 2) directionAseConfiguration.push_back(config);
@@ -646,11 +638,11 @@ void AudioSetConfigurationProviderJson::PopulateAseConfigurationFromFlat(
    /* Load subconfigurations */
    /* Load subconfigurations */
    for (auto subconfig : *codec_cfg->subconfigurations()) {
    for (auto subconfig : *codec_cfg->subconfigurations()) {
      if (subconfig->direction() == kLeAudioDirectionSink) {
      if (subconfig->direction() == kLeAudioDirectionSink) {
        processSubconfig(flat_cfg->name()->str(), subconfig, qos_sink_cfg,
        processSubconfig(subconfig, qos_sink_cfg, sinkAseConfiguration,
                         sinkAseConfiguration, location, configurationFlags);
                         location, configurationFlags);
      } else {
      } else {
        processSubconfig(flat_cfg->name()->str(), subconfig, qos_source_cfg,
        processSubconfig(subconfig, qos_source_cfg, sourceAseConfiguration,
                         sourceAseConfiguration, location, configurationFlags);
                         location, configurationFlags);
      }
      }
    }
    }


@@ -860,7 +852,7 @@ bool AudioSetConfigurationProviderJson::LoadScenariosFromFiles(
      setting.flags = flags;
      setting.flags = flags;
      // Add to list of setting
      // Add to list of setting
      LOG(DEBUG) << "Pushing configuration to list: " << config_name;
      LOG(DEBUG) << "Pushing configuration to list: " << config_name;
      ase_configuration_settings_.push_back(setting);
      ase_configuration_settings_.push_back({config_name, setting});
    }
    }
  }
  }


Loading