diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2022-03-27 13:44:52 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2022-03-27 13:44:52 +0000 |
commit | d9bd7a804f345b1913637727923f3567a9d95ca8 (patch) | |
tree | f2d0435731fa7f0f14004f7546a2538cadd3901a | |
parent | f116e783e1cbc3833f178a5cfe09333e64779969 (diff) | |
parent | 1dbeafd8e514d16fb6a06022468e7246706166c2 (diff) |
Merge "leaudio: Apply QoS settings based on use scenarios"
-rw-r--r-- | system/bta/le_audio/audio_set_configurations.fbs | 14 | ||||
-rw-r--r-- | system/bta/le_audio/audio_set_configurations.json | 379 | ||||
-rw-r--r-- | system/bta/le_audio/audio_set_scenarios.json | 102 | ||||
-rw-r--r-- | system/bta/le_audio/devices.cc | 3 | ||||
-rw-r--r-- | system/bta/le_audio/le_audio_set_configuration_provider_json.cc | 75 | ||||
-rw-r--r-- | system/bta/le_audio/le_audio_types.h | 9 | ||||
-rw-r--r-- | system/bta/le_audio/state_machine.cc | 24 |
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; |