2024-04-11 20:03:19

by Luiz Augusto von Dentz

[permalink] [raw]
Subject: [PATCH BlueZ v4 2/4] shared/bap: Make bt_bap_select fallback in case of no channel allocation

From: Luiz Augusto von Dentz <[email protected]>

If channel allocation could not be matched attempt to call .select
without a channel allocation as the device might require a different
matching algorithm.

Fixes: https://github.com/bluez/bluez/issues/793
---
src/shared/bap.c | 14 ++++++++++++--
1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/src/shared/bap.c b/src/shared/bap.c
index b452461ac715..cc1fa1ffbe32 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -5116,6 +5116,7 @@ int bt_bap_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
void *user_data)
{
const struct queue_entry *lchan, *rchan;
+ int selected = 0;

if (!lpac || !rpac || !func)
return -EINVAL;
@@ -5158,8 +5159,7 @@ int bt_bap_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
rc->location, &rpac->qos,
func, user_data,
lpac->user_data);
- if (count)
- (*count)++;
+ selected++;

/* Check if there are any channels left to select */
map.count &= ~(map.count & rc->count);
@@ -5175,6 +5175,16 @@ int bt_bap_select(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
}
}

+ /* Fallback to no channel allocation since none could be matched. */
+ if (!selected) {
+ lpac->ops->select(lpac, rpac, 0, &rpac->qos, func, user_data,
+ lpac->user_data);
+ selected++;
+ }
+
+ if (count)
+ *count += selected;
+
return 0;
}

--
2.44.0