summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreehugger Robot <treehugger-gerrit@google.com>2022-03-27 13:44:52 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2022-03-27 13:44:52 +0000
commitd9bd7a804f345b1913637727923f3567a9d95ca8 (patch)
treef2d0435731fa7f0f14004f7546a2538cadd3901a
parentf116e783e1cbc3833f178a5cfe09333e64779969 (diff)
parent1dbeafd8e514d16fb6a06022468e7246706166c2 (diff)
Merge "leaudio: Apply QoS settings based on use scenarios"
-rw-r--r--system/bta/le_audio/audio_set_configurations.fbs14
-rw-r--r--system/bta/le_audio/audio_set_configurations.json379
-rw-r--r--system/bta/le_audio/audio_set_scenarios.json102
-rw-r--r--system/bta/le_audio/devices.cc3
-rw-r--r--system/bta/le_audio/le_audio_set_configuration_provider_json.cc75
-rw-r--r--system/bta/le_audio/le_audio_types.h9
-rw-r--r--system/bta/le_audio/state_machine.cc24
7 files changed, 556 insertions, 50 deletions
diff --git a/system/bta/le_audio/audio_set_configurations.fbs b/system/bta/le_audio/audio_set_configurations.fbs
index 8afe72ea99..2aa7bab499 100644
--- a/system/bta/le_audio/audio_set_configurations.fbs
+++ b/system/bta/le_audio/audio_set_configurations.fbs
@@ -64,16 +64,28 @@ table AudioSetSubConfiguration {
codec_id : CodecId (required);
codec_configuration: [CodecSpecificConfiguration] (required);
}
+table CodecConfiguration {
+ name: string (key, required);
+ subconfigurations: [AudioSetSubConfiguration] (required);
+}
+table QosConfiguration {
+ name: string (key, required);
+ 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);
- subconfigurations: [AudioSetSubConfiguration] (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;
diff --git a/system/bta/le_audio/audio_set_configurations.json b/system/bta/le_audio/audio_set_configurations.json
index 08453307a1..81fdaf2661 100644
--- a/system/bta/le_audio/audio_set_configurations.json
+++ b/system/bta/le_audio/audio_set_configurations.json
@@ -1,6 +1,14 @@
{
"_comments_": [
" == Audio Set Configurations == ",
+ " Contains: ",
+ " 1. configurations : ",
+ " Maps configuration name with codec and qos config to be used",
+ " 2. codec_configurations : ",
+ " Array of codec specific configurations",
+ " 3. qos_configurations : ",
+ " Array of QoS specific configurations",
+ " QoS configuration values are as per BAP spec 1.0",
" Example values which can be used as 'codec_configuration.type'",
" Codec Configuration parameter types:",
" SUPPORTED_SAMPLING_FREQUENCY = 1",
@@ -35,6 +43,338 @@
],
"configurations": [
{
+ "name": "DualDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_16_1_1",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_16_1_2",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_16_2_1",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_16_2_2",
+ "codec_config_name": "DualDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_1_1",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_1_2",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_2_1",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_16_2_2",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_1_1",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_1_2",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_2_1",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_16_2_2",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_1_1",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_1_2",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_2_1",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_16_2_2",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_2",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_2",
+ "codec_config_name": "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_2",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_2",
+ "codec_config_name": "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_2",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_2",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_2",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_2",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_1"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_2",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1",
+ "qos_config_name": "QoS_Config_16_1_2"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_1"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_2",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
+ "qos_config_name": "QoS_Config_16_2_2"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_48_4_Server_Preferred",
+ "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_48_4_1",
+ "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_1"
+ },
+ {
+ "name": "DualDev_OneChanStereoSnk_48_4_2",
+ "codec_config_name": "DualDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_2"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_48_4_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_48_4_1",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_1"
+ },
+ {
+ "name": "SingleDev_OneChanStereoSnk_48_4_2",
+ "codec_config_name": "SingleDev_OneChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_2"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_48_4_Server_Preferred",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_48_4_1",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_1"
+ },
+ {
+ "name": "SingleDev_TwoChanStereoSnk_48_4_2",
+ "codec_config_name": "SingleDev_TwoChanStereoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_2"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_48_4_Server_Preferred",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "qos_config_name": "QoS_Config_Server_Preferred"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_48_4_1",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_1"
+ },
+ {
+ "name": "SingleDev_OneChanMonoSnk_48_4_2",
+ "codec_config_name": "SingleDev_OneChanMonoSnk_48_4",
+ "qos_config_name": "QoS_Config_48_4_2"
+ }
+ ],
+ "codec_configurations": [
+ {
"name": "DualDev_OneChanStereoSnk_16_2",
"subconfigurations": [
{
@@ -2114,5 +2454,42 @@
}
]
}
+ ],
+ "qos_configurations": [
+ {
+ "name": "QoS_Config_16_1_1",
+ "retransmission_number": 2,
+ "max_transport_latency": 8
+ },
+ {
+ "name": "QoS_Config_16_1_2",
+ "retransmission_number": 13,
+ "max_transport_latency": 75
+ },
+ {
+ "name": "QoS_Config_16_2_1",
+ "retransmission_number": 2,
+ "max_transport_latency": 10
+ },
+ {
+ "name": "QoS_Config_16_2_2",
+ "retransmission_number": 13,
+ "max_transport_latency": 95
+ },
+ {
+ "name": "QoS_Config_48_4_1",
+ "retransmission_number": 5,
+ "max_transport_latency": 20
+ },
+ {
+ "name": "QoS_Config_48_4_2",
+ "retransmission_number": 13,
+ "max_transport_latency": 100
+ },
+ {
+ "name": "QoS_Config_Server_Preferred",
+ "retransmission_number": 0,
+ "max_transport_latency": 0
+ }
]
-} \ No newline at end of file
+}
diff --git a/system/bta/le_audio/audio_set_scenarios.json b/system/bta/le_audio/audio_set_scenarios.json
index d9f7b8fc7a..d1314a4485 100644
--- a/system/bta/le_audio/audio_set_scenarios.json
+++ b/system/bta/le_audio/audio_set_scenarios.json
@@ -8,55 +8,89 @@
{
"name": "Ringtone",
"configurations": [
- "DualDev_OneChanStereoSnk_16_2",
- "DualDev_OneChanStereoSnk_16_1",
- "SingleDev_OneChanStereoSnk_16_2",
- "SingleDev_OneChanStereoSnk_16_1",
- "SingleDev_TwoChanStereoSnk_16_2",
- "SingleDev_TwoChanStereoSnk_16_1",
- "SingleDev_OneChanMonoSnk_16_2",
- "SingleDev_OneChanMonoSnk_16_1"
+ "DualDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "DualDev_OneChanStereoSnk_16_2_1",
+ "DualDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "DualDev_OneChanStereoSnk_16_1_1",
+ "SingleDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_16_2_1",
+ "SingleDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_16_1_1",
+ "SingleDev_TwoChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_16_2_1",
+ "SingleDev_TwoChanStereoSnk_16_1_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_16_1_1",
+ "SingleDev_OneChanMonoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_16_2_1",
+ "SingleDev_OneChanMonoSnk_16_1_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_16_1_1"
]
},
{
"name": "Conversational",
"configurations": [
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
- "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2",
- "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2",
- "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2",
- "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2",
- "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1"
+ "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "DualDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_2_1",
+ "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "DualDev_OneChanDoubleStereoSnk_OneChanMonoSrc_16_1_1",
+ "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_2_1",
+ "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_OneChanMonoSrc_16_1_1",
+ "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_2_1",
+ "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_OneChanMonoSrc_16_1_1"
]
},
{
"name": "Media",
"configurations": [
- "DualDev_OneChanStereoSnk_48_4",
- "DualDev_OneChanStereoSnk_16_2",
- "DualDev_OneChanStereoSnk_16_1",
- "SingleDev_OneChanStereoSnk_48_4",
- "SingleDev_OneChanStereoSnk_16_2",
- "SingleDev_OneChanStereoSnk_16_1",
- "SingleDev_TwoChanStereoSnk_48_4",
- "SingleDev_TwoChanStereoSnk_16_2",
- "SingleDev_TwoChanStereoSnk_16_1",
- "SingleDev_OneChanMonoSnk_48_4",
- "SingleDev_OneChanMonoSnk_16_2",
- "SingleDev_OneChanMonoSnk_16_1"
+ "DualDev_OneChanStereoSnk_48_4_Server_Preferred",
+ "DualDev_OneChanStereoSnk_48_4_2",
+ "DualDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "DualDev_OneChanStereoSnk_16_2_2",
+ "DualDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "DualDev_OneChanStereoSnk_16_1_2",
+ "SingleDev_OneChanStereoSnk_48_4_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_48_4_2",
+ "SingleDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_16_2_2",
+ "SingleDev_OneChanStereoSnk_16_1_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_16_1_2",
+ "SingleDev_TwoChanStereoSnk_48_4_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_48_4_2",
+ "SingleDev_TwoChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_16_2_2",
+ "SingleDev_TwoChanStereoSnk_16_1_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_16_1_2",
+ "SingleDev_OneChanMonoSnk_48_4_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_48_4_2",
+ "SingleDev_OneChanMonoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_16_2_2",
+ "SingleDev_OneChanMonoSnk_16_1_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_16_1_2"
]
},
{
"name": "Default",
"configurations": [
- "DualDev_OneChanStereoSnk_16_2",
- "SingleDev_OneChanStereoSnk_16_2",
- "SingleDev_TwoChanStereoSnk_16_2",
- "SingleDev_OneChanMonoSnk_16_2"
+ "DualDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "DualDev_OneChanStereoSnk_16_2_1",
+ "SingleDev_OneChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanStereoSnk_16_2_1",
+ "SingleDev_TwoChanStereoSnk_16_2_Server_Preferred",
+ "SingleDev_TwoChanStereoSnk_16_2_1",
+ "SingleDev_OneChanMonoSnk_16_2_Server_Preferred",
+ "SingleDev_OneChanMonoSnk_16_2_1"
]
}
]
diff --git a/system/bta/le_audio/devices.cc b/system/bta/le_audio/devices.cc
index a147aea2fd..58ca4c46c4 100644
--- a/system/bta/le_audio/devices.cc
+++ b/system/bta/le_audio/devices.cc
@@ -958,6 +958,9 @@ bool LeAudioDevice::ConfigureAses(
*ase->codec_config.octets_per_codec_frame *
*ase->codec_config.codec_frames_blocks_per_sdu;
+ ase->retrans_nb = ent.qos.retransmission_number;
+ ase->max_transport_latency = ent.qos.max_transport_latency;
+
ase->metadata = GetMetadata(context_type);
DLOG(INFO) << __func__ << " device=" << address_
diff --git a/system/bta/le_audio/le_audio_set_configuration_provider_json.cc b/system/bta/le_audio/le_audio_set_configuration_provider_json.cc
index 354a81b395..b2fa48156f 100644
--- a/system/bta/le_audio/le_audio_set_configuration_provider_json.cc
+++ b/system/bta/le_audio/le_audio_set_configuration_provider_json.cc
@@ -27,6 +27,7 @@ using le_audio::set_configurations::AudioSetConfiguration;
using le_audio::set_configurations::AudioSetConfigurations;
using le_audio::set_configurations::CodecCapabilitySetting;
using le_audio::set_configurations::LeAudioCodecIdLc3;
+using le_audio::set_configurations::QosConfigSetting;
using le_audio::set_configurations::SetConfiguration;
using le_audio::types::LeAudioContextType;
@@ -199,7 +200,8 @@ struct AudioSetConfigurationProviderJson {
}
SetConfiguration SetConfigurationFromFlatSubconfig(
- const bluetooth::le_audio::AudioSetSubConfiguration* flat_subconfig) {
+ const bluetooth::le_audio::AudioSetSubConfiguration* flat_subconfig,
+ QosConfigSetting qos) {
auto strategy_int =
static_cast<int>(flat_subconfig->configuration_strategy());
@@ -228,21 +230,52 @@ struct AudioSetConfigurationProviderJson {
flat_subconfig->ase_cnt(), target_latency,
CodecCapabilitySettingFromFlat(flat_subconfig->codec_id(),
flat_subconfig->codec_configuration()),
- strategy);
+ qos, strategy);
}
AudioSetConfiguration AudioSetConfigurationFromFlat(
- const bluetooth::le_audio::AudioSetConfiguration* flat_cfg) {
+ const bluetooth::le_audio::AudioSetConfiguration* flat_cfg,
+ std::vector<const bluetooth::le_audio::CodecConfiguration*>* codec_cfgs,
+ std::vector<const bluetooth::le_audio::QosConfiguration*>* qos_cfgs) {
std::vector<SetConfiguration> subconfigs;
- if (flat_cfg->subconfigurations()) {
- /* Load subconfigurations */
- for (auto subconfig : *flat_cfg->subconfigurations()) {
- subconfigs.push_back(SetConfigurationFromFlatSubconfig(subconfig));
+ QosConfigSetting qos;
+ const bluetooth::le_audio::CodecConfiguration* codec_cfg = NULL;
+ const bluetooth::le_audio::QosConfiguration* qos_cfg = NULL;
+
+ const char* codec_config_key = flat_cfg->codec_config_name()->c_str();
+ const char* qos_config_key = flat_cfg->qos_config_name()->c_str();
+
+ for (auto i = qos_cfgs->begin(); i != qos_cfgs->end(); ++i) {
+ if (0 == strcmp((*i)->name()->c_str(), qos_config_key)) {
+ qos_cfg = *i;
+ break;
}
+ }
+ if (qos_cfg != NULL) {
+ qos.retransmission_number = qos_cfg->retransmission_number();
+ qos.max_transport_latency = qos_cfg->max_transport_latency();
+ } else {
+ LOG_ERROR("No qos config matching key %s found", qos_config_key);
+ }
+ for (auto i = codec_cfgs->begin(); i != codec_cfgs->end(); ++i) {
+ if (0 == strcmp((*i)->name()->c_str(), codec_config_key)) {
+ codec_cfg = *i;
+ break;
+ }
+ }
+ if (codec_cfg != NULL && codec_cfg->subconfigurations()) {
+ /* Load subconfigurations */
+ for (auto subconfig : *codec_cfg->subconfigurations()) {
+ subconfigs.push_back(SetConfigurationFromFlatSubconfig(subconfig, qos));
+ }
} else {
- LOG_ERROR("Configuration '%s' has no valid subconfigurations.",
- flat_cfg->name()->c_str());
+ if (codec_cfg == NULL) {
+ LOG_ERROR("No codec config matching key %s found", codec_config_key);
+ } else {
+ LOG_ERROR("Configuration '%s' has no valid subconfigurations.",
+ flat_cfg->name()->c_str());
+ }
}
return AudioSetConfiguration({flat_cfg->name()->c_str(), subconfigs});
@@ -277,13 +310,35 @@ struct AudioSetConfigurationProviderJson {
configurations_parser_.builder_.GetBufferPointer());
if (!configurations_root) return false;
+ auto flat_qos_configs = configurations_root->qos_configurations();
+ if ((flat_qos_configs == nullptr) || (flat_qos_configs->size() == 0))
+ return false;
+
+ LOG_DEBUG(": Updating %d qos config entries.", flat_qos_configs->size());
+ std::vector<const bluetooth::le_audio::QosConfiguration*> qos_cfgs;
+ for (auto const& flat_qos_cfg : *flat_qos_configs) {
+ qos_cfgs.push_back(flat_qos_cfg);
+ }
+
+ auto flat_codec_configs = configurations_root->codec_configurations();
+ if ((flat_codec_configs == nullptr) || (flat_codec_configs->size() == 0))
+ return false;
+
+ LOG_DEBUG(": Updating %d codec config entries.",
+ flat_codec_configs->size());
+ std::vector<const bluetooth::le_audio::CodecConfiguration*> codec_cfgs;
+ for (auto const& flat_codec_cfg : *flat_codec_configs) {
+ codec_cfgs.push_back(flat_codec_cfg);
+ }
+
auto flat_configs = configurations_root->configurations();
if ((flat_configs == nullptr) || (flat_configs->size() == 0)) return false;
LOG_DEBUG(": Updating %d config entries.", flat_configs->size());
for (auto const& flat_cfg : *flat_configs) {
configurations_.insert(
- {flat_cfg->name()->str(), AudioSetConfigurationFromFlat(flat_cfg)});
+ {flat_cfg->name()->str(),
+ AudioSetConfigurationFromFlat(flat_cfg, &codec_cfgs, &qos_cfgs)});
}
return true;
diff --git a/system/bta/le_audio/le_audio_types.h b/system/bta/le_audio/le_audio_types.h
index 866dabbc05..ab1410a1bb 100644
--- a/system/bta/le_audio/le_audio_types.h
+++ b/system/bta/le_audio/le_audio_types.h
@@ -595,9 +595,16 @@ struct CodecCapabilitySetting {
uint8_t GetConfigChannelCount() const;
};
+struct QosConfigSetting {
+ uint8_t retransmission_number;
+ uint16_t max_transport_latency;
+};
+
struct SetConfiguration {
SetConfiguration(uint8_t direction, uint8_t device_cnt, uint8_t ase_cnt,
uint8_t target_latency, CodecCapabilitySetting codec,
+ QosConfigSetting qos = {.retransmission_number = 0,
+ .max_transport_latency = 0},
le_audio::types::LeAudioConfigurationStrategy strategy =
le_audio::types::LeAudioConfigurationStrategy::
MONO_ONE_CIS_PER_DEVICE)
@@ -606,6 +613,7 @@ struct SetConfiguration {
ase_cnt(ase_cnt),
target_latency(target_latency),
codec(codec),
+ qos(qos),
strategy(strategy) {}
uint8_t direction; /* Direction of set */
@@ -613,6 +621,7 @@ struct SetConfiguration {
uint8_t ase_cnt; /* How many ASE we need in configuration */
uint8_t target_latency;
CodecCapabilitySetting codec;
+ QosConfigSetting qos;
types::LeAudioConfigurationStrategy strategy;
};
diff --git a/system/bta/le_audio/state_machine.cc b/system/bta/le_audio/state_machine.cc
index 68b7171a99..97d8a47d76 100644
--- a/system/bta/le_audio/state_machine.cc
+++ b/system/bta/le_audio/state_machine.cc
@@ -1154,12 +1154,20 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
}
ase->framing = rsp.framing;
ase->preferred_phy = rsp.preferred_phy;
- ase->max_transport_latency = rsp.max_transport_latency;
+ /* Validate and update QoS settings to be consistent */
+ if ((!ase->max_transport_latency ||
+ ase->max_transport_latency > rsp.max_transport_latency) ||
+ !ase->retrans_nb) {
+ ase->max_transport_latency = rsp.max_transport_latency;
+ ase->retrans_nb = rsp.preferred_retrans_nb;
+ LOG(INFO) << __func__ << " Using server preferred QoS settings."
+ << " Max Transport Latency: " << +ase->max_transport_latency
+ << ", Retransmission Number: " << +ase->retrans_nb;
+ }
ase->pres_delay_min = rsp.pres_delay_min;
ase->pres_delay_max = rsp.pres_delay_max;
ase->preferred_pres_delay_min = rsp.preferred_pres_delay_min;
ase->preferred_pres_delay_max = rsp.preferred_pres_delay_max;
- ase->retrans_nb = rsp.preferred_retrans_nb;
ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED;
@@ -1223,12 +1231,20 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
ase->framing = rsp.framing;
ase->preferred_phy = rsp.preferred_phy;
- ase->max_transport_latency = rsp.max_transport_latency;
+ /* Validate and update QoS settings to be consistent */
+ if ((!ase->max_transport_latency ||
+ ase->max_transport_latency > rsp.max_transport_latency) ||
+ !ase->retrans_nb) {
+ ase->max_transport_latency = rsp.max_transport_latency;
+ ase->retrans_nb = rsp.preferred_retrans_nb;
+ LOG(INFO) << __func__ << " Using server preferred QoS settings."
+ << " Max Transport Latency: " << +ase->max_transport_latency
+ << ", Retransmission Number: " << +ase->retrans_nb;
+ }
ase->pres_delay_min = rsp.pres_delay_min;
ase->pres_delay_max = rsp.pres_delay_max;
ase->preferred_pres_delay_min = rsp.preferred_pres_delay_min;
ase->preferred_pres_delay_max = rsp.preferred_pres_delay_max;
- ase->retrans_nb = rsp.preferred_retrans_nb;
/* This may be a notification from a re-configured ASE */
ase->reconfigure = false;