aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2024-04-11 09:36:25 -0400
committerLuiz Augusto von Dentz <luiz.von.dentz@intel.com>2024-04-11 11:59:30 -0400
commitc7dcd064057fb89628c5da55da91dff363b559ca (patch)
treec4de9cefa68dec2a55c31d159b509f0542175025
parentbe79cd19c5c5f6b42e40c0edb04d67ab21773f19 (diff)
shared/bap: Make bt_bap_select fallback in case of no channel allocation
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
-rw-r--r--src/shared/bap.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/shared/bap.c b/src/shared/bap.c
index b452461ac7..cc1fa1ffbe 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;
}