40
40
CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT), \
41
41
(0))
42
42
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 ];
45
48
46
49
static const struct bt_codec_qos_pref qos_pref = BT_CODEC_QOS_PREF (true, BT_GAP_LE_PHY_2M , 0u , 60u ,
47
50
20000u , 40000u , 20000u , 40000u );
@@ -60,6 +63,8 @@ static struct bt_bap_ep *srcs[CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT];
60
63
#if defined(CONFIG_BT_BAP_BROADCAST_SOURCE )
61
64
static struct bt_bap_stream broadcast_source_streams [CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT ];
62
65
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 ;
63
68
#endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */
64
69
#if defined(CONFIG_BT_BAP_BROADCAST_SINK )
65
70
static struct bt_bap_stream broadcast_sink_streams [BROADCAST_SNK_STREAM_CNT ];
@@ -75,7 +80,7 @@ struct named_lc3_preset {
75
80
struct bt_bap_lc3_preset preset ;
76
81
};
77
82
78
- static struct named_lc3_preset lc3_unicast_presets [] = {
83
+ static const struct named_lc3_preset lc3_unicast_presets [] = {
79
84
{"8_1_1" , BT_BAP_LC3_UNICAST_PRESET_8_1_1 (LOCATION , CONTEXT )},
80
85
{"8_2_1" , BT_BAP_LC3_UNICAST_PRESET_8_2_1 (LOCATION , CONTEXT )},
81
86
{"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[] = {
111
116
{"48_6_2" , BT_BAP_LC3_UNICAST_PRESET_48_6_2 (LOCATION , CONTEXT )},
112
117
};
113
118
114
- static struct named_lc3_preset lc3_broadcast_presets [] = {
119
+ static const struct named_lc3_preset lc3_broadcast_presets [] = {
115
120
{"8_1_1" , BT_BAP_LC3_BROADCAST_PRESET_8_1_1 (LOCATION , CONTEXT )},
116
121
{"8_2_1" , BT_BAP_LC3_BROADCAST_PRESET_8_2_1 (LOCATION , CONTEXT )},
117
122
{"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[] = {
148
153
};
149
154
150
155
/* 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 ];
154
159
static bool initialized ;
155
160
156
161
static uint16_t get_next_seq_num (uint32_t interval_us )
@@ -400,13 +405,11 @@ static void print_codec(const struct bt_codec *codec)
400
405
}
401
406
}
402
407
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 )
407
410
{
408
411
static struct named_lc3_preset named_preset ;
409
- struct named_lc3_preset * set_preset = NULL ;
412
+ const struct named_lc3_preset * set_preset = NULL ;
410
413
int err = 0 ;
411
414
412
415
if (is_unicast ) {
@@ -561,7 +564,7 @@ static void set_unicast_stream(struct bt_bap_stream *stream)
561
564
default_stream = stream ;
562
565
563
566
for (size_t i = 0 ; i < ARRAY_SIZE (unicast_streams ); i ++ ) {
564
- if (stream == & unicast_streams [i ]) {
567
+ if (stream == & unicast_streams [i ]. stream ) {
565
568
shell_print (ctx_shell , "Default stream: %zu" , i + 1 );
566
569
}
567
570
}
@@ -594,7 +597,7 @@ static int cmd_select_unicast(const struct shell *sh, size_t argc, char *argv[])
594
597
return - ENOEXEC ;
595
598
}
596
599
597
- stream = & unicast_streams [index ];
600
+ stream = & unicast_streams [index ]. stream ;
598
601
599
602
set_unicast_stream (stream );
600
603
@@ -604,7 +607,7 @@ static int cmd_select_unicast(const struct shell *sh, size_t argc, char *argv[])
604
607
static struct bt_bap_stream * stream_alloc (void )
605
608
{
606
609
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 ;
608
611
609
612
if (!stream -> conn ) {
610
613
return stream ;
@@ -1051,8 +1054,9 @@ static int cmd_discover(const struct shell *sh, size_t argc, char *argv[])
1051
1054
1052
1055
static int cmd_config (const struct shell * sh , size_t argc , char * argv [])
1053
1056
{
1057
+ const struct named_lc3_preset * named_preset ;
1058
+ struct unicast_stream * uni_stream ;
1054
1059
struct bt_bap_ep * ep = NULL ;
1055
- struct named_lc3_preset * named_preset ;
1056
1060
enum bt_audio_dir dir ;
1057
1061
unsigned long index ;
1058
1062
int err = 0 ;
@@ -1062,6 +1066,10 @@ static int cmd_config(const struct shell *sh, size_t argc, char *argv[])
1062
1066
return - ENOEXEC ;
1063
1067
}
1064
1068
1069
+ if (default_stream == NULL ) {
1070
+ default_stream = & unicast_streams [0 ].stream ;
1071
+ }
1072
+
1065
1073
index = shell_strtoul (argv [2 ], 0 , & err );
1066
1074
if (err != 0 ) {
1067
1075
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[])
1111
1119
}
1112
1120
}
1113
1121
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 );
1118
1142
return - ENOEXEC ;
1119
1143
}
1120
1144
} 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
- }
1129
1145
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 );
1132
1147
if (err != 0 ) {
1133
1148
shell_error (sh , "Unable to config stream: %d" , err );
1134
1149
return err ;
1135
1150
}
1136
-
1137
- default_stream = stream ;
1138
1151
}
1139
1152
1140
1153
shell_print (sh , "ASE config: preset %s" , named_preset -> name );
@@ -1157,7 +1170,9 @@ static int create_unicast_group(const struct shell *sh)
1157
1170
memset (& group_param , 0 , sizeof (group_param ));
1158
1171
1159
1172
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 );
1161
1176
1162
1177
if (stream -> ep != NULL ) {
1163
1178
struct bt_bap_unicast_group_stream_param * stream_param ;
@@ -1166,10 +1181,10 @@ static int create_unicast_group(const struct shell *sh)
1166
1181
1167
1182
stream_param -> stream = stream ;
1168
1183
if (stream_dir (stream ) == BT_AUDIO_DIR_SINK ) {
1169
- stream_param -> qos = & default_sink_preset -> preset . qos ;
1184
+ stream_param -> qos = & uni_stream -> qos ;
1170
1185
pair_param [sink_cnt ++ ].tx_param = stream_param ;
1171
1186
} else {
1172
- stream_param -> qos = & default_source_preset -> preset . qos ;
1187
+ stream_param -> qos = & uni_stream -> qos ;
1173
1188
pair_param [source_cnt ++ ].rx_param = stream_param ;
1174
1189
}
1175
1190
@@ -1285,7 +1300,7 @@ static int cmd_stop(const struct shell *sh, size_t argc, char *argv[])
1285
1300
1286
1301
static int cmd_preset (const struct shell * sh , size_t argc , char * argv [])
1287
1302
{
1288
- struct named_lc3_preset * named_preset ;
1303
+ const struct named_lc3_preset * named_preset ;
1289
1304
enum bt_audio_dir dir ;
1290
1305
1291
1306
if (!strcmp (argv [1 ], "sink" )) {
@@ -1398,7 +1413,7 @@ static int cmd_list(const struct shell *sh, size_t argc, char *argv[])
1398
1413
shell_print (sh , "Configured Channels:" );
1399
1414
1400
1415
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 ;
1402
1417
1403
1418
if (stream -> conn ) {
1404
1419
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,
1764
1779
stream_params [ARRAY_SIZE (broadcast_source_streams )];
1765
1780
struct bt_bap_broadcast_source_subgroup_param subgroup_param ;
1766
1781
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 ;
1768
1783
int err ;
1769
1784
1770
1785
if (default_source != NULL ) {
@@ -1823,16 +1838,20 @@ static int cmd_create_broadcast(const struct shell *sh, size_t argc,
1823
1838
}
1824
1839
}
1825
1840
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
+
1826
1845
(void )memset (stream_params , 0 , sizeof (stream_params ));
1827
1846
for (size_t i = 0 ; i < ARRAY_SIZE (stream_params ); i ++ ) {
1828
1847
stream_params [i ].stream = & broadcast_source_streams [i ];
1829
1848
}
1830
1849
subgroup_param .params_count = ARRAY_SIZE (stream_params );
1831
1850
subgroup_param .params = stream_params ;
1832
- subgroup_param .codec = & named_preset -> preset . codec ;
1851
+ subgroup_param .codec = & broadcast_source_codec ;
1833
1852
create_param .params_count = 1U ;
1834
1853
create_param .params = & subgroup_param ;
1835
- create_param .qos = & named_preset -> preset . qos ;
1854
+ create_param .qos = & broadcast_source_qos ;
1836
1855
1837
1856
err = bt_bap_broadcast_source_create (& create_param , & default_source );
1838
1857
if (err != 0 ) {
@@ -2213,7 +2232,7 @@ static int cmd_init(const struct shell *sh, size_t argc, char *argv[])
2213
2232
2214
2233
#if defined(CONFIG_BT_BAP_UNICAST )
2215
2234
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 );
2217
2236
}
2218
2237
#endif /* CONFIG_BT_BAP_UNICAST */
2219
2238
0 commit comments