diff options
author | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-01-26 12:10:13 -0800 |
---|---|---|
committer | Luiz Augusto von Dentz <luiz.von.dentz@intel.com> | 2023-01-26 12:10:13 -0800 |
commit | b61044d52917eb44468b46bfcafb191d18418698 (patch) | |
tree | 27ab91ea425113b03c61bbef538da91e8f8f280f /profiles | |
parent | 814e3535a1bc165e05d91c470b38e835c5006ac9 (diff) | |
download | bluez-b61044d52917eb44468b46bfcafb191d18418698.tar.gz |
bap: Fix registering multiple endpoint for the same PAC set
This makes sure there is only one endpoint representing a local and
remote PAC set.
Diffstat (limited to 'profiles')
-rw-r--r-- | profiles/audio/bap.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/profiles/audio/bap.c b/profiles/audio/bap.c index 5a50a2cc6..e5ffb7230 100644 --- a/profiles/audio/bap.c +++ b/profiles/audio/bap.c @@ -510,6 +510,22 @@ static void ep_free(void *data) free(ep); } +struct match_ep { + struct bt_bap_pac *lpac; + struct bt_bap_pac *rpac; +}; + +static bool match_ep(const void *data, const void *user_data) +{ + const struct bap_ep *ep = data; + const struct match_ep *match = user_data; + + if (ep->lpac != match->lpac) + return false; + + return ep->rpac == match->rpac; +} + static struct bap_ep *ep_register(struct btd_service *service, struct bt_bap_pac *lpac, struct bt_bap_pac *rpac) @@ -520,6 +536,7 @@ static struct bap_ep *ep_register(struct btd_service *service, struct queue *queue; int i, err; const char *suffix; + struct match_ep match = { lpac, rpac }; switch (bt_bap_pac_get_type(rpac)) { case BT_BAP_SINK: @@ -536,6 +553,10 @@ static struct bap_ep *ep_register(struct btd_service *service, return NULL; } + ep = queue_find(queue, match_ep, &match); + if (ep) + return ep; + ep = new0(struct bap_ep, 1); ep->data = data; ep->lpac = lpac; |