Skip to content

Commit 2638a04

Browse files
Thalleycarlescufi
authored andcommitted
Bluetooth: Audio: Shell: Make BAP shell presets constant
Make the BAP shell presets constant. This reflects more what they represent, and make it not only possible, but also easier, to modify the individual streams QoS and Codec configurations, without affecting other streams. Signed-off-by: Emil Gydesen <[email protected]>
1 parent 3588706 commit 2638a04

File tree

1 file changed

+60
-41
lines changed
  • subsys/bluetooth/shell

1 file changed

+60
-41
lines changed

subsys/bluetooth/shell/bap.c

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,11 @@
4040
CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT), \
4141
(0))
4242

43-
static struct bt_bap_stream
44-
unicast_streams[UNICAST_SERVER_STREAM_COUNT + UNICAST_CLIENT_STREAM_COUNT];
43+
static struct unicast_stream {
44+
struct bt_bap_stream stream;
45+
struct bt_codec codec;
46+
struct bt_codec_qos qos;
47+
} unicast_streams[UNICAST_SERVER_STREAM_COUNT + UNICAST_CLIENT_STREAM_COUNT];
4548

4649
static const struct bt_codec_qos_pref qos_pref = BT_CODEC_QOS_PREF(true, BT_GAP_LE_PHY_2M, 0u, 60u,
4750
20000u, 40000u, 20000u, 40000u);
@@ -60,6 +63,8 @@ static struct bt_bap_ep *srcs[CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT];
6063
#if defined(CONFIG_BT_BAP_BROADCAST_SOURCE)
6164
static struct bt_bap_stream broadcast_source_streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT];
6265
static struct bt_bap_broadcast_source *default_source;
66+
static struct bt_codec broadcast_source_codec;
67+
static struct bt_codec_qos broadcast_source_qos;
6368
#endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */
6469
#if defined(CONFIG_BT_BAP_BROADCAST_SINK)
6570
static struct bt_bap_stream broadcast_sink_streams[BROADCAST_SNK_STREAM_CNT];
@@ -75,7 +80,7 @@ struct named_lc3_preset {
7580
struct bt_bap_lc3_preset preset;
7681
};
7782

78-
static struct named_lc3_preset lc3_unicast_presets[] = {
83+
static const struct named_lc3_preset lc3_unicast_presets[] = {
7984
{"8_1_1", BT_BAP_LC3_UNICAST_PRESET_8_1_1(LOCATION, CONTEXT)},
8085
{"8_2_1", BT_BAP_LC3_UNICAST_PRESET_8_2_1(LOCATION, CONTEXT)},
8186
{"16_1_1", BT_BAP_LC3_UNICAST_PRESET_16_1_1(LOCATION, CONTEXT)},
@@ -111,7 +116,7 @@ static struct named_lc3_preset lc3_unicast_presets[] = {
111116
{"48_6_2", BT_BAP_LC3_UNICAST_PRESET_48_6_2(LOCATION, CONTEXT)},
112117
};
113118

114-
static struct named_lc3_preset lc3_broadcast_presets[] = {
119+
static const struct named_lc3_preset lc3_broadcast_presets[] = {
115120
{"8_1_1", BT_BAP_LC3_BROADCAST_PRESET_8_1_1(LOCATION, CONTEXT)},
116121
{"8_2_1", BT_BAP_LC3_BROADCAST_PRESET_8_2_1(LOCATION, CONTEXT)},
117122
{"16_1_1", BT_BAP_LC3_BROADCAST_PRESET_16_1_1(LOCATION, CONTEXT)},
@@ -148,9 +153,9 @@ static struct named_lc3_preset lc3_broadcast_presets[] = {
148153
};
149154

150155
/* Default to 16_2_1 */
151-
static struct named_lc3_preset *default_sink_preset = &lc3_unicast_presets[3];
152-
static struct named_lc3_preset *default_source_preset = &lc3_unicast_presets[3];
153-
static struct named_lc3_preset *default_broadcast_source_preset = &lc3_broadcast_presets[3];
156+
static const struct named_lc3_preset *default_sink_preset = &lc3_unicast_presets[3];
157+
static const struct named_lc3_preset *default_source_preset = &lc3_unicast_presets[3];
158+
static const struct named_lc3_preset *default_broadcast_source_preset = &lc3_broadcast_presets[3];
154159
static bool initialized;
155160

156161
static uint16_t get_next_seq_num(uint32_t interval_us)
@@ -400,13 +405,11 @@ static void print_codec(const struct bt_codec *codec)
400405
}
401406
}
402407

403-
static struct named_lc3_preset *set_preset(enum bt_audio_dir dir,
404-
bool is_unicast,
405-
size_t argc,
406-
char **argv)
408+
static const struct named_lc3_preset *set_preset(enum bt_audio_dir dir, bool is_unicast,
409+
size_t argc, char **argv)
407410
{
408411
static struct named_lc3_preset named_preset;
409-
struct named_lc3_preset *set_preset = NULL;
412+
const struct named_lc3_preset *set_preset = NULL;
410413
int err = 0;
411414

412415
if (is_unicast) {
@@ -561,7 +564,7 @@ static void set_unicast_stream(struct bt_bap_stream *stream)
561564
default_stream = stream;
562565

563566
for (size_t i = 0; i < ARRAY_SIZE(unicast_streams); i++) {
564-
if (stream == &unicast_streams[i]) {
567+
if (stream == &unicast_streams[i].stream) {
565568
shell_print(ctx_shell, "Default stream: %zu", i + 1);
566569
}
567570
}
@@ -594,7 +597,7 @@ static int cmd_select_unicast(const struct shell *sh, size_t argc, char *argv[])
594597
return -ENOEXEC;
595598
}
596599

597-
stream = &unicast_streams[index];
600+
stream = &unicast_streams[index].stream;
598601

599602
set_unicast_stream(stream);
600603

@@ -604,7 +607,7 @@ static int cmd_select_unicast(const struct shell *sh, size_t argc, char *argv[])
604607
static struct bt_bap_stream *stream_alloc(void)
605608
{
606609
for (size_t i = 0; i < ARRAY_SIZE(unicast_streams); i++) {
607-
struct bt_bap_stream *stream = &unicast_streams[i];
610+
struct bt_bap_stream *stream = &unicast_streams[i].stream;
608611

609612
if (!stream->conn) {
610613
return stream;
@@ -1051,8 +1054,9 @@ static int cmd_discover(const struct shell *sh, size_t argc, char *argv[])
10511054

10521055
static int cmd_config(const struct shell *sh, size_t argc, char *argv[])
10531056
{
1057+
const struct named_lc3_preset *named_preset;
1058+
struct unicast_stream *uni_stream;
10541059
struct bt_bap_ep *ep = NULL;
1055-
struct named_lc3_preset *named_preset;
10561060
enum bt_audio_dir dir;
10571061
unsigned long index;
10581062
int err = 0;
@@ -1062,6 +1066,10 @@ static int cmd_config(const struct shell *sh, size_t argc, char *argv[])
10621066
return -ENOEXEC;
10631067
}
10641068

1069+
if (default_stream == NULL) {
1070+
default_stream = &unicast_streams[0].stream;
1071+
}
1072+
10651073
index = shell_strtoul(argv[2], 0, &err);
10661074
if (err != 0) {
10671075
shell_error(sh, "Could not parse index: %d", err);
@@ -1111,30 +1119,35 @@ static int cmd_config(const struct shell *sh, size_t argc, char *argv[])
11111119
}
11121120
}
11131121

1114-
if (default_stream && default_stream->ep == ep) {
1115-
if (bt_bap_stream_reconfig(default_stream,
1116-
&named_preset->preset.codec) < 0) {
1117-
shell_error(sh, "Unable reconfig stream");
1122+
uni_stream = CONTAINER_OF(default_stream, struct unicast_stream, stream);
1123+
memcpy(&uni_stream->qos, &named_preset->preset.qos, sizeof(uni_stream->qos));
1124+
memcpy(&uni_stream->codec, &named_preset->preset.codec, sizeof(uni_stream->codec));
1125+
/* Need to update the `bt_data.data` pointer to the new value after copying the codec */
1126+
for (size_t i = 0U; i < ARRAY_SIZE(uni_stream->codec.data); i++) {
1127+
struct bt_codec_data *data = &uni_stream->codec.data[i];
1128+
1129+
data->data.data = data->value;
1130+
}
1131+
1132+
for (size_t i = 0U; i < ARRAY_SIZE(uni_stream->codec.meta); i++) {
1133+
struct bt_codec_data *data = &uni_stream->codec.meta[i];
1134+
1135+
data->data.data = data->value;
1136+
}
1137+
1138+
if (default_stream->ep == ep) {
1139+
err = bt_bap_stream_reconfig(default_stream, &uni_stream->codec);
1140+
if (err != 0) {
1141+
shell_error(sh, "Unable reconfig stream: %d", err);
11181142
return -ENOEXEC;
11191143
}
11201144
} else {
1121-
struct bt_bap_stream *stream;
1122-
int err;
1123-
1124-
if (default_stream == NULL) {
1125-
stream = &unicast_streams[0];
1126-
} else {
1127-
stream = default_stream;
1128-
}
11291145

1130-
err = bt_bap_stream_config(default_conn, stream, ep,
1131-
&named_preset->preset.codec);
1146+
err = bt_bap_stream_config(default_conn, default_stream, ep, &uni_stream->codec);
11321147
if (err != 0) {
11331148
shell_error(sh, "Unable to config stream: %d", err);
11341149
return err;
11351150
}
1136-
1137-
default_stream = stream;
11381151
}
11391152

11401153
shell_print(sh, "ASE config: preset %s", named_preset->name);
@@ -1157,7 +1170,9 @@ static int create_unicast_group(const struct shell *sh)
11571170
memset(&group_param, 0, sizeof(group_param));
11581171

11591172
for (size_t i = 0U; i < ARRAY_SIZE(unicast_streams); i++) {
1160-
struct bt_bap_stream *stream = &unicast_streams[i];
1173+
struct bt_bap_stream *stream = &unicast_streams[i].stream;
1174+
struct unicast_stream *uni_stream =
1175+
CONTAINER_OF(stream, struct unicast_stream, stream);
11611176

11621177
if (stream->ep != NULL) {
11631178
struct bt_bap_unicast_group_stream_param *stream_param;
@@ -1166,10 +1181,10 @@ static int create_unicast_group(const struct shell *sh)
11661181

11671182
stream_param->stream = stream;
11681183
if (stream_dir(stream) == BT_AUDIO_DIR_SINK) {
1169-
stream_param->qos = &default_sink_preset->preset.qos;
1184+
stream_param->qos = &uni_stream->qos;
11701185
pair_param[sink_cnt++].tx_param = stream_param;
11711186
} else {
1172-
stream_param->qos = &default_source_preset->preset.qos;
1187+
stream_param->qos = &uni_stream->qos;
11731188
pair_param[source_cnt++].rx_param = stream_param;
11741189
}
11751190

@@ -1285,7 +1300,7 @@ static int cmd_stop(const struct shell *sh, size_t argc, char *argv[])
12851300

12861301
static int cmd_preset(const struct shell *sh, size_t argc, char *argv[])
12871302
{
1288-
struct named_lc3_preset *named_preset;
1303+
const struct named_lc3_preset *named_preset;
12891304
enum bt_audio_dir dir;
12901305

12911306
if (!strcmp(argv[1], "sink")) {
@@ -1398,7 +1413,7 @@ static int cmd_list(const struct shell *sh, size_t argc, char *argv[])
13981413
shell_print(sh, "Configured Channels:");
13991414

14001415
for (i = 0; i < ARRAY_SIZE(unicast_streams); i++) {
1401-
struct bt_bap_stream *stream = &unicast_streams[i];
1416+
struct bt_bap_stream *stream = &unicast_streams[i].stream;
14021417

14031418
if (stream->conn) {
14041419
shell_print(sh, " %s#%u: stream %p ep %p group %p",
@@ -1764,7 +1779,7 @@ static int cmd_create_broadcast(const struct shell *sh, size_t argc,
17641779
stream_params[ARRAY_SIZE(broadcast_source_streams)];
17651780
struct bt_bap_broadcast_source_subgroup_param subgroup_param;
17661781
struct bt_bap_broadcast_source_create_param create_param = {0};
1767-
struct named_lc3_preset *named_preset;
1782+
const struct named_lc3_preset *named_preset;
17681783
int err;
17691784

17701785
if (default_source != NULL) {
@@ -1823,16 +1838,20 @@ static int cmd_create_broadcast(const struct shell *sh, size_t argc,
18231838
}
18241839
}
18251840

1841+
memcpy(&broadcast_source_codec, &named_preset->preset.codec,
1842+
sizeof(broadcast_source_codec));
1843+
memcpy(&broadcast_source_qos, &named_preset->preset.qos, sizeof(broadcast_source_qos));
1844+
18261845
(void)memset(stream_params, 0, sizeof(stream_params));
18271846
for (size_t i = 0; i < ARRAY_SIZE(stream_params); i++) {
18281847
stream_params[i].stream = &broadcast_source_streams[i];
18291848
}
18301849
subgroup_param.params_count = ARRAY_SIZE(stream_params);
18311850
subgroup_param.params = stream_params;
1832-
subgroup_param.codec = &named_preset->preset.codec;
1851+
subgroup_param.codec = &broadcast_source_codec;
18331852
create_param.params_count = 1U;
18341853
create_param.params = &subgroup_param;
1835-
create_param.qos = &named_preset->preset.qos;
1854+
create_param.qos = &broadcast_source_qos;
18361855

18371856
err = bt_bap_broadcast_source_create(&create_param, &default_source);
18381857
if (err != 0) {
@@ -2213,7 +2232,7 @@ static int cmd_init(const struct shell *sh, size_t argc, char *argv[])
22132232

22142233
#if defined(CONFIG_BT_BAP_UNICAST)
22152234
for (i = 0; i < ARRAY_SIZE(unicast_streams); i++) {
2216-
bt_bap_stream_cb_register(&unicast_streams[i], &stream_ops);
2235+
bt_bap_stream_cb_register(&unicast_streams[i].stream, &stream_ops);
22172236
}
22182237
#endif /* CONFIG_BT_BAP_UNICAST */
22192238

0 commit comments

Comments
 (0)