@@ -293,6 +293,13 @@ enum {
293
293
CAP_UNICAST_PROC_STATE_FLAG_NUM ,
294
294
} cap_unicast_proc_state ;
295
295
296
+ enum cap_unicast_proc_type {
297
+ CAP_UNICAST_PROC_TYPE_NONE ,
298
+ CAP_UNICAST_PROC_TYPE_START ,
299
+ CAP_UNICAST_PROC_TYPE_UPDATE ,
300
+ CAP_UNICAST_PROC_TYPE_STOP ,
301
+ };
302
+
296
303
enum cap_unicast_subproc_type {
297
304
CAP_UNICAST_SUBPROC_TYPE_NONE ,
298
305
CAP_UNICAST_SUBPROC_TYPE_CODEC_CONFIG ,
@@ -311,6 +318,7 @@ struct cap_unicast_proc {
311
318
size_t stream_initiated_cnt ;
312
319
/* Number of streams done with the procedure */
313
320
size_t stream_done_cnt ;
321
+ enum cap_unicast_proc_type proc_type ;
314
322
enum cap_unicast_subproc_type subproc_type ;
315
323
int err ;
316
324
struct bt_conn * failed_conn ;
@@ -809,22 +817,42 @@ static int cap_initiator_unicast_audio_configure(
809
817
return 0 ;
810
818
}
811
819
812
- static void cap_initiator_unicast_audio_start_complete (void )
820
+ static void cap_initiator_unicast_audio_proc_complete (void )
813
821
{
814
822
struct bt_bap_unicast_group * unicast_group ;
823
+ enum cap_unicast_proc_type proc_type ;
815
824
struct bt_conn * failed_conn ;
816
825
int err ;
817
826
818
- /* All streams in the procedure share the same unicast group, so we just
819
- * use the reference from the first stream
820
- */
821
- unicast_group = (struct bt_bap_unicast_group * )active_proc .streams [0 ]-> bap_stream .group ;
827
+ unicast_group = active_proc .unicast_group ;
822
828
failed_conn = active_proc .failed_conn ;
823
829
err = active_proc .err ;
824
-
830
+ proc_type = active_proc . proc_type ;
825
831
(void )memset (& active_proc , 0 , sizeof (active_proc ));
826
- if (cap_cb != NULL && cap_cb -> unicast_start_complete != NULL ) {
827
- cap_cb -> unicast_start_complete (unicast_group , err , failed_conn );
832
+
833
+ if (cap_cb == NULL ) {
834
+ return ;
835
+ }
836
+
837
+ switch (proc_type ) {
838
+ case CAP_UNICAST_PROC_TYPE_START :
839
+ if (cap_cb -> unicast_start_complete != NULL ) {
840
+ cap_cb -> unicast_start_complete (unicast_group , err , failed_conn );
841
+ }
842
+ break ;
843
+ case CAP_UNICAST_PROC_TYPE_UPDATE :
844
+ if (cap_cb -> unicast_update_complete != NULL ) {
845
+ cap_cb -> unicast_update_complete (err , failed_conn );
846
+ }
847
+ break ;
848
+ case CAP_UNICAST_PROC_TYPE_STOP :
849
+ if (cap_cb -> unicast_stop_complete != NULL ) {
850
+ cap_cb -> unicast_stop_complete (unicast_group , err , failed_conn );
851
+ }
852
+ break ;
853
+ case CAP_UNICAST_PROC_TYPE_NONE :
854
+ default :
855
+ __ASSERT (false, "Invalid proc_type: %u" , proc_type );
828
856
}
829
857
}
830
858
@@ -847,6 +875,7 @@ int bt_cap_initiator_unicast_audio_start(const struct bt_cap_unicast_audio_start
847
875
}
848
876
849
877
active_proc .unicast_group = unicast_group ;
878
+ active_proc .proc_type = CAP_UNICAST_PROC_TYPE_START ;
850
879
851
880
return cap_initiator_unicast_audio_configure (param );
852
881
}
@@ -886,7 +915,7 @@ void bt_cap_initiator_codec_configured(struct bt_cap_stream *cap_stream)
886
915
887
916
if (cap_proc_is_aborted ()) {
888
917
if (cap_proc_all_streams_handled ()) {
889
- cap_initiator_unicast_audio_start_complete ();
918
+ cap_initiator_unicast_audio_proc_complete ();
890
919
}
891
920
892
921
return ;
@@ -944,7 +973,7 @@ void bt_cap_initiator_codec_configured(struct bt_cap_stream *cap_stream)
944
973
*/
945
974
cap_abort_proc (conns [i ], err );
946
975
if (i == 0U ) {
947
- cap_initiator_unicast_audio_start_complete ();
976
+ cap_initiator_unicast_audio_proc_complete ();
948
977
}
949
978
950
979
return ;
@@ -979,7 +1008,7 @@ void bt_cap_initiator_qos_configured(struct bt_cap_stream *cap_stream)
979
1008
980
1009
if (cap_proc_is_aborted ()) {
981
1010
if (cap_proc_all_streams_handled ()) {
982
- cap_initiator_unicast_audio_start_complete ();
1011
+ cap_initiator_unicast_audio_proc_complete ();
983
1012
}
984
1013
985
1014
return ;
@@ -1006,7 +1035,7 @@ void bt_cap_initiator_qos_configured(struct bt_cap_stream *cap_stream)
1006
1035
*/
1007
1036
cap_abort_proc (bap_stream -> conn , err );
1008
1037
if (i == 0U ) {
1009
- cap_initiator_unicast_audio_start_complete ();
1038
+ cap_initiator_unicast_audio_proc_complete ();
1010
1039
}
1011
1040
1012
1041
return ;
@@ -1042,7 +1071,7 @@ void bt_cap_initiator_enabled(struct bt_cap_stream *cap_stream)
1042
1071
1043
1072
if (cap_proc_is_aborted ()) {
1044
1073
if (cap_proc_all_streams_handled ()) {
1045
- cap_initiator_unicast_audio_start_complete ();
1074
+ cap_initiator_unicast_audio_proc_complete ();
1046
1075
}
1047
1076
1048
1077
return ;
@@ -1065,7 +1094,7 @@ void bt_cap_initiator_enabled(struct bt_cap_stream *cap_stream)
1065
1094
* once all sent requests has completed
1066
1095
*/
1067
1096
cap_abort_proc (bap_stream -> conn , err );
1068
- cap_initiator_unicast_audio_start_complete ();
1097
+ cap_initiator_unicast_audio_proc_complete ();
1069
1098
1070
1099
return ;
1071
1100
}
@@ -1108,24 +1137,10 @@ void bt_cap_initiator_started(struct bt_cap_stream *cap_stream)
1108
1137
* once all sent requests has completed
1109
1138
*/
1110
1139
cap_abort_proc (bap_stream -> conn , err );
1111
- cap_initiator_unicast_audio_start_complete ();
1140
+ cap_initiator_unicast_audio_proc_complete ();
1112
1141
}
1113
1142
} else {
1114
- cap_initiator_unicast_audio_start_complete ();
1115
- }
1116
- }
1117
-
1118
- static void cap_initiator_unicast_audio_update_complete (void )
1119
- {
1120
- struct bt_conn * failed_conn ;
1121
- int err ;
1122
-
1123
- failed_conn = active_proc .failed_conn ;
1124
- err = active_proc .err ;
1125
-
1126
- (void )memset (& active_proc , 0 , sizeof (active_proc ));
1127
- if (cap_cb != NULL && cap_cb -> unicast_update_complete != NULL ) {
1128
- cap_cb -> unicast_update_complete (err , failed_conn );
1143
+ cap_initiator_unicast_audio_proc_complete ();
1129
1144
}
1130
1145
}
1131
1146
@@ -1208,6 +1223,7 @@ int bt_cap_initiator_unicast_audio_update(const struct bt_cap_unicast_audio_upda
1208
1223
atomic_set_bit (active_proc .proc_state_flags ,
1209
1224
CAP_UNICAST_PROC_STATE_ACTIVE );
1210
1225
active_proc .stream_cnt = count ;
1226
+ active_proc .proc_type = CAP_UNICAST_PROC_TYPE_UPDATE ;
1211
1227
1212
1228
cap_set_subproc (CAP_UNICAST_SUBPROC_TYPE_META_UPDATE );
1213
1229
@@ -1242,6 +1258,20 @@ int bt_cap_initiator_unicast_audio_update(const struct bt_cap_unicast_audio_upda
1242
1258
return 0 ;
1243
1259
}
1244
1260
1261
+ int bt_cap_initiator_unicast_audio_cancel (void )
1262
+ {
1263
+ if (!cap_proc_is_active () && !cap_proc_is_aborted ()) {
1264
+ LOG_DBG ("No CAP procedure is in progress" );
1265
+
1266
+ return - EALREADY ;
1267
+ }
1268
+
1269
+ cap_abort_proc (NULL , - ECANCELED );
1270
+ cap_initiator_unicast_audio_proc_complete ();
1271
+
1272
+ return 0 ;
1273
+ }
1274
+
1245
1275
void bt_cap_initiator_metadata_updated (struct bt_cap_stream * cap_stream )
1246
1276
{
1247
1277
if (!cap_stream_in_active_proc (cap_stream )) {
@@ -1265,30 +1295,13 @@ void bt_cap_initiator_metadata_updated(struct bt_cap_stream *cap_stream)
1265
1295
return ;
1266
1296
} else if (cap_proc_is_aborted ()) {
1267
1297
if (cap_proc_all_streams_handled ()) {
1268
- cap_initiator_unicast_audio_update_complete ();
1298
+ cap_initiator_unicast_audio_proc_complete ();
1269
1299
}
1270
1300
1271
1301
return ;
1272
1302
}
1273
1303
1274
- cap_initiator_unicast_audio_update_complete ();
1275
- }
1276
-
1277
- static void cap_initiator_unicast_audio_stop_complete (void )
1278
- {
1279
- struct bt_bap_unicast_group * unicast_group ;
1280
- struct bt_conn * failed_conn ;
1281
- int err ;
1282
-
1283
- unicast_group = active_proc .unicast_group ;
1284
- failed_conn = active_proc .failed_conn ;
1285
- err = active_proc .err ;
1286
-
1287
- (void )memset (& active_proc , 0 , sizeof (active_proc ));
1288
-
1289
- if (cap_cb != NULL && cap_cb -> unicast_stop_complete != NULL ) {
1290
- cap_cb -> unicast_stop_complete (unicast_group , err , failed_conn );
1291
- }
1304
+ cap_initiator_unicast_audio_proc_complete ();
1292
1305
}
1293
1306
1294
1307
static bool can_release (const struct bt_bap_stream * bap_stream )
@@ -1343,6 +1356,7 @@ int bt_cap_initiator_unicast_audio_stop(struct bt_bap_unicast_group *unicast_gro
1343
1356
CAP_UNICAST_PROC_STATE_ACTIVE );
1344
1357
active_proc .stream_cnt = stream_cnt ;
1345
1358
active_proc .unicast_group = unicast_group ;
1359
+ active_proc .proc_type = CAP_UNICAST_PROC_TYPE_STOP ;
1346
1360
1347
1361
cap_set_subproc (CAP_UNICAST_SUBPROC_TYPE_RELEASE );
1348
1362
@@ -1404,13 +1418,13 @@ void bt_cap_initiator_released(struct bt_cap_stream *cap_stream)
1404
1418
return ;
1405
1419
} else if (cap_proc_is_aborted ()) {
1406
1420
if (cap_proc_all_streams_handled ()) {
1407
- cap_initiator_unicast_audio_stop_complete ();
1421
+ cap_initiator_unicast_audio_proc_complete ();
1408
1422
}
1409
1423
1410
1424
return ;
1411
1425
}
1412
1426
1413
- cap_initiator_unicast_audio_stop_complete ();
1427
+ cap_initiator_unicast_audio_proc_complete ();
1414
1428
}
1415
1429
1416
1430
#endif /* CONFIG_BT_BAP_UNICAST_CLIENT */
0 commit comments