From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> This enables different code paths for each stream type e.g unicast vs broadcast. --- src/shared/bap.c | 180 +++++++++++++++++++++++------------------------ 1 file changed, 87 insertions(+), 93 deletions(-) diff --git a/src/shared/bap.c b/src/shared/bap.c index 3b4803ab6c72..9b0768d11373 100644 --- a/src/shared/bap.c +++ b/src/shared/bap.c @@ -216,6 +216,7 @@ struct bt_bap_stream_io { struct bt_bap_stream_ops { uint8_t type; + void (*set_state)(struct bt_bap_stream *stream, uint8_t state); unsigned int (*config)(struct bt_bap_stream *stream, struct bt_bap_qos *qos, struct iovec *data, bt_bap_stream_func_t func, void *user_data); @@ -1218,15 +1219,6 @@ static void bap_stream_state_changed(struct bt_bap_stream *stream) bt_bap_stream_statestr(stream->ep->old_state), bt_bap_stream_statestr(stream->ep->state)); - /* Check if ref_count is already 0 which means detaching is in - * progress. - */ - bap = bt_bap_ref_safe(bap); - if (!bap) { - bap_stream_detach(stream); - return; - } - /* Pre notification updates */ switch (stream->ep->state) { case BT_ASCS_ASE_STATE_IDLE: @@ -1280,85 +1272,27 @@ static void bap_stream_state_changed(struct bt_bap_stream *stream) bt_bap_stream_stop(stream, stream_stop_complete, NULL); break; } - - bt_bap_unref(bap); } static void stream_set_state(struct bt_bap_stream *stream, uint8_t state) -{ - struct bt_bap_endpoint *ep = stream->ep; - - ep->old_state = ep->state; - ep->state = state; - - if (stream->lpac->type == BT_BAP_BCAST_SINK) - goto done; - - if (stream->client) - goto done; - - switch (ep->state) { - case BT_ASCS_ASE_STATE_IDLE: - break; - case BT_ASCS_ASE_STATE_CONFIG: - stream_notify_config(stream); - break; - case BT_ASCS_ASE_STATE_QOS: - stream_notify_qos(stream); - break; - case BT_ASCS_ASE_STATE_ENABLING: - case BT_ASCS_ASE_STATE_STREAMING: - case BT_ASCS_ASE_STATE_DISABLING: - stream_notify_metadata(stream); - break; - } - -done: - bap_stream_state_changed(stream); -} - -static void stream_set_state_broadcast(struct bt_bap_stream *stream, - uint8_t state) { struct bt_bap_endpoint *ep = stream->ep; struct bt_bap *bap = stream->bap; - const struct queue_entry *entry; - if (ep->old_state == state) + /* Check if ref_count is already 0 which means detaching is in + * progress. + */ + bap = bt_bap_ref_safe(bap); + if (!bap) { + bap_stream_detach(stream); return; + } + ep->old_state = ep->state; ep->state = state; - DBG(bap, "stream %p dir 0x%02x: %s -> %s", stream, - bt_bap_stream_get_dir(stream), - bt_bap_stream_statestr(stream->ep->old_state), - bt_bap_stream_statestr(stream->ep->state)); - - bt_bap_ref(bap); - - for (entry = queue_get_entries(bap->state_cbs); entry; - entry = entry->next) { - struct bt_bap_state *state = entry->data; - - if (state->func) - state->func(stream, stream->ep->old_state, - stream->ep->state, state->data); - } - - /* Post notification updates */ - switch (stream->ep->state) { - case BT_ASCS_ASE_STATE_IDLE: - bap_stream_detach(stream); - break; - case BT_ASCS_ASE_STATE_DISABLING: - bap_stream_io_detach(stream); - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_QOS); - break; - case BT_ASCS_ASE_STATE_RELEASING: - bap_stream_io_detach(stream); - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_IDLE); - break; - } + if (stream->ops && stream->ops->set_state) + stream->ops->set_state(stream, state); bt_bap_unref(bap); } @@ -1370,11 +1304,9 @@ static void ep_config_cb(struct bt_bap_stream *stream, int err) if (bt_bap_stream_get_type(stream) == BT_BAP_STREAM_TYPE_BCAST) { if (!bt_bap_stream_io_dir(stream)) - stream_set_state_broadcast(stream, - BT_BAP_STREAM_STATE_QOS); + stream_set_state(stream, BT_BAP_STREAM_STATE_QOS); else if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE) - stream_set_state_broadcast(stream, - BT_BAP_STREAM_STATE_CONFIG); + stream_set_state(stream, BT_BAP_STREAM_STATE_CONFIG); return; } @@ -1591,6 +1523,33 @@ static bool bap_queue_req(struct bt_bap *bap, struct bt_bap_req *req) return true; } +static void bap_ucast_set_state(struct bt_bap_stream *stream, uint8_t state) +{ + struct bt_bap_endpoint *ep = stream->ep; + + if (stream->lpac->type == BT_BAP_BCAST_SINK || stream->client) + goto done; + + switch (ep->state) { + case BT_ASCS_ASE_STATE_IDLE: + break; + case BT_ASCS_ASE_STATE_CONFIG: + stream_notify_config(stream); + break; + case BT_ASCS_ASE_STATE_QOS: + stream_notify_qos(stream); + break; + case BT_ASCS_ASE_STATE_ENABLING: + case BT_ASCS_ASE_STATE_STREAMING: + case BT_ASCS_ASE_STATE_DISABLING: + stream_notify_metadata(stream); + break; + } + +done: + bap_stream_state_changed(stream); +} + static unsigned int bap_ucast_config(struct bt_bap_stream *stream, struct bt_bap_qos *qos, struct iovec *data, @@ -1977,16 +1936,50 @@ static unsigned int bap_ucast_release(struct bt_bap_stream *stream, return req->id; } +static void bap_bcast_set_state(struct bt_bap_stream *stream, uint8_t state) +{ + struct bt_bap *bap = stream->bap; + const struct queue_entry *entry; + + DBG(bap, "stream %p dir 0x%02x: %s -> %s", stream, + bt_bap_stream_get_dir(stream), + bt_bap_stream_statestr(stream->ep->old_state), + bt_bap_stream_statestr(stream->ep->state)); + + for (entry = queue_get_entries(bap->state_cbs); entry; + entry = entry->next) { + struct bt_bap_state *state = entry->data; + + if (state->func) + state->func(stream, stream->ep->old_state, + stream->ep->state, state->data); + } + + /* Post notification updates */ + switch (stream->ep->state) { + case BT_ASCS_ASE_STATE_IDLE: + bap_stream_detach(stream); + break; + case BT_ASCS_ASE_STATE_DISABLING: + bap_stream_io_detach(stream); + stream_set_state(stream, BT_BAP_STREAM_STATE_QOS); + break; + case BT_ASCS_ASE_STATE_RELEASING: + bap_stream_io_detach(stream); + stream_set_state(stream, BT_BAP_STREAM_STATE_IDLE); + break; + } +} + static unsigned int bap_bcast_enable(struct bt_bap_stream *stream, bool enable_links, struct iovec *data, bt_bap_stream_func_t func, void *user_data) { if (bt_bap_stream_io_dir(stream) == BT_BAP_BCAST_SOURCE) - stream_set_state_broadcast(stream, - BT_BAP_STREAM_STATE_STREAMING); + stream_set_state(stream, BT_BAP_STREAM_STATE_STREAMING); else - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_CONFIG); + stream_set_state(stream, BT_BAP_STREAM_STATE_CONFIG); return 1; } @@ -1995,7 +1988,7 @@ static unsigned int bap_bcast_start(struct bt_bap_stream *stream, bt_bap_stream_func_t func, void *user_data) { - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_STREAMING); + stream_set_state(stream, BT_BAP_STREAM_STATE_STREAMING); return 1; } @@ -2005,7 +1998,7 @@ static unsigned int bap_bcast_disable(struct bt_bap_stream *stream, bt_bap_stream_func_t func, void *user_data) { - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_DISABLING); + stream_set_state(stream, BT_BAP_STREAM_STATE_DISABLING); return 1; } @@ -2025,15 +2018,16 @@ static unsigned int bap_bcast_release(struct bt_bap_stream *stream, bt_bap_stream_func_t func, void *user_data) { - stream_set_state_broadcast(stream, BT_BAP_STREAM_STATE_RELEASING); + stream_set_state(stream, BT_BAP_STREAM_STATE_RELEASING); return 1; } -#define STREAM_OPS(_type, _config, _qos, _enable, _start, _disable, _stop, \ - _metadata, _release) \ +#define STREAM_OPS(_type, _set_state, _config, _qos, _enable, _start, \ + _disable, _stop, _metadata, _release) \ { \ .type = _type, \ + .set_state = _set_state, \ .config = _config, \ .qos = _qos, \ .enable = _enable, \ @@ -2045,19 +2039,19 @@ static unsigned int bap_bcast_release(struct bt_bap_stream *stream, } static const struct bt_bap_stream_ops stream_ops[] = { - STREAM_OPS(BT_BAP_SINK, + STREAM_OPS(BT_BAP_SINK, bap_ucast_set_state, bap_ucast_config, bap_ucast_qos, bap_ucast_enable, bap_ucast_start, bap_ucast_disable, bap_ucast_stop, bap_ucast_metadata, bap_ucast_release), - STREAM_OPS(BT_BAP_SOURCE, + STREAM_OPS(BT_BAP_SOURCE, bap_ucast_set_state, bap_ucast_config, bap_ucast_qos, bap_ucast_enable, bap_ucast_start, bap_ucast_disable, bap_ucast_stop, bap_ucast_metadata, bap_ucast_release), - STREAM_OPS(BT_BAP_BCAST_SINK, + STREAM_OPS(BT_BAP_BCAST_SINK, bap_bcast_set_state, bap_bcast_config, NULL, bap_bcast_enable, bap_bcast_start, bap_bcast_disable, NULL, bap_bcast_metadata, bap_bcast_release), - STREAM_OPS(BT_BAP_BCAST_SOURCE, + STREAM_OPS(BT_BAP_BCAST_SOURCE, bap_bcast_set_state, bap_bcast_config, NULL, bap_bcast_enable, bap_bcast_start, bap_bcast_disable, NULL, bap_bcast_metadata, bap_bcast_release), -- 2.43.0