Skip to content

Commit 0e4e762

Browse files
Thalleycarlescufi
authored andcommitted
Bluetooth: CAP: Add check for streaming state when starting unicast
When calling bt_cap_initiator_unicast_audio_start on a set of streams that are all in the streaming state we return early with -EALREADY. Signed-off-by: Emil Gydesen <[email protected]>
1 parent 4279ceb commit 0e4e762

File tree

3 files changed

+58
-1
lines changed

3 files changed

+58
-1
lines changed

include/zephyr/bluetooth/audio/cap.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,10 @@ int bt_cap_initiator_unregister_cb(const struct bt_cap_initiator_cb *cb);
346346
*
347347
* @param param Parameters to start the audio streams.
348348
*
349-
* @return 0 on success or negative error value on failure.
349+
* @retval 0 on success
350+
* @retval -EBUSY if a CAP procedure is already in progress
351+
* @retval -EINVAL if any parameter is invalid
352+
* @retval -EALREADY All streams are already in the streaming state
350353
*/
351354
int bt_cap_initiator_unicast_audio_start(const struct bt_cap_unicast_audio_start_param *param);
352355

subsys/bluetooth/audio/cap_initiator.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <zephyr/sys/check.h>
2727
#include <zephyr/sys/util.h>
2828
#include <zephyr/sys/util_macro.h>
29+
#include <sys/errno.h>
2930

3031
#include "bap_endpoint.h"
3132
#include "cap_internal.h"
@@ -860,6 +861,8 @@ static int cap_initiator_unicast_audio_configure(
860861

861862
int bt_cap_initiator_unicast_audio_start(const struct bt_cap_unicast_audio_start_param *param)
862863
{
864+
bool all_streaming = true;
865+
863866
if (bt_cap_common_proc_is_active()) {
864867
LOG_DBG("A CAP procedure is already in progress");
865868

@@ -870,6 +873,20 @@ int bt_cap_initiator_unicast_audio_start(const struct bt_cap_unicast_audio_start
870873
return -EINVAL;
871874
}
872875

876+
for (size_t i = 0U; i < param->count; i++) {
877+
const struct bt_bap_stream *bap_stream =
878+
&param->stream_params[i].stream->bap_stream;
879+
880+
if (!stream_is_in_state(bap_stream, BT_BAP_EP_STATE_STREAMING)) {
881+
all_streaming = false;
882+
}
883+
}
884+
885+
if (all_streaming) {
886+
LOG_DBG("All streams are already in the streaming state");
887+
return -EALREADY;
888+
}
889+
873890
return cap_initiator_unicast_audio_configure(param);
874891
}
875892

tests/bluetooth/audio/cap_initiator/src/test_unicast_start.c

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -500,3 +500,40 @@ static ZTEST_F(cap_initiator_test_unicast_start, test_initiator_unicast_start_st
500500
"[%zu]: Stream %p unexpected state: %d", i, bap_stream, state);
501501
}
502502
}
503+
504+
static ZTEST_F(cap_initiator_test_unicast_start, test_initiator_unicast_start_state_streaming)
505+
{
506+
struct bt_cap_unicast_audio_start_stream_param
507+
stream_params[CONFIG_BT_BAP_UNICAST_CLIENT_GROUP_STREAM_COUNT] = {0};
508+
const struct bt_cap_unicast_audio_start_param param = {
509+
.type = BT_CAP_SET_TYPE_AD_HOC,
510+
.count = ARRAY_SIZE(stream_params),
511+
.stream_params = stream_params,
512+
};
513+
int err;
514+
515+
for (size_t i = 0U; i < ARRAY_SIZE(stream_params); i++) {
516+
stream_params[i].stream = &fixture->cap_streams[i];
517+
stream_params[i].codec_cfg = &fixture->preset.codec_cfg;
518+
stream_params[i].member.member = &fixture->conns[i % ARRAY_SIZE(fixture->conns)];
519+
stream_params[i].ep = &fixture->eps[i];
520+
521+
test_unicast_set_state(stream_params[i].stream, stream_params[i].member.member,
522+
stream_params[i].ep, &fixture->preset,
523+
BT_BAP_EP_STATE_STREAMING);
524+
}
525+
526+
err = bt_cap_initiator_unicast_audio_start(&param);
527+
zassert_equal(err, -EALREADY, "Unexpected return value %d", err);
528+
529+
zexpect_call_count("bt_cap_initiator_cb.unicast_start_complete_cb", 0,
530+
mock_cap_initiator_unicast_start_complete_cb_fake.call_count);
531+
532+
for (size_t i = 0U; i < ARRAY_SIZE(stream_params); i++) {
533+
const struct bt_bap_stream *bap_stream = &fixture->cap_streams[i].bap_stream;
534+
const enum bt_bap_ep_state state = bap_stream->ep->status.state;
535+
536+
zassert_equal(state, BT_BAP_EP_STATE_STREAMING,
537+
"[%zu]: Stream %p unexpected state: %d", i, bap_stream, state);
538+
}
539+
}

0 commit comments

Comments
 (0)