Template and schemas for parsing LE Audio Set Configuration.

Bug: 306225778
Test: mmm hardware/interfaces/bluetooth/audio/utils
Change-Id: I20482faf20a41f04c39e1314db45a07cb5f9956b
This commit is contained in:
Bao Do
2023-11-15 03:21:03 +00:00
parent 6aeb5d7217
commit fbc99e05c6
8 changed files with 12032 additions and 1 deletions

View File

@@ -42,6 +42,7 @@ cc_library_shared {
"aidl_session/BluetoothAudioSession.cpp",
"aidl_session/HidlToAidlMiddleware.cpp",
"aidl_session/BluetoothLeAudioCodecsProvider.cpp",
"aidl_session/BluetoothLeAudioAseConfigurationSettingProvider.cpp",
],
export_include_dirs: ["aidl_session/"],
header_libs: [
@@ -61,9 +62,13 @@ cc_library_shared {
"liblog",
"libhidlbase",
"libxml2",
"libflatbuffers-cpp",
],
generated_sources: ["le_audio_codec_capabilities"],
generated_headers: ["le_audio_codec_capabilities"],
generated_headers: [
"le_audio_codec_capabilities",
"AIDLLeAudioSetConfigSchemas_h",
],
}
cc_test {
@@ -98,3 +103,77 @@ xsd_config {
api_dir: "le_audio_codec_capabilities/schema",
root_elements: ["leAudioOffloadSetting"],
}
genrule {
name: "AIDLLeAudioSetConfigSchemas_h",
tools: [
"flatc",
],
cmd: "$(location flatc) -I hardware/interfaces/bluetooth/audio/utils/ -o $(genDir) --cpp $(in) ",
srcs: [
"le_audio_configuration_set/audio_set_configurations.fbs",
"le_audio_configuration_set/audio_set_scenarios.fbs",
],
out: [
"audio_set_configurations_generated.h",
"audio_set_scenarios_generated.h",
],
}
// Binary generation
genrule {
name: "AIDLLeAudioSetScenariosSchema_bfbs",
tools: [
"flatc",
],
cmd: "$(location flatc) -I hardware/interfaces/bluetooth/audio/utils/ -b --schema -o $(genDir) $(in) ",
srcs: [
"le_audio_configuration_set/audio_set_scenarios.fbs",
],
out: [
"audio_set_scenarios.bfbs",
],
}
genrule {
name: "AIDLLeAudioSetConfigsSchema_bfbs",
tools: [
"flatc",
],
cmd: "$(location flatc) -I hardware/interfaces/bluetooth/audio/utils/ -b --schema -o $(genDir) $(in) ",
srcs: [
"le_audio_configuration_set/audio_set_configurations.fbs",
],
out: [
"audio_set_configurations.bfbs",
],
}
// Add to prebuilt etc
prebuilt_etc {
name: "aidl_audio_set_scenarios_bfbs",
src: ":AIDLLeAudioSetScenariosSchema_bfbs",
filename: "aidl_audio_set_scenarios.bfbs",
sub_dir: "aidl/le_audio",
}
prebuilt_etc {
name: "aidl_audio_set_scenarios_json",
src: "le_audio_configuration_set/audio_set_scenarios.json",
filename: "aidl_audio_set_scenarios.json",
sub_dir: "aidl/le_audio",
}
prebuilt_etc {
name: "aidl_audio_set_configurations_bfbs",
src: ":AIDLLeAudioSetConfigsSchema_bfbs",
filename: "aidl_audio_set_configurations.bfbs",
sub_dir: "aidl/le_audio",
}
prebuilt_etc {
name: "aidl_audio_set_configurations_json",
src: "le_audio_configuration_set/audio_set_configurations.json",
filename: "aidl_audio_set_configurations.json",
sub_dir: "aidl/le_audio",
}

View File

@@ -32,6 +32,7 @@
#include <aidl/android/hardware/bluetooth/audio/SbcChannelMode.h>
#include <android-base/logging.h>
#include "BluetoothLeAudioAseConfigurationSettingProvider.h"
#include "BluetoothLeAudioCodecsProvider.h"
namespace aidl {
@@ -438,6 +439,12 @@ std::vector<CodecInfo> BluetoothAudioCodecs::GetLeAudioOffloadCodecInfo(
return codec_info_map_iter->second;
}
std::vector<LeAudioAseConfigurationSetting>
BluetoothAudioCodecs::GetLeAudioAseConfigurationSettings() {
return AudioSetConfigurationProviderJson::
GetLeAudioAseConfigurationSettings();
}
} // namespace audio
} // namespace bluetooth
} // namespace hardware

View File

@@ -19,6 +19,7 @@
#include <aidl/android/hardware/bluetooth/audio/CodecCapabilities.h>
#include <aidl/android/hardware/bluetooth/audio/CodecConfiguration.h>
#include <aidl/android/hardware/bluetooth/audio/CodecInfo.h>
#include <aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.h>
#include <aidl/android/hardware/bluetooth/audio/LeAudioCodecCapabilitiesSetting.h>
#include <aidl/android/hardware/bluetooth/audio/LeAudioConfiguration.h>
#include <aidl/android/hardware/bluetooth/audio/OpusConfiguration.h>
@@ -34,6 +35,9 @@ namespace hardware {
namespace bluetooth {
namespace audio {
using LeAudioAseConfigurationSetting =
IBluetoothAudioProvider::LeAudioAseConfigurationSetting;
class BluetoothAudioCodecs {
public:
static std::vector<PcmCapabilities> GetSoftwarePcmCapabilities();
@@ -50,6 +54,9 @@ class BluetoothAudioCodecs {
static std::vector<CodecInfo> GetLeAudioOffloadCodecInfo(
const SessionType& session_type);
static std::vector<LeAudioAseConfigurationSetting>
GetLeAudioAseConfigurationSettings();
private:
template <typename T>
struct identity {

View File

@@ -0,0 +1,125 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <aidl/android/hardware/bluetooth/audio/IBluetoothAudioProvider.h>
#include <map>
#include <mutex>
#include <optional>
#include <string>
#include <string_view>
#include <tuple>
#include "audio_set_configurations_generated.h"
#include "audio_set_scenarios_generated.h"
namespace aidl {
namespace android {
namespace hardware {
namespace bluetooth {
namespace audio {
using LeAudioAseConfigurationSetting =
IBluetoothAudioProvider::LeAudioAseConfigurationSetting;
using AseDirectionConfiguration = IBluetoothAudioProvider::
LeAudioAseConfigurationSetting::AseDirectionConfiguration;
using LeAudioAseQosConfiguration =
IBluetoothAudioProvider::LeAudioAseQosConfiguration;
using LeAudioDataPathConfiguration =
IBluetoothAudioProvider::LeAudioDataPathConfiguration;
enum class CodecLocation {
HOST,
ADSP,
CONTROLLER,
};
class AudioSetConfigurationProviderJson {
public:
static std::vector<LeAudioAseConfigurationSetting>
GetLeAudioAseConfigurationSettings();
private:
static void LoadAudioSetConfigurationProviderJson();
static const le_audio::CodecSpecificConfiguration* LookupCodecSpecificParam(
const flatbuffers::Vector<flatbuffers::Offset<
le_audio::CodecSpecificConfiguration>>* flat_codec_specific_params,
le_audio::CodecSpecificLtvGenericTypes type);
static void populateAudioChannelAllocation(
CodecSpecificConfigurationLtv::AudioChannelAllocation&
audio_channel_allocation,
uint32_t audio_location);
static void populateConfigurationData(
LeAudioAseConfiguration& ase,
const flatbuffers::Vector<
flatbuffers::Offset<le_audio::CodecSpecificConfiguration>>*
flat_codec_specific_params);
static void populateAseConfiguration(
LeAudioAseConfiguration& ase,
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg);
static void populateAseQosConfiguration(
LeAudioAseQosConfiguration& qos,
const le_audio::QosConfiguration* qos_cfg);
static AseDirectionConfiguration SetConfigurationFromFlatSubconfig(
const le_audio::AudioSetSubConfiguration* flat_subconfig,
const le_audio::QosConfiguration* qos_cfg, CodecLocation location);
static void processSubconfig(
const le_audio::AudioSetSubConfiguration* subconfig,
const le_audio::QosConfiguration* qos_cfg,
std::vector<std::optional<AseDirectionConfiguration>>&
directionAseConfiguration,
CodecLocation location);
static void PopulateAseConfigurationFromFlat(
const le_audio::AudioSetConfiguration* flat_cfg,
std::vector<const le_audio::CodecConfiguration*>* codec_cfgs,
std::vector<const le_audio::QosConfiguration*>* qos_cfgs,
CodecLocation location,
std::vector<std::optional<AseDirectionConfiguration>>&
sourceAseConfiguration,
std::vector<std::optional<AseDirectionConfiguration>>&
sinkAseConfiguration,
ConfigurationFlags& configurationFlags);
static bool LoadConfigurationsFromFiles(const char* schema_file,
const char* content_file,
CodecLocation location);
static bool LoadScenariosFromFiles(const char* schema_file,
const char* content_file);
static bool LoadContent(
std::vector<std::pair<const char* /*schema*/, const char* /*content*/>>
config_files,
std::vector<std::pair<const char* /*schema*/, const char* /*content*/>>
scenario_files,
CodecLocation location);
};
} // namespace audio
} // namespace bluetooth
} // namespace hardware
} // namespace android
} // namespace aidl

View File

@@ -0,0 +1,91 @@
/*
* Copyright (c) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
namespace aidl.android.hardware.bluetooth.audio.le_audio;
enum CodecSpecificLtvGenericTypes : byte {
SUPPORTED_SAMPLING_FREQUENCY = 0x01,
SUPPORTED_FRAME_DURATION = 0x02,
SUPPORTED_AUDIO_CHANNEL_ALLOCATION = 0x03,
SUPPORTED_OCTETS_PER_CODEC_FRAME = 0x04,
SUPPORTED_CODEC_FRAME_BLOCKS_PER_SDU = 0x05,
}
/// Note: Holds either a single value (when `value_width == 0`) or multiple
/// values if `value.length()` is no-remainder divisible by the non-zero
/// `value_width`.
/// Note: Consider extending it with `flags` field, to hold additional info like
/// IsBitfield, IsRange, etc. if we need these type-specific validations.
table CompoundValue {
value: [ubyte] (required);
value_width: ubyte = 0;
}
table CodecSpecificConfiguration {
name: string;
type: ubyte (key);
compound_value: CompoundValue;
}
struct CodecId {
coding_format: ubyte;
vendor_company_id : ushort;
vendor_codec_id : ushort;
}
enum AudioSetConfigurationStrategy : byte {
MONO_ONE_CIS_PER_DEVICE = 0x00,
STEREO_TWO_CISES_PER_DEVICE = 0x01,
STEREO_ONE_CIS_PER_DEVICE = 0x02,
}
enum AudioSetConfigurationDirection : byte {
SINK = 0x01,
SOURCE = 0x02,
}
enum AudioSetConfigurationTargetLatency : byte {
LOW = 0x01,
BALANCED_RELIABILITY = 0x02,
HIGH_RELIABILITY = 0x03,
}
table AudioSetSubConfiguration {
device_cnt: ubyte;
ase_cnt: ubyte;
direction: AudioSetConfigurationDirection = SINK;
configuration_strategy: AudioSetConfigurationStrategy;
codec_id : CodecId (required);
codec_configuration: [CodecSpecificConfiguration] (required);
}
table CodecConfiguration {
name: string (key, required);
subconfigurations: [AudioSetSubConfiguration] (required);
}
table QosConfiguration {
name: string (key, required);
target_latency: AudioSetConfigurationTargetLatency = BALANCED_RELIABILITY;
retransmission_number: ubyte;
max_transport_latency : ushort;
}
/// Each set configration can contain multiple logical subconfigurations, which
/// all must be configurable with the current set of audio devices. For example,
/// one can define multiple output stream configurations with different
/// qualities, or assign different configurations to each stream direction.
table AudioSetConfiguration {
name: string (key, required);
codec_config_name: string (required);
qos_config_name: [string] (required);
}
table AudioSetConfigurations {
_comments_: [string];
configurations: [AudioSetConfiguration] (required);
codec_configurations: [CodecConfiguration] (required);
qos_configurations: [QosConfiguration] (required);
}
root_type AudioSetConfigurations;

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,36 @@
/*
* Copyright (c) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
namespace aidl.android.hardware.bluetooth.audio.le_audio;
/// Scenario represents the use case such as "Media", "Conversation", etc.
/// Each scenario can list any number of codec configurations by their names in
/// the order of preference. That means if the first entry does not meet all
/// the current requirements (such as peer device capabilities etc.) next
/// configurations are being checked.
///
/// The referenced codec configurations are defined by the
/// audio_set_configurations.fbs schema and loaded from a different source file.
/// Multiple scenarios can reference same codec configurations.
table AudioSetScenario {
_comments_: [string];
name: string (key, required);
configurations: [string] (required);
}
table AudioSetScenarios {
_comments_: [string];
scenarios: [AudioSetScenario] (required);
}
root_type AudioSetScenarios;

View File

@@ -0,0 +1,304 @@
{
"_comments_": [
"== Audio Set Scenarios ==",
" Each defined scenario references externally defined audio set",
" configurations, listed in the order of priority."
],
"scenarios": [
{
"name": "Conversational",
"configurations": [
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_2",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_2",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_32_2_1",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_2",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_2",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
"DualDev_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanStereoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_48_4_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_48_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_48_3_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_48_1_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_32_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_32_1_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_24_2_Balanced_Reliability",
"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",
"DualDev_OneChanMonoSnk_16_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_16_2_Balanced_Reliability"
]
},
{
"name": "Media",
"configurations": [
"DualDev_OneChanStereoSnk_48_4_High_Reliability",
"DualDev_OneChanStereoSnk_48_4_2",
"DualDev_OneChanStereoSnk_48_2_High_Reliability",
"DualDev_OneChanStereoSnk_48_2_2",
"DualDev_OneChanStereoSnk_48_3_High_Reliability",
"DualDev_OneChanStereoSnk_48_3_2",
"DualDev_OneChanStereoSnk_48_1_High_Reliability",
"DualDev_OneChanStereoSnk_48_1_2",
"DualDev_OneChanStereoSnk_24_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_24_2_2",
"DualDev_OneChanStereoSnk_16_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_16_2_2",
"DualDev_OneChanStereoSnk_16_1_Balanced_Reliability",
"DualDev_OneChanStereoSnk_16_1_2",
"SingleDev_OneChanStereoSnk_48_4_High_Reliability",
"SingleDev_OneChanStereoSnk_48_4_2",
"SingleDev_OneChanStereoSnk_48_2_High_Reliability",
"SingleDev_OneChanStereoSnk_48_2_2",
"SingleDev_OneChanStereoSnk_48_3_High_Reliability",
"SingleDev_OneChanStereoSnk_48_3_2",
"SingleDev_OneChanStereoSnk_48_1_High_Reliability",
"SingleDev_OneChanStereoSnk_48_1_2",
"SingleDev_OneChanStereoSnk_24_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_24_2_2",
"SingleDev_OneChanStereoSnk_16_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_16_2_2",
"SingleDev_OneChanStereoSnk_16_1_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_16_1_2",
"SingleDev_TwoChanStereoSnk_48_4_High_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_2",
"SingleDev_TwoChanStereoSnk_48_4_High_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_2",
"SingleDev_TwoChanStereoSnk_48_2_High_Reliability",
"SingleDev_TwoChanStereoSnk_48_2_2",
"SingleDev_TwoChanStereoSnk_48_3_High_Reliability",
"SingleDev_TwoChanStereoSnk_48_3_2",
"SingleDev_TwoChanStereoSnk_48_1_High_Reliability",
"SingleDev_TwoChanStereoSnk_48_1_2",
"SingleDev_TwoChanStereoSnk_24_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_24_2_2",
"SingleDev_TwoChanStereoSnk_16_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_16_2_2",
"SingleDev_TwoChanStereoSnk_16_1_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_16_1_2",
"SingleDev_OneChanMonoSnk_48_4_High_Reliability",
"SingleDev_OneChanMonoSnk_48_4_2",
"SingleDev_OneChanMonoSnk_48_2_High_Reliability",
"SingleDev_OneChanMonoSnk_48_2_2",
"SingleDev_OneChanMonoSnk_48_3_High_Reliability",
"SingleDev_OneChanMonoSnk_48_3_2",
"SingleDev_OneChanMonoSnk_48_1_High_Reliability",
"SingleDev_OneChanMonoSnk_48_1_2",
"SingleDev_OneChanMonoSnk_32_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_32_2_2",
"SingleDev_OneChanMonoSnk_32_1_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_32_1_2",
"SingleDev_OneChanMonoSnk_24_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_24_2_2",
"SingleDev_OneChanMonoSnk_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_16_2_2",
"SingleDev_OneChanMonoSnk_16_1_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_16_1_2",
"VND_DualDev_OneChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_DualDev_OneChanStereoSnk_48khz_100octs_R15_L70_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_100octs_R15_L70_1",
"VND_SingleDev_OneChanStereoSnk_48khz_100octs_High_Reliability_1",
"VND_SingleDev_OneChanStereoSnk_48khz_100octs_R15_L70_1",
"DualDev_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanStereoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability"
]
},
{
"name": "Game",
"configurations": [
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_TwoChanStereoSrc_16khz_30octs_Balanced_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_R5_L12_TwoChanStereoSrc_16khz_30octs_R3_L12_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_High_Reliability_1",
"VND_SingleDev_TwoChanStereoSnk_48khz_75octs_R5_L12_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_48_2_Low_Latency",
"DualDev_OneChanStereoSnk_48_3_Low_Latency",
"DualDev_OneChanStereoSnk_48_1_Low_Latency",
"DualDev_OneChanStereoSnk_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_32_1_Low_Latency",
"DualDev_OneChanStereoSnk_24_2_Low_Latency",
"DualDev_OneChanStereoSnk_24_1_Low_Latency",
"DualDev_OneChanStereoSnk_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_48_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_48_3_Low_Latency",
"SingleDev_TwoChanStereoSnk_48_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_32_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_24_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_24_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_16_1_Low_Latency",
"SingleDev_OneChanStereoSnk_48_2_Low_Latency",
"SingleDev_OneChanStereoSnk_48_3_Low_Latency",
"SingleDev_OneChanStereoSnk_48_1_Low_Latency",
"SingleDev_OneChanStereoSnk_32_2_Low_Latency",
"SingleDev_OneChanStereoSnk_32_1_Low_Latency",
"SingleDev_OneChanStereoSnk_24_2_Low_Latency",
"SingleDev_OneChanStereoSnk_24_1_Low_Latency",
"SingleDev_OneChanStereoSnk_16_2_Low_Latency",
"SingleDev_OneChanStereoSnk_16_1_Low_Latency"
]
},
{
"name": "VoiceAssistants",
"configurations": [
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
"DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_16_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_24_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_48_4_OneChanStereoSrc_32_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
"DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
"DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
"DualDev_OneChanDoubleStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_16_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_24_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_TwoChanStereoSrc_32_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
"SingleDev_OneChanStereoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_24_2_Balanced_Reliability",
"SingleDev_OneChanMonoSnk_48_4_OneChanMonoSrc_32_2_Balanced_Reliability"
]
},
{
"name": "Live",
"configurations": [
"VND_SingleDev_TwoChanStereoSrc_48khz_100octs_Balanced_Reliability_1",
"VND_SingleDev_TwoChanStereoSrc_48khz_100octs_R11_L40_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_32_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_2_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_Low_Latency",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_16_1_1",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_2_Balanced_Reliability",
"DualDev_OneChanStereoSnk_OneChanStereoSrc_48_1_Balanced_Reliability",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_TwoChanStereoSrc_16_1_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_32_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Low_Latency",
"SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
"SingleDev_OneChanMonoSrc_48_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_48_1_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_32_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_32_1_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_16_2_Balanced_Reliability",
"SingleDev_OneChanMonoSrc_16_1_Balanced_Reliability"
]
}
]
}