From: "Frédéric Danis" <frederic.danis@collabora.com>
To: linux-bluetooth@vger.kernel.org
Subject: [PATCH BlueZ v2] shared/bap: Fix endpoint configuration
Date: Mon, 23 Feb 2026 13:01:42 +0100 [thread overview]
Message-ID: <20260223120142.205159-1-frederic.danis@collabora.com> (raw)
When a first local endpoint is created after connection to a remote
device this doesn't trigger the SelectProperties request because
bt_bap_bac ops are not yet set when bt_bap_select() is called.
Creating a second local endpoint allows to trigger SelectProperties
request for the first endpoint.
This commit fixes this behavior by setting the ops during bt_bap_pac
creation.
---
v1->v2: Add bt_bap_add_vendor_pac_full() instead of changing
bt_bap_add_vendor_pac()
profiles/audio/media.c | 9 ++++-----
src/shared/bap.c | 20 ++++++++++++++++++--
src/shared/bap.h | 33 +++++++++++++++++++++------------
3 files changed, 43 insertions(+), 19 deletions(-)
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 772af1014..cdaafb04e 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -1361,9 +1361,10 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type,
metadata->iov_len = endpoint->metadata_size;
}
- endpoint->pac = bt_bap_add_vendor_pac(db, name, type, endpoint->codec,
- endpoint->cid, endpoint->vid, &endpoint->qos,
- &data, metadata);
+ endpoint->pac = bt_bap_add_vendor_pac_full(db, name, type,
+ endpoint->codec, endpoint->cid, endpoint->vid,
+ &endpoint->qos, &data, metadata,
+ &pac_ops, endpoint);
if (!endpoint->pac) {
error("Unable to create PAC");
free(name);
@@ -1371,8 +1372,6 @@ static bool endpoint_init_pac(struct media_endpoint *endpoint, uint8_t type,
return false;
}
- bt_bap_pac_set_ops(endpoint->pac, &pac_ops, endpoint);
-
DBG("PAC %s registered", name);
free(name);
diff --git a/src/shared/bap.c b/src/shared/bap.c
index 37b04c5c1..8da626fe3 100644
--- a/src/shared/bap.c
+++ b/src/shared/bap.c
@@ -4124,12 +4124,14 @@ static void notify_session_pac_added(void *data, void *user_data)
queue_foreach(bap->pac_cbs, notify_pac_added, user_data);
}
-struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
+struct bt_bap_pac *bt_bap_add_vendor_pac_full(struct gatt_db *db,
const char *name, uint8_t type,
uint8_t id, uint16_t cid, uint16_t vid,
struct bt_bap_pac_qos *qos,
struct iovec *data,
- struct iovec *metadata)
+ struct iovec *metadata,
+ struct bt_bap_pac_ops *ops,
+ void *ops_user_data)
{
struct bt_bap_db *bdb;
struct bt_bap_pac *pac;
@@ -4150,6 +4152,8 @@ struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
codec.vid = vid;
pac = bap_pac_new(bdb, name, type, &codec, qos, data, metadata);
+ if (ops)
+ bt_bap_pac_set_ops(pac, ops, ops_user_data);
switch (type) {
case BT_BAP_SINK:
@@ -4174,6 +4178,18 @@ struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
return pac;
}
+struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
+ const char *name, uint8_t type,
+ uint8_t id, uint16_t cid, uint16_t vid,
+ struct bt_bap_pac_qos *qos,
+ struct iovec *data,
+ struct iovec *metadata)
+{
+ return bt_bap_add_vendor_pac_full(db, name, type, id, cid, vid, qos,
+ data, metadata,
+ NULL, NULL);
+}
+
struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
uint8_t type, uint8_t id,
struct bt_bap_pac_qos *qos,
diff --git a/src/shared/bap.h b/src/shared/bap.h
index c1b75949f..5bdc5f8db 100644
--- a/src/shared/bap.h
+++ b/src/shared/bap.h
@@ -67,6 +67,27 @@ struct bt_bap_pac_qos {
uint16_t context;
};
+struct bt_bap_pac_ops {
+ int (*select)(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
+ uint32_t chan_alloc, struct bt_bap_pac_qos *qos,
+ bt_bap_pac_select_t cb, void *cb_data, void *user_data);
+ void (*cancel_select)(struct bt_bap_pac *lpac,
+ bt_bap_pac_select_t cb, void *cb_data, void *user_data);
+ int (*config)(struct bt_bap_stream *stream, struct iovec *cfg,
+ struct bt_bap_qos *qos, bt_bap_pac_config_t cb,
+ void *user_data);
+ void (*clear)(struct bt_bap_stream *stream, void *user_data);
+};
+
+struct bt_bap_pac *bt_bap_add_vendor_pac_full(struct gatt_db *db,
+ const char *name, uint8_t type,
+ uint8_t id, uint16_t cid, uint16_t vid,
+ struct bt_bap_pac_qos *qos,
+ struct iovec *data,
+ struct iovec *metadata,
+ struct bt_bap_pac_ops *ops,
+ void *ops_user_data);
+
struct bt_bap_pac *bt_bap_add_vendor_pac(struct gatt_db *db,
const char *name, uint8_t type,
uint8_t id, uint16_t cid, uint16_t vid,
@@ -80,18 +101,6 @@ struct bt_bap_pac *bt_bap_add_pac(struct gatt_db *db, const char *name,
struct iovec *data,
struct iovec *metadata);
-struct bt_bap_pac_ops {
- int (*select)(struct bt_bap_pac *lpac, struct bt_bap_pac *rpac,
- uint32_t chan_alloc, struct bt_bap_pac_qos *qos,
- bt_bap_pac_select_t cb, void *cb_data, void *user_data);
- void (*cancel_select)(struct bt_bap_pac *lpac,
- bt_bap_pac_select_t cb, void *cb_data, void *user_data);
- int (*config)(struct bt_bap_stream *stream, struct iovec *cfg,
- struct bt_bap_qos *qos, bt_bap_pac_config_t cb,
- void *user_data);
- void (*clear)(struct bt_bap_stream *stream, void *user_data);
-};
-
bool bt_bap_pac_set_ops(struct bt_bap_pac *pac, struct bt_bap_pac_ops *ops,
void *user_data);
--
2.43.0
next reply other threads:[~2026-02-23 12:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-23 12:01 Frédéric Danis [this message]
2026-02-23 13:42 ` [BlueZ,v2] shared/bap: Fix endpoint configuration bluez.test.bot
2026-02-26 20:20 ` [PATCH BlueZ v2] " patchwork-bot+bluetooth
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260223120142.205159-1-frederic.danis@collabora.com \
--to=frederic.danis@collabora.com \
--cc=linux-bluetooth@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox