diff mbox series

[BlueZ,v2,2/7] shared/bap: Create multiple streams for the same pac

Message ID 20240212153222.8191-3-silviu.barbulescu@nxp.com
State New
Headers show
Series Add support for multiple BISes on the bcast source | expand

Commit Message

Silviu Florian Barbulescu Feb. 12, 2024, 3:32 p.m. UTC
Broadcast source requires to create multiple streams for one pac.
This is required for multiple BISes support.
---
 src/shared/bap.c | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)
diff mbox series

Patch

diff --git a/src/shared/bap.c b/src/shared/bap.c
index e26dbf944..f0ffdebfe 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -5156,7 +5156,7 @@  struct bt_bap_stream *bt_bap_stream_new(struct bt_bap *bap,
 					struct iovec *data)
 {
 	struct bt_bap_stream *stream;
-	struct bt_bap_endpoint *ep;
+	struct bt_bap_endpoint *ep = NULL;
 	struct match_pac match;
 
 	if (!bap)
@@ -5212,12 +5212,32 @@  struct bt_bap_stream *bt_bap_stream_new(struct bt_bap *bap,
 	match.lpac = lpac;
 	match.rpac = rpac;
 
-	/* Check for existing stream */
-	ep = queue_find(bap->remote_eps, find_ep_pacs, &match);
+	/* Broadcast source supports multiple endpoints (multiple BISes)
+	 * for one pac so allow it to register a new endpoint even if
+	 * others already exist.
+	 */
+	if (lpac->type != BT_BAP_BCAST_SOURCE) {
+		/* Check for existing stream */
+		ep = queue_find(bap->remote_eps, find_ep_pacs, &match);
+	}
+
 	if (!ep) {
 		/* Check for unused ASE */
 		ep = queue_find(bap->remote_eps, find_ep_unused, &match);
-		if (!ep) {
+		if (!ep && lpac->type == BT_BAP_BCAST_SOURCE) {
+			/* Push a new remote endpoint with direction
+			 * broadcast source
+			 */
+			ep = bap_endpoint_new_broadcast(bap->rdb,
+					BT_BAP_BCAST_SOURCE);
+
+			if (ep)
+				queue_push_tail(bap->remote_eps, ep);
+			else {
+				DBG(bap, "Unable to create endpoint");
+				return NULL;
+			}
+		} else if (!ep) {
 			DBG(bap, "Unable to find unused ASE");
 			return NULL;
 		}