Loading bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp +48 −65 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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 Loading @@ -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(); Loading @@ -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 = Loading @@ -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()}); } } } } } } Loading @@ -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 = Loading @@ -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 { Loading @@ -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. Loading Loading @@ -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(); }; }; Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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 Loading Loading @@ -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(); Loading bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h +7 −3 Original line number Original line Diff line number Diff line Loading @@ -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, Loading bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp +12 −20 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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_; Loading Loading @@ -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) { Loading Loading @@ -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( Loading Loading @@ -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) { Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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); } } } } Loading Loading @@ -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 Loading
bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.cpp +48 −65 Original line number Original line Diff line number Diff line Loading @@ -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, Loading Loading @@ -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) { Loading @@ -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 Loading @@ -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 Loading @@ -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(); Loading @@ -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 = Loading @@ -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()}); } } } } } } Loading @@ -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 = Loading @@ -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 { Loading @@ -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. Loading Loading @@ -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(); }; }; Loading Loading @@ -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) { Loading @@ -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) { Loading @@ -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 Loading Loading @@ -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(); Loading
bluetooth/audio/aidl/default/LeAudioOffloadAudioProvider.h +7 −3 Original line number Original line Diff line number Diff line Loading @@ -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, Loading
bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.cpp +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading
bluetooth/audio/utils/aidl_session/BluetoothAudioCodecs.h +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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(); Loading
bluetooth/audio/utils/aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp +12 −20 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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_; Loading Loading @@ -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) { Loading Loading @@ -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( Loading Loading @@ -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) { Loading @@ -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, Loading Loading @@ -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); Loading Loading @@ -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); } } } } Loading Loading @@ -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