diff --git a/src/shared/bap.c b/src/shared/bap.c
index 5fee7b4..71eadbd 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
free(stream);
}
+static void bap_req_free(void *data)
+{
+ struct bt_bap_req *req = data;
+ size_t i;
+
+ queue_destroy(req->group, bap_req_free);
+
+ for (i = 0; i < req->len; i++)
+ free(req->iov[i].iov_base);
+
+ free(req->iov);
+ free(req);
+}
+
+static void bap_req_complete(struct bt_bap_req *req,
+ const struct bt_ascs_ase_rsp *rsp)
+{
+ struct queue *group;
+
+ if (!req->func)
+ goto done;
+
+ if (rsp)
+ req->func(req->stream, rsp->code, rsp->reason, req->user_data);
+ else
+ req->func(req->stream, BT_ASCS_RSP_UNSPECIFIED, 0x00,
+ req->user_data);
+
+done:
+ /* Detach from request so it can be freed separately */
+ group = req->group;
+ req->group = NULL;
+
+ queue_foreach(group, (queue_foreach_func_t)bap_req_complete,
+ (void *)rsp);
+
+ queue_destroy(group, NULL);
+
+ bap_req_free(req);
+}
+
+static bool match_req_stream(const void *data, const void *match_data)
+{
+ const struct bt_bap_req *req = data;
+
+ return req->stream == match_data;
+}
+
+static void bap_req_abort(void *data)
+{
+ struct bt_bap_req *req = data;
+ struct bt_bap *bap = req->stream->bap;
+
+ DBG(bap, "req %p", req);
+ bap_req_complete(req, NULL);
+}
+
+static void bap_abort_stream_req(struct bt_bap *bap,
+ struct bt_bap_stream *stream)
+{
+ queue_remove_all(bap->reqs, match_req_stream, stream, bap_req_abort);
+}
+
static void bap_stream_detach(struct bt_bap_stream *stream)
{
struct bt_bap_endpoint *ep = stream->ep;
DBG(stream->bap, "stream %p ep %p", stream, ep);
+ bap_abort_stream_req(stream->bap, stream);
+
queue_remove(stream->bap->streams, stream);
bap_stream_clear_cfm(stream);
return true;
}
-static void bap_req_free(void *data)
-{
- struct bt_bap_req *req = data;
- size_t i;
-
- queue_destroy(req->group, bap_req_free);
-
- for (i = 0; i < req->len; i++)
- free(req->iov[i].iov_base);
-
- free(req->iov);
- free(req);
-}
-
-static void bap_req_complete(struct bt_bap_req *req,
- const struct bt_ascs_ase_rsp *rsp)
-{
- struct queue *group;
-
- if (!req->func)
- goto done;
-
- if (rsp)
- req->func(req->stream, rsp->code, rsp->reason, req->user_data);
- else
- req->func(req->stream, BT_ASCS_RSP_UNSPECIFIED, 0x00,
- req->user_data);
-
-done:
- /* Detach from request so it can be freed separately */
- group = req->group;
- req->group = NULL;
-
- queue_foreach(group, (queue_foreach_func_t)bap_req_complete,
- (void *)rsp);
-
- queue_destroy(group, NULL);
-
- bap_req_free(req);
-}
-
static void stream_stop_complete(struct bt_bap_stream *stream, uint8_t code,
uint8_t reason, void *user_data)
{