client/player: Use QOS macros from lc3.h to define presets

This makes use of QOS macros for for lc3.h to define preset
configuration and remove existing macros since they were just
duplicates.
This commit is contained in:
Luiz Augusto von Dentz 2024-03-13 11:04:10 -04:00
parent 47df60e8b2
commit 25f42cfc46

View File

@ -1232,20 +1232,10 @@ static const struct capabilities {
UTIL_IOV_INIT()),
};
struct codec_qos {
uint32_t interval;
uint8_t framing;
uint8_t phy;
uint16_t sdu;
uint8_t rtn;
uint16_t latency;
uint32_t delay;
};
struct codec_preset {
char *name;
const struct iovec data;
const struct codec_qos qos;
struct bt_bap_qos qos;
uint8_t target_latency;
};
@ -1296,47 +1286,6 @@ static struct codec_preset sbc_presets[] = {
SBC_PRESET("UQ_STEREO_48", UTIL_IOV_INIT(0x11, 0x15, 2, 58)),
};
#define QOS_CONFIG(_interval, _framing, _phy, _sdu, _rtn, _latency, _delay) \
{ \
.interval = _interval, \
.framing = _framing, \
.phy = _phy, \
.sdu = _sdu, \
.rtn = _rtn, \
.latency = _latency, \
.delay = _delay, \
}
#define QOS_UNFRAMED(_interval, _phy, _sdu, _rtn, _latency, _delay) \
QOS_CONFIG(_interval, 0x00, _phy, _sdu, _rtn, _latency, _delay)
#define QOS_FRAMED(_interval, _phy, _sdu, _rtn, _latency, _delay) \
QOS_CONFIG(_interval, 0x01, _phy, _sdu, _rtn, _latency, _delay)
#define QOS_UNFRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \
QOS_UNFRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \
#define QOS_FRAMED_1M(_interval, _sdu, _rtn, _latency, _delay) \
QOS_FRAMED(_interval, 0x01, _sdu, _rtn, _latency, _delay) \
#define QOS_UNFRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \
QOS_UNFRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \
#define QOS_FRAMED_2M(_interval, _sdu, _rtn, _latency, _delay) \
QOS_FRAMED(_interval, 0x02, _sdu, _rtn, _latency, _delay) \
#define LC3_7_5_UNFRAMED(_sdu, _rtn, _latency, _delay) \
QOS_UNFRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay)
#define LC3_7_5_FRAMED(_sdu, _rtn, _latency, _delay) \
QOS_FRAMED(7500u, 0x02, _sdu, _rtn, _latency, _delay)
#define LC3_10_UNFRAMED(_sdu, _rtn, _latency, _delay) \
QOS_UNFRAMED_2M(10000u, _sdu, _rtn, _latency, _delay)
#define LC3_10_FRAMED(_sdu, _rtn, _latency, _delay) \
QOS_FRAMED_2M(10000u, _sdu, _rtn, _latency, _delay)
#define LC3_PRESET_LL(_name, _data, _qos) \
{ \
.name = _name, \
@ -1361,183 +1310,115 @@ static struct codec_preset sbc_presets[] = {
.target_latency = 0x03, \
}
#define LC3_PRESET_B(_name, _data, _qos) \
{ \
.name = _name, \
.data = _data, \
.qos = _qos, \
.target_latency = 0x00, \
}
static struct codec_preset lc3_ucast_presets[] = {
/* Table 4.43: QoS configuration support setting requirements */
LC3_PRESET("8_1_1", LC3_CONFIG_8_1,
LC3_7_5_UNFRAMED(26u, 2u, 8u, 40000u)),
LC3_PRESET("8_2_1", LC3_CONFIG_8_2,
LC3_10_UNFRAMED(30u, 2u, 10u, 40000u)),
LC3_PRESET("16_1_1", LC3_CONFIG_16_1,
LC3_7_5_UNFRAMED(30u, 2u, 8u, 40000u)),
LC3_PRESET("16_2_1", LC3_CONFIG_16_2,
LC3_10_UNFRAMED(40u, 2u, 10u, 40000u)),
LC3_PRESET("24_1_1", LC3_CONFIG_24_1,
LC3_7_5_UNFRAMED(45u, 2u, 8u, 40000u)),
LC3_PRESET("24_2_1", LC3_CONFIG_24_2,
LC3_10_UNFRAMED(60u, 2u, 10u, 40000u)),
LC3_PRESET("32_1_1", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 2u, 8u, 40000u)),
LC3_PRESET("32_2_1", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 2u, 10u, 40000u)),
LC3_PRESET("44_1_1", LC3_CONFIG_44_1,
QOS_FRAMED_2M(8163u, 98u, 5u, 24u, 40000u)),
LC3_PRESET("44_2_1", LC3_CONFIG_44_2,
QOS_FRAMED_2M(10884u, 130u, 5u, 31u, 40000u)),
LC3_PRESET("48_1_1", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 5u, 15u, 40000u)),
LC3_PRESET("48_2_1", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 5u, 20u, 40000u)),
LC3_PRESET("48_3_1", LC3_CONFIG_48_3,
LC3_7_5_UNFRAMED(90u, 5u, 15u, 40000u)),
LC3_PRESET("48_4_1", LC3_CONFIG_48_4,
LC3_10_UNFRAMED(120u, 5u, 20u, 40000u)),
LC3_PRESET("48_5_1", LC3_CONFIG_48_5,
LC3_7_5_UNFRAMED(117u, 5u, 15u, 40000u)),
LC3_PRESET("48_6_1", LC3_CONFIG_48_6,
LC3_10_UNFRAMED(155u, 5u, 20u, 40000u)),
LC3_PRESET("8_1_1", LC3_CONFIG_8_1, LC3_QOS_8_1_1),
LC3_PRESET("8_2_1", LC3_CONFIG_8_2, LC3_QOS_8_2_1),
LC3_PRESET("16_1_1", LC3_CONFIG_16_1, LC3_QOS_16_1_1),
LC3_PRESET("16_2_1", LC3_CONFIG_16_2, LC3_QOS_16_2_1),
LC3_PRESET("24_1_1", LC3_CONFIG_24_1, LC3_QOS_24_1_1),
LC3_PRESET("24_2_1", LC3_CONFIG_24_2, LC3_QOS_24_2_1),
LC3_PRESET("32_1_1", LC3_CONFIG_32_1, LC3_QOS_32_1_1),
LC3_PRESET("32_2_1", LC3_CONFIG_32_2, LC3_QOS_32_1_1),
LC3_PRESET("44_1_1", LC3_CONFIG_44_1, LC3_QOS_44_1_1),
LC3_PRESET("44_2_1", LC3_CONFIG_44_2, LC3_QOS_44_2_1),
LC3_PRESET("48_1_1", LC3_CONFIG_48_1, LC3_QOS_48_1_1),
LC3_PRESET("48_2_1", LC3_CONFIG_48_2, LC3_QOS_48_2_1),
LC3_PRESET("48_3_1", LC3_CONFIG_48_3, LC3_QOS_48_3_1),
LC3_PRESET("48_4_1", LC3_CONFIG_48_4, LC3_QOS_48_4_1),
LC3_PRESET("48_5_1", LC3_CONFIG_48_5, LC3_QOS_48_5_1),
LC3_PRESET("48_6_1", LC3_CONFIG_48_6, LC3_QOS_48_6_1),
/* QoS Configuration settings for high reliability audio data */
LC3_PRESET_HR("8_1_2", LC3_CONFIG_8_1,
LC3_7_5_UNFRAMED(26u, 13u, 75u, 40000u)),
LC3_PRESET_HR("8_2_2", LC3_CONFIG_8_2,
LC3_10_UNFRAMED(30u, 13u, 95u, 40000u)),
LC3_PRESET_HR("16_1_2", LC3_CONFIG_16_1,
LC3_7_5_UNFRAMED(30u, 13u, 75u, 40000u)),
LC3_PRESET_HR("16_2_2", LC3_CONFIG_16_2,
LC3_10_UNFRAMED(40u, 13u, 95u, 40000u)),
LC3_PRESET_HR("24_1_2", LC3_CONFIG_24_1,
LC3_7_5_UNFRAMED(45u, 13u, 75u, 40000u)),
LC3_PRESET_HR("24_2_2", LC3_CONFIG_24_2,
LC3_10_UNFRAMED(60u, 13u, 95u, 40000u)),
LC3_PRESET_HR("32_1_2", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 13u, 75u, 40000u)),
LC3_PRESET_HR("32_2_2", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 13u, 95u, 40000u)),
LC3_PRESET_HR("44_1_2", LC3_CONFIG_44_1,
QOS_FRAMED_2M(8163u, 98u, 13u, 80u, 40000u)),
LC3_PRESET_HR("44_2_2", LC3_CONFIG_44_2,
QOS_FRAMED_2M(10884u, 130u, 13u, 85u, 40000u)),
LC3_PRESET_HR("48_1_2", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 13u, 75u, 40000u)),
LC3_PRESET_HR("48_2_2", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 13u, 95u, 40000u)),
LC3_PRESET_HR("48_3_2", LC3_CONFIG_48_3,
LC3_7_5_UNFRAMED(90u, 13u, 75u, 40000u)),
LC3_PRESET_HR("48_4_2", LC3_CONFIG_48_4,
LC3_10_UNFRAMED(120u, 13u, 100u, 40000u)),
LC3_PRESET_HR("48_5_2", LC3_CONFIG_48_5,
LC3_7_5_UNFRAMED(117u, 13u, 75u, 40000u)),
LC3_PRESET_HR("48_6_2", LC3_CONFIG_48_6,
LC3_10_UNFRAMED(155u, 13u, 100u, 40000u)),
LC3_PRESET_HR("8_1_2", LC3_CONFIG_8_1, LC3_QOS_8_1_2),
LC3_PRESET_HR("8_2_2", LC3_CONFIG_8_2, LC3_QOS_8_2_2),
LC3_PRESET_HR("16_1_2", LC3_CONFIG_16_1, LC3_QOS_16_1_2),
LC3_PRESET_HR("16_2_2", LC3_CONFIG_16_2, LC3_QOS_16_2_2),
LC3_PRESET_HR("24_1_2", LC3_CONFIG_24_1, LC3_QOS_24_1_2),
LC3_PRESET_HR("24_2_2", LC3_CONFIG_24_2, LC3_QOS_24_2_2),
LC3_PRESET_HR("32_1_2", LC3_CONFIG_32_1, LC3_QOS_32_1_2),
LC3_PRESET_HR("32_2_2", LC3_CONFIG_32_2, LC3_QOS_32_2_2),
LC3_PRESET_HR("44_1_2", LC3_CONFIG_44_1, LC3_QOS_44_1_2),
LC3_PRESET_HR("44_2_2", LC3_CONFIG_44_2, LC3_QOS_44_2_2),
LC3_PRESET_HR("48_1_2", LC3_CONFIG_48_1, LC3_QOS_48_1_2),
LC3_PRESET_HR("48_2_2", LC3_CONFIG_48_2, LC3_QOS_48_2_2),
LC3_PRESET_HR("48_3_2", LC3_CONFIG_48_3, LC3_QOS_48_3_2),
LC3_PRESET_HR("48_4_2", LC3_CONFIG_48_4, LC3_QOS_48_4_2),
LC3_PRESET_HR("48_5_2", LC3_CONFIG_48_5, LC3_QOS_48_5_2),
LC3_PRESET_HR("48_6_2", LC3_CONFIG_48_6, LC3_QOS_48_6_2),
/* QoS configuration support setting requirements for the UGG and UGT */
LC3_PRESET_LL("16_1_gs", LC3_CONFIG_16_1,
LC3_7_5_UNFRAMED(30u, 1u, 15u, 60000u)),
LC3_PRESET_LL("16_2_gs", LC3_CONFIG_16_2,
LC3_10_UNFRAMED(40u, 1u, 20u, 60000u)),
LC3_PRESET_LL("32_1_gs", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 1u, 15u, 60000u)),
LC3_PRESET_LL("32_2_gs", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 1u, 20u, 60000u)),
LC3_PRESET_LL("48_1_gs", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 1u, 15u, 60000u)),
LC3_PRESET_LL("48_2_gs", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 1u, 20u, 60000u)),
LC3_PRESET_LL("32_1_gr", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 1u, 15u, 10000u)),
LC3_PRESET_LL("32_2_gr", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 1u, 20u, 10000u)),
LC3_PRESET_LL("48_1_gr", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 1u, 15u, 10000u)),
LC3_PRESET_LL("48_2_gr", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 1u, 20u, 10000u)),
LC3_PRESET_LL("48_3_gr", LC3_CONFIG_48_3,
LC3_7_5_UNFRAMED(90u, 1u, 15u, 10000u)),
LC3_PRESET_LL("48_4_gr", LC3_CONFIG_48_4,
LC3_10_UNFRAMED(120u, 1u, 20u, 10000u)),
LC3_PRESET_LL("16_1_gs", LC3_CONFIG_16_1, LC3_QOS_16_1_GS),
LC3_PRESET_LL("16_2_gs", LC3_CONFIG_16_2, LC3_QOS_16_2_GS),
LC3_PRESET_LL("32_1_gs", LC3_CONFIG_32_1, LC3_QOS_32_1_GS),
LC3_PRESET_LL("32_2_gs", LC3_CONFIG_32_2, LC3_QOS_32_2_GS),
LC3_PRESET_LL("48_1_gs", LC3_CONFIG_48_1, LC3_QOS_48_1_GS),
LC3_PRESET_LL("48_2_gs", LC3_CONFIG_48_2, LC3_QOS_48_2_GS),
LC3_PRESET_LL("32_1_gr", LC3_CONFIG_32_1, LC3_QOS_32_1_GR),
LC3_PRESET_LL("32_2_gr", LC3_CONFIG_32_2, LC3_QOS_32_2_GR),
LC3_PRESET_LL("48_1_gr", LC3_CONFIG_48_1, LC3_QOS_48_1_GR),
LC3_PRESET_LL("48_2_gr", LC3_CONFIG_48_2, LC3_QOS_48_2_GR),
LC3_PRESET_LL("48_3_gr", LC3_CONFIG_48_3, LC3_QOS_48_3_GR),
LC3_PRESET_LL("48_4_gr", LC3_CONFIG_48_4, LC3_QOS_48_4_GR),
LC3_PRESET_LL("32_1_gr_l+r", LC3_CONFIG_32_1_AC(2),
LC3_7_5_UNFRAMED(2 * 60u, 1u, 15u, 10000u)),
LC3_QOS_32_1_GR_AC(2)),
LC3_PRESET_LL("32_2_gr_l+r", LC3_CONFIG_32_2_AC(2),
LC3_10_UNFRAMED(2 * 80u, 1u, 20u, 10000u)),
LC3_QOS_32_2_GR_AC(2)),
LC3_PRESET_LL("48_1_gr_l+r", LC3_CONFIG_48_1_AC(2),
LC3_7_5_UNFRAMED(2 * 75u, 1u, 15u, 10000u)),
LC3_QOS_48_1_GR_AC(2)),
LC3_PRESET_LL("48_2_gr_l+r", LC3_CONFIG_48_2_AC(2),
LC3_10_UNFRAMED(2 * 100u, 1u, 20u, 10000u)),
LC3_QOS_48_2_GR_AC(2)),
LC3_PRESET_LL("48_3_gr_l+r", LC3_CONFIG_48_3_AC(2),
LC3_7_5_UNFRAMED(2 * 90u, 1u, 15u, 10000u)),
LC3_QOS_48_3_GR_AC(2)),
LC3_PRESET_LL("48_4_gr_l+r", LC3_CONFIG_48_4_AC(2),
LC3_10_UNFRAMED(2 * 120u, 1u, 20u, 10000u)),
LC3_QOS_48_4_GR_AC(2)),
};
static struct codec_preset lc3_bcast_presets[] = {
/* Table 6.4: Broadcast Audio Stream configuration support requirements
* for the Broadcast Source and Broadcast Sink
*/
LC3_PRESET("8_1_1", LC3_CONFIG_8_1,
LC3_7_5_UNFRAMED(26u, 2u, 8u, 40000u)),
LC3_PRESET("8_2_1", LC3_CONFIG_8_2,
LC3_10_UNFRAMED(30u, 2u, 10u, 40000u)),
LC3_PRESET("16_1_1", LC3_CONFIG_16_1,
LC3_7_5_UNFRAMED(30u, 2u, 8u, 40000u)),
LC3_PRESET("16_2_1", LC3_CONFIG_16_2,
LC3_10_UNFRAMED(40u, 2u, 10u, 40000u)),
LC3_PRESET("24_1_1", LC3_CONFIG_24_1,
LC3_7_5_UNFRAMED(45u, 2u, 8u, 40000u)),
LC3_PRESET("24_2_1", LC3_CONFIG_24_2,
LC3_10_UNFRAMED(60u, 2u, 10u, 40000u)),
LC3_PRESET("32_1_1", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 2u, 8u, 40000u)),
LC3_PRESET("32_2_1", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 2u, 10u, 40000u)),
LC3_PRESET("44_1_1", LC3_CONFIG_44_1,
QOS_FRAMED_2M(8163u, 98u, 4u, 24u, 40000u)),
LC3_PRESET("44_2_1", LC3_CONFIG_44_2,
QOS_FRAMED_2M(10884u, 130u, 4u, 31u, 40000u)),
LC3_PRESET("48_1_1", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 4u, 15u, 40000u)),
LC3_PRESET("48_2_1", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 4u, 20u, 40000u)),
LC3_PRESET("48_3_1", LC3_CONFIG_48_3,
LC3_7_5_UNFRAMED(90u, 4u, 15u, 40000u)),
LC3_PRESET("48_4_1", LC3_CONFIG_48_4,
LC3_10_UNFRAMED(120u, 4u, 20u, 40000u)),
LC3_PRESET("48_5_1", LC3_CONFIG_48_5,
LC3_7_5_UNFRAMED(117u, 4u, 15u, 40000u)),
LC3_PRESET("48_6_1", LC3_CONFIG_48_6,
LC3_10_UNFRAMED(155u, 4u, 20u, 40000u)),
LC3_PRESET_B("8_1_1", LC3_CONFIG_8_1, LC3_QOS_8_1_1_B),
LC3_PRESET_B("8_2_1", LC3_CONFIG_8_2, LC3_QOS_8_2_1_B),
LC3_PRESET_B("16_1_1", LC3_CONFIG_16_1, LC3_QOS_16_1_1_B),
LC3_PRESET_B("16_2_1", LC3_CONFIG_16_2, LC3_QOS_16_2_1_B),
LC3_PRESET_B("24_1_1", LC3_CONFIG_24_1, LC3_QOS_24_1_1_B),
LC3_PRESET_B("24_2_1", LC3_CONFIG_24_2, LC3_QOS_24_2_1_B),
LC3_PRESET_B("32_1_1", LC3_CONFIG_32_1, LC3_QOS_32_1_1_B),
LC3_PRESET_B("32_2_1", LC3_CONFIG_32_2, LC3_QOS_32_2_1_B),
LC3_PRESET_B("44_1_1", LC3_CONFIG_44_1, LC3_QOS_44_1_1_B),
LC3_PRESET_B("44_2_1", LC3_CONFIG_44_2, LC3_QOS_44_2_1_B),
LC3_PRESET_B("48_1_1", LC3_CONFIG_48_1, LC3_QOS_48_1_1_B),
LC3_PRESET_B("48_2_1", LC3_CONFIG_48_2, LC3_QOS_48_2_1_B),
LC3_PRESET_B("48_3_1", LC3_CONFIG_48_3, LC3_QOS_48_3_1_B),
LC3_PRESET_B("48_4_1", LC3_CONFIG_48_4, LC3_QOS_48_4_1_B),
LC3_PRESET_B("48_5_1", LC3_CONFIG_48_5, LC3_QOS_48_5_1_B),
LC3_PRESET_B("48_6_1", LC3_CONFIG_48_6, LC3_QOS_48_6_1_B),
/* Broadcast Audio Stream configuration settings for high-reliability
* audio data.
*/
LC3_PRESET_HR("8_1_2", LC3_CONFIG_8_1,
LC3_7_5_UNFRAMED(26u, 4u, 45u, 40000u)),
LC3_PRESET_HR("8_2_2", LC3_CONFIG_8_2,
LC3_10_UNFRAMED(30u, 4u, 60u, 40000u)),
LC3_PRESET_HR("16_1_2", LC3_CONFIG_16_1,
LC3_7_5_UNFRAMED(30u, 4u, 45u, 40000u)),
LC3_PRESET_HR("16_2_2", LC3_CONFIG_16_2,
LC3_10_UNFRAMED(40u, 4u, 60u, 40000u)),
LC3_PRESET_HR("24_1_2", LC3_CONFIG_24_1,
LC3_7_5_UNFRAMED(45u, 4u, 45u, 40000u)),
LC3_PRESET_HR("24_2_2", LC3_CONFIG_24_2,
LC3_10_UNFRAMED(60u, 4u, 60u, 40000u)),
LC3_PRESET_HR("32_1_2", LC3_CONFIG_32_1,
LC3_7_5_UNFRAMED(60u, 4u, 45u, 40000u)),
LC3_PRESET_HR("32_2_2", LC3_CONFIG_32_2,
LC3_10_UNFRAMED(80u, 4u, 60u, 40000u)),
LC3_PRESET_HR("44_1_2", LC3_CONFIG_44_1,
QOS_FRAMED_2M(8163u, 4u, 13u, 54u, 40000u)),
LC3_PRESET_HR("44_2_2", LC3_CONFIG_44_2,
QOS_FRAMED_2M(10884u, 130u, 4u, 60u, 40000u)),
LC3_PRESET_HR("48_1_2", LC3_CONFIG_48_1,
LC3_7_5_UNFRAMED(75u, 4u, 50u, 40000u)),
LC3_PRESET_HR("48_2_2", LC3_CONFIG_48_2,
LC3_10_UNFRAMED(100u, 4u, 65u, 40000u)),
LC3_PRESET_HR("48_3_2", LC3_CONFIG_48_3,
LC3_7_5_UNFRAMED(90u, 4u, 50u, 40000u)),
LC3_PRESET_HR("48_4_2", LC3_CONFIG_48_4,
LC3_10_UNFRAMED(120u, 4u, 65u, 40000u)),
LC3_PRESET_HR("48_5_2", LC3_CONFIG_48_5,
LC3_7_5_UNFRAMED(117u, 4u, 50u, 40000u)),
LC3_PRESET_HR("48_6_2", LC3_CONFIG_48_6,
LC3_10_UNFRAMED(155u, 4u, 65u, 40000u)),
LC3_PRESET_B("8_1_2", LC3_CONFIG_8_1, LC3_QOS_8_1_1_B),
LC3_PRESET_B("8_2_2", LC3_CONFIG_8_2, LC3_QOS_8_2_2_B),
LC3_PRESET_B("16_1_2", LC3_CONFIG_16_1, LC3_QOS_16_1_2_B),
LC3_PRESET_B("16_2_2", LC3_CONFIG_16_2, LC3_QOS_16_2_2_B),
LC3_PRESET_B("24_1_2", LC3_CONFIG_24_1, LC3_QOS_24_1_2_B),
LC3_PRESET_B("24_2_2", LC3_CONFIG_24_2, LC3_QOS_24_2_2_B),
LC3_PRESET_B("32_1_2", LC3_CONFIG_32_1, LC3_QOS_32_1_2_B),
LC3_PRESET_B("32_2_2", LC3_CONFIG_32_2, LC3_QOS_32_2_2_B),
LC3_PRESET_B("44_1_2", LC3_CONFIG_44_1, LC3_QOS_44_1_2_B),
LC3_PRESET_B("44_2_2", LC3_CONFIG_44_2, LC3_QOS_44_2_2_B),
LC3_PRESET_B("48_1_2", LC3_CONFIG_48_1, LC3_QOS_48_1_2_B),
LC3_PRESET_B("48_2_2", LC3_CONFIG_48_2, LC3_QOS_48_2_2_B),
LC3_PRESET_B("48_3_2", LC3_CONFIG_48_3, LC3_QOS_48_3_2_B),
LC3_PRESET_B("48_4_2", LC3_CONFIG_48_4, LC3_QOS_48_4_2_B),
LC3_PRESET_B("48_5_2", LC3_CONFIG_48_5, LC3_QOS_48_5_2_B),
LC3_PRESET_B("48_6_2", LC3_CONFIG_48_6, LC3_QOS_48_6_2_B),
};
static void print_ltv(const char *str, void *user_data)
@ -1863,7 +1744,7 @@ struct endpoint_config {
struct iovec *caps; /* Codec Specific Configuration LTVs */
struct iovec *meta; /* Metadata LTVs*/
uint8_t target_latency;
struct codec_qos qos; /* BAP QOS configuration parameters */
struct bt_bap_qos qos; /* BAP QOS configuration parameters */
uint8_t sync_factor; /* PA parameter */
uint8_t options; /* PA create sync parameter */
uint16_t skip; /* PA create sync parameter */
@ -1873,20 +1754,8 @@ struct endpoint_config {
uint16_t timeout; /* BIG create sync parameter */
};
static void append_io_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
static void append_io_qos(DBusMessageIter *iter, struct bt_bap_io_qos *qos)
{
struct codec_qos *qos = &cfg->qos;
bt_shell_printf("Framing 0x%02x\n", qos->framing);
g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
&qos->framing);
bt_shell_printf("PresentationDelay %u\n", qos->delay);
g_dbus_dict_append_entry(iter, "PresentationDelay",
DBUS_TYPE_UINT32, &qos->delay);
bt_shell_printf("Interval %u\n", qos->interval);
g_dbus_dict_append_entry(iter, "Interval", DBUS_TYPE_UINT32,
@ -1902,18 +1771,18 @@ static void append_io_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
bt_shell_printf("Retransmissions %u\n", qos->rtn);
g_dbus_dict_append_entry(iter, "Retransmissions",
DBUS_TYPE_BYTE, &qos->rtn);
g_dbus_dict_append_entry(iter, "Retransmissions", DBUS_TYPE_BYTE,
&qos->rtn);
bt_shell_printf("Latency %u\n", qos->latency);
g_dbus_dict_append_entry(iter, "Latency",
DBUS_TYPE_UINT16, &qos->latency);
g_dbus_dict_append_entry(iter, "Latency", DBUS_TYPE_UINT16,
&qos->latency);
}
static void append_ucast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
{
struct codec_qos *qos = &cfg->qos;
struct bt_bap_ucast_qos *qos = &cfg->qos.ucast;
if (cfg->ep->iso_group != BT_ISO_QOS_GROUP_UNSET) {
bt_shell_printf("CIG 0x%2.2x\n", cfg->ep->iso_group);
@ -1930,7 +1799,7 @@ static void append_ucast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
bt_shell_printf("Framing 0x%02x\n", qos->framing);
g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
&qos->framing);
&qos->framing);
bt_shell_printf("PresentationDelay %u\n", qos->delay);
@ -1938,16 +1807,18 @@ static void append_ucast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
DBUS_TYPE_UINT32, &qos->delay);
if (cfg->target_latency) {
bt_shell_printf("TargetLatency 0x%02x\n", cfg->target_latency);
g_dbus_dict_append_entry(iter, "TargetLatency",
DBUS_TYPE_BYTE, &cfg->target_latency);
bt_shell_printf("TargetLatency 0x%02x\n", qos->target_latency);
g_dbus_dict_append_entry(iter, "TargetLatency", DBUS_TYPE_BYTE,
&qos->target_latency);
}
append_io_qos(iter, cfg);
append_io_qos(iter, &qos->io_qos);
}
static void append_bcast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
{
struct bt_bap_bcast_qos *qos = &cfg->qos.bcast;
if (cfg->ep->iso_group != BT_ISO_QOS_BIG_UNSET) {
bt_shell_printf("BIG 0x%2.2x\n", cfg->ep->iso_group);
g_dbus_dict_append_entry(iter, "BIG", DBUS_TYPE_BYTE,
@ -2008,19 +1879,25 @@ static void append_bcast_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
cfg->ep->bcode->iov_len);
}
bt_shell_printf("Framing 0x%02x\n", qos->framing);
g_dbus_dict_append_entry(iter, "Framing", DBUS_TYPE_BYTE,
&qos->framing);
bt_shell_printf("PresentationDelay %u\n", qos->delay);
g_dbus_dict_append_entry(iter, "PresentationDelay",
DBUS_TYPE_UINT32, &qos->delay);
/* Add BAP codec QOS configuration */
append_io_qos(iter, cfg);
append_io_qos(iter, &qos->io_qos);
}
static void append_qos(DBusMessageIter *iter, struct endpoint_config *cfg)
{
DBusMessageIter entry, var, dict;
struct codec_qos *qos = &cfg->qos;
const char *key = "QoS";
if (!qos)
return;
dbus_message_iter_open_container(iter, DBUS_TYPE_DICT_ENTRY,
NULL, &entry);
@ -2137,6 +2014,7 @@ static DBusMessage *endpoint_select_properties_reply(struct endpoint *ep,
DBusMessage *reply;
DBusMessageIter iter, props;
struct endpoint_config *cfg;
struct bt_bap_io_qos *qos;
uint32_t location = 0;
uint8_t channels = 1;
@ -2169,14 +2047,19 @@ static DBusMessage *endpoint_select_properties_reply(struct endpoint *ep,
/* Copy metadata */
cfg->meta = util_iov_dup(ep->meta, 1);
if (preset->qos.phy) {
if (ep->broadcast)
qos = &preset->qos.bcast.io_qos;
else
qos = &preset->qos.ucast.io_qos;
if (qos->phy) {
/* Set QoS parameters */
cfg->qos = preset->qos;
/* Adjust the SDU size based on the number of
* locations/channels that is being requested.
*/
if (channels > 1)
cfg->qos.sdu *= channels;
qos->sdu *= channels;
}
dbus_message_iter_init_append(reply, &iter);
@ -3871,10 +3754,14 @@ fail:
static void custom_delay(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
struct bt_bap_qos *qos = (void *)&p->qos;
char *endptr = NULL;
qos->delay = strtol(input, &endptr, 0);
if (!p->target_latency)
qos->bcast.delay = strtol(input, &endptr, 0);
else
qos->ucast.delay = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {
bt_shell_printf("Invalid argument: %s\n", input);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@ -3886,10 +3773,14 @@ static void custom_delay(const char *input, void *user_data)
static void custom_latency(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
struct bt_bap_qos *qos = (void *)&p->qos;
char *endptr = NULL;
qos->latency = strtol(input, &endptr, 0);
if (!p->target_latency)
qos->bcast.io_qos.latency = strtol(input, &endptr, 0);
else
qos->ucast.io_qos.latency = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {
bt_shell_printf("Invalid argument: %s\n", input);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@ -3902,10 +3793,14 @@ static void custom_latency(const char *input, void *user_data)
static void custom_rtn(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
struct bt_bap_qos *qos = (void *)&p->qos;
char *endptr = NULL;
qos->rtn = strtol(input, &endptr, 0);
if (!p->target_latency)
qos->bcast.io_qos.rtn = strtol(input, &endptr, 0);
else
qos->ucast.io_qos.rtn = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {
bt_shell_printf("Invalid argument: %s\n", input);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@ -3918,10 +3813,14 @@ static void custom_rtn(const char *input, void *user_data)
static void custom_sdu(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
struct bt_bap_qos *qos = (void *)&p->qos;
char *endptr = NULL;
qos->sdu = strtol(input, &endptr, 0);
if (!p->target_latency)
qos->bcast.io_qos.sdu = strtol(input, &endptr, 0);
else
qos->ucast.io_qos.sdu = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {
bt_shell_printf("Invalid argument: %s\n", input);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@ -3933,7 +3832,12 @@ static void custom_sdu(const char *input, void *user_data)
static void custom_phy(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
struct bt_bap_io_qos *qos;
if (!p->target_latency)
qos = &p->qos.bcast.io_qos;
else
qos = &p->qos.ucast.io_qos;
if (!strcmp(input, "1M"))
qos->phy = 0x01;
@ -3965,16 +3869,21 @@ static void custom_phy(const char *input, void *user_data)
static void custom_framing(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
uint8_t *framing;
if (!p->target_latency)
framing = &p->qos.bcast.framing;
else
framing = &p->qos.ucast.framing;
if (!strcasecmp(input, "Unframed"))
qos->framing = 0x00;
*framing = 0x00;
else if (!strcasecmp(input, "Framed"))
qos->framing = 0x01;
*framing = 0x01;
else {
char *endptr = NULL;
qos->framing = strtol(input, &endptr, 0);
*framing = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {
bt_shell_printf("Invalid argument: %s\n", input);
return bt_shell_noninteractive_quit(EXIT_FAILURE);
@ -3988,8 +3897,13 @@ static void custom_framing(const char *input, void *user_data)
static void custom_interval(const char *input, void *user_data)
{
struct codec_preset *p = user_data;
struct codec_qos *qos = (void *)&p->qos;
char *endptr = NULL;
struct bt_bap_io_qos *qos;
if (!p->target_latency)
qos = &p->qos.bcast.io_qos;
else
qos = &p->qos.ucast.io_qos;
qos->interval = strtol(input, &endptr, 0);
if (!endptr || *endptr != '\0') {