Skip to content

Commit

Permalink
Bluetooth: BAP: Shell: Merge the unicast and broadcast stream structs
Browse files Browse the repository at this point in the history
Merging the two structs cleans up significant amount of code
and makes it easier to expand later.

Signed-off-by: Emil Gydesen <[email protected]>
  • Loading branch information
Thalley authored and carlescufi committed Jul 7, 2023
1 parent d17cde4 commit 275c86d
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 91 deletions.
21 changes: 6 additions & 15 deletions subsys/bluetooth/audio/shell/audio.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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)

Expand Down Expand Up @@ -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 */

Expand Down Expand Up @@ -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));
Expand Down
94 changes: 26 additions & 68 deletions subsys/bluetooth/audio/shell/bap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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)
Expand Down Expand Up @@ -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 */
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
16 changes: 8 additions & 8 deletions subsys/bluetooth/audio/shell/cap_initiator.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down

0 comments on commit 275c86d

Please sign in to comment.