From 275c86d399a8408664f6c65a2e756a9ec96204fa Mon Sep 17 00:00:00 2001 From: Emil Gydesen Date: Fri, 7 Jul 2023 12:57:44 +0200 Subject: [PATCH] Bluetooth: BAP: Shell: Merge the unicast and broadcast stream structs Merging the two structs cleans up significant amount of code and makes it easier to expand later. Signed-off-by: Emil Gydesen --- subsys/bluetooth/audio/shell/audio.h | 21 ++--- subsys/bluetooth/audio/shell/bap.c | 94 ++++++-------------- subsys/bluetooth/audio/shell/cap_initiator.c | 16 ++-- 3 files changed, 40 insertions(+), 91 deletions(-) diff --git a/subsys/bluetooth/audio/shell/audio.h b/subsys/bluetooth/audio/shell/audio.h index 0daca952b3904c..a146964bc10a19 100644 --- a/subsys/bluetooth/audio/shell/audio.h +++ b/subsys/bluetooth/audio/shell/audio.h @@ -54,23 +54,14 @@ struct named_lc3_preset { CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT), \ (0)) -struct unicast_stream { +struct shell_stream { struct bt_cap_stream stream; struct bt_audio_codec_cfg codec_cfg; struct bt_audio_codec_qos qos; #if defined(CONFIG_BT_AUDIO_TX) int64_t connected_at_ticks; /* The uptime tick measured when stream was connected */ uint16_t last_allocated_seq_num; /* The last packet sequence number allocated */ -#endif /* defined(CONFIG_BT_AUDIO_TX) */ -}; - -struct broadcast_stream { - struct bt_cap_stream stream; - struct bt_audio_codec_data data; -#if defined(CONFIG_BT_AUDIO_TX) - int64_t connected_at_ticks; /* The uptime tick measured when stream was connected */ - uint16_t last_allocated_seq_num; /* The last packet sequence number allocated */ -#endif /* defined(CONFIG_BT_AUDIO_TX) */ +#endif /* CONFIG_BT_AUDIO_TX */ }; struct broadcast_source { @@ -82,8 +73,8 @@ struct broadcast_source { struct bt_audio_codec_qos qos; }; -extern struct unicast_stream unicast_streams[CONFIG_BT_MAX_CONN * (UNICAST_SERVER_STREAM_COUNT + - UNICAST_CLIENT_STREAM_COUNT)]; +extern struct shell_stream unicast_streams[CONFIG_BT_MAX_CONN * (UNICAST_SERVER_STREAM_COUNT + + UNICAST_CLIENT_STREAM_COUNT)]; #if defined(CONFIG_BT_BAP_UNICAST_CLIENT) @@ -167,7 +158,7 @@ static inline void print_codec_cfg(const struct shell *sh, } #if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) -extern struct broadcast_stream broadcast_source_streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT]; +extern struct shell_stream broadcast_source_streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT]; extern struct broadcast_source default_source; #endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */ @@ -227,7 +218,7 @@ static inline void print_base(const struct shell *sh, const struct bt_bap_base * } #endif /* BROADCAST_SNK_SUBGROUP_CNT > 0 */ -static inline void copy_unicast_stream_preset(struct unicast_stream *stream, +static inline void copy_unicast_stream_preset(struct shell_stream *stream, const struct named_lc3_preset *named_preset) { memcpy(&stream->qos, &named_preset->preset.qos, sizeof(stream->qos)); diff --git a/subsys/bluetooth/audio/shell/bap.c b/subsys/bluetooth/audio/shell/bap.c index 55263ba4fc3510..26727dd25d5624 100644 --- a/subsys/bluetooth/audio/shell/bap.c +++ b/subsys/bluetooth/audio/shell/bap.c @@ -34,8 +34,8 @@ #if defined(CONFIG_BT_BAP_UNICAST) -struct unicast_stream unicast_streams[CONFIG_BT_MAX_CONN * - (UNICAST_SERVER_STREAM_COUNT + UNICAST_CLIENT_STREAM_COUNT)]; +struct shell_stream unicast_streams[CONFIG_BT_MAX_CONN * + (UNICAST_SERVER_STREAM_COUNT + UNICAST_CLIENT_STREAM_COUNT)]; static const struct bt_audio_codec_qos_pref qos_pref = BT_AUDIO_CODEC_QOS_PREF(true, BT_GAP_LE_PHY_2M, 0u, 60u, 20000u, 40000u, 20000u, 40000u); @@ -53,7 +53,7 @@ struct bt_bap_ep *srcs[CONFIG_BT_MAX_CONN][CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_ #endif /* CONFIG_BT_BAP_UNICAST */ #if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) -struct broadcast_stream broadcast_source_streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT]; +struct shell_stream broadcast_source_streams[CONFIG_BT_BAP_BROADCAST_SRC_STREAM_COUNT]; struct broadcast_source default_source; #endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */ #if defined(CONFIG_BT_BAP_BROADCAST_SINK) @@ -143,39 +143,20 @@ static bool initialized; #if defined(CONFIG_BT_AUDIO_TX) static struct bt_bap_stream *txing_stream; -static uint16_t get_next_seq_num(struct bt_bap_stream *stream) +static uint16_t get_next_seq_num(struct bt_bap_stream *bap_stream) { - const uint32_t interval_us = stream->qos->interval; - uint16_t *last_allocated_seq_num_ptr = NULL; - int64_t connected_at_ticks; + struct bt_cap_stream *cap_stream = + CONTAINER_OF(bap_stream, struct bt_cap_stream, bap_stream); + struct shell_stream *sh_stream = CONTAINER_OF(cap_stream, struct shell_stream, stream); + const uint32_t interval_us = bap_stream->qos->interval; int64_t uptime_ticks; int64_t delta_ticks; uint64_t delta_us; uint16_t seq_num; -#if defined(CONFIG_BT_BAP_UNICAST) - if (stream->conn != NULL) { /* if unicast */ - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); - - last_allocated_seq_num_ptr = &uni_stream->last_allocated_seq_num; - connected_at_ticks = uni_stream->connected_at_ticks; - } -#endif /* CONFIG_BT_BAP_UNICAST */ - -#if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) - if (stream->conn == NULL) { /* if broadcast */ - struct broadcast_stream *bro_stream = - CONTAINER_OF(stream, struct broadcast_stream, stream); - - last_allocated_seq_num_ptr = &bro_stream->last_allocated_seq_num; - connected_at_ticks = bro_stream->connected_at_ticks; - } -#endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */ - /* Note: This does not handle wrapping of ticks when they go above 2^(62-1) */ uptime_ticks = k_uptime_ticks(); - delta_ticks = uptime_ticks - connected_at_ticks; + delta_ticks = uptime_ticks - sh_stream->connected_at_ticks; delta_us = k_ticks_to_us_near64((uint64_t)delta_ticks); /* Calculate the sequence number by dividing the stream uptime by the SDU interval */ @@ -188,13 +169,12 @@ static uint16_t get_next_seq_num(struct bt_bap_stream *stream) * The additional condition that checks that the difference is smaller than a specific value * is used to handle the case where seq_num has wrapped. */ - if (seq_num <= *last_allocated_seq_num_ptr && *last_allocated_seq_num_ptr - seq_num < 100) { - seq_num = *last_allocated_seq_num_ptr + 1; + if (seq_num <= sh_stream->last_allocated_seq_num && + sh_stream->last_allocated_seq_num - seq_num < 100) { + seq_num = sh_stream->last_allocated_seq_num + 1; } - if (last_allocated_seq_num_ptr != NULL) { - *last_allocated_seq_num_ptr = seq_num; - } + sh_stream->last_allocated_seq_num = seq_num; return seq_num; } @@ -964,7 +944,8 @@ static int cmd_config(const struct shell *sh, size_t argc, char *argv[]) { enum bt_audio_location location = BT_AUDIO_LOCATION_PROHIBITED; const struct named_lc3_preset *named_preset; - struct unicast_stream *uni_stream; + struct shell_stream *uni_stream; + struct bt_cap_stream *cap_stream; struct bt_bap_stream *bap_stream; struct bt_bap_ep *ep = NULL; unsigned long index; @@ -1071,7 +1052,8 @@ static int cmd_config(const struct shell *sh, size_t argc, char *argv[]) } } - uni_stream = CONTAINER_OF(bap_stream, struct unicast_stream, stream); + cap_stream = CONTAINER_OF(bap_stream, struct bt_cap_stream, bap_stream); + uni_stream = CONTAINER_OF(cap_stream, struct shell_stream, stream); copy_unicast_stream_preset(uni_stream, named_preset); /* If location has been modifed, we update the location in the codec configuration */ @@ -1250,8 +1232,7 @@ static int create_unicast_group(const struct shell *sh) for (size_t i = 0U; i < ARRAY_SIZE(unicast_streams); i++) { struct bt_bap_stream *stream = &unicast_streams[i].stream.bap_stream; - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + struct shell_stream *uni_stream = &unicast_streams[i]; if (stream->ep != NULL) { struct bt_bap_unicast_group_stream_param *stream_param; @@ -1781,43 +1762,20 @@ static void stream_enabled_cb(struct bt_bap_stream *stream) } } -static void stream_started_cb(struct bt_bap_stream *stream) +static void stream_started_cb(struct bt_bap_stream *bap_stream) { #if defined(CONFIG_BT_AUDIO_TX) - int64_t *connected_at_ticks_ptr = NULL; - uint16_t *last_allocated_seq_num_ptr = NULL; + struct bt_cap_stream *cap_stream = + CONTAINER_OF(bap_stream, struct bt_cap_stream, bap_stream); + struct shell_stream *sh_stream = CONTAINER_OF(cap_stream, struct shell_stream, stream); -#if defined(CONFIG_BT_BAP_UNICAST) - if (stream->conn != NULL) { /* if unicast */ - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + sh_stream->connected_at_ticks = k_uptime_ticks(); - connected_at_ticks_ptr = &uni_stream->connected_at_ticks; - last_allocated_seq_num_ptr = &uni_stream->last_allocated_seq_num; - } -#endif /* CONFIG_BT_BAP_UNICAST */ - -#if defined(CONFIG_BT_BAP_BROADCAST_SOURCE) - if (stream == NULL) { /* if broadcast */ - struct broadcast_stream *bro_stream = - CONTAINER_OF(stream, struct broadcast_stream, stream); - - connected_at_ticks_ptr = &bro_stream->connected_at_ticks; - last_allocated_seq_num_ptr = &bro_stream->last_allocated_seq_num; - } -#endif /* CONFIG_BT_BAP_BROADCAST_SOURCE */ - - if (connected_at_ticks_ptr != NULL) { - *connected_at_ticks_ptr = k_uptime_ticks(); - } - - if (last_allocated_seq_num_ptr != NULL) { - /* Set to max value to support sending the first packet with PSN = 0*/ - *last_allocated_seq_num_ptr = UINT16_MAX; - } + /* Set to max value to support sending the first packet with PSN = 0*/ + sh_stream->last_allocated_seq_num = UINT16_MAX; #endif /* CONFIG_BT_AUDIO_TX */ - printk("Stream %p started\n", stream); + printk("Stream %p started\n", bap_stream); #if defined(CONFIG_BT_AUDIO_RX) lost_pkts = 0U; diff --git a/subsys/bluetooth/audio/shell/cap_initiator.c b/subsys/bluetooth/audio/shell/cap_initiator.c index 0fabfdf1429987..3e93c455c2dbab 100644 --- a/subsys/bluetooth/audio/shell/cap_initiator.c +++ b/subsys/bluetooth/audio/shell/cap_initiator.c @@ -234,8 +234,8 @@ static int cmd_cap_initiator_unicast_start(const struct shell *sh, size_t argc, for (size_t i = 0U; i < sink_cnt; i++) { struct bt_cap_stream *stream = &unicast_streams[start_param.count].stream; - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + struct shell_stream *uni_stream = + CONTAINER_OF(stream, struct shell_stream, stream); struct bt_bap_ep *snk_ep = snks[bt_conn_index(conn)][i]; if (snk_ep == NULL) { @@ -268,8 +268,8 @@ static int cmd_cap_initiator_unicast_start(const struct shell *sh, size_t argc, for (size_t i = 0U; i < source_cnt; i++) { struct bt_cap_stream *stream = &unicast_streams[start_param.count].stream; - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + struct shell_stream *uni_stream = + CONTAINER_OF(stream, struct shell_stream, stream); struct bt_bap_ep *src_ep = srcs[bt_conn_index(conn)][i]; if (src_ep == NULL) { @@ -364,8 +364,8 @@ static int cmd_cap_initiator_unicast_update(const struct shell *sh, size_t argc, if (argc == 2 && strcmp(argv[1], "all") == 0) { for (size_t i = 0U; i < ARRAY_SIZE(unicast_streams); i++) { struct bt_cap_stream *stream = &unicast_streams[i].stream; - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + struct shell_stream *uni_stream = + CONTAINER_OF(stream, struct shell_stream, stream); struct bt_bap_ep_info ep_info; if (stream->bap_stream.conn == NULL) { @@ -397,8 +397,8 @@ static int cmd_cap_initiator_unicast_update(const struct shell *sh, size_t argc, } else { for (size_t i = 1U; i < argc; i++) { struct bt_cap_stream *stream = (void *)shell_strtoul(argv[i], 16, &err); - struct unicast_stream *uni_stream = - CONTAINER_OF(stream, struct unicast_stream, stream); + struct shell_stream *uni_stream = + CONTAINER_OF(stream, struct shell_stream, stream); struct bt_bap_ep_info ep_info; if (err != 0) {