Skip to content

Commit 21b5f0c

Browse files
fredrikdanebjerkartben
authored andcommitted
Bluetooth: pacs: Add dynamic PACS registration
Added option to set the PACS Characteristics through the bap API, making PACS configuration runtime available. Source and Sink PAC, as well as Source/Sink PAC Location is can be set through a register function in the PACS api. Signed-off-by: Fredrik Danebjer <[email protected]>
1 parent 7d4e31a commit 21b5f0c

File tree

16 files changed

+571
-103
lines changed

16 files changed

+571
-103
lines changed

doc/releases/migration-guide-4.1.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,12 @@ Bluetooth Audio
403403
* :kconfig:option:`CONFIG_BT_PAC_SNK`
404404
* :kconfig:option:`CONFIG_BT_PAC_SRC`
405405

406+
* PACS have been changed to support dynamic, runtime configuration. This means that PACS now has
407+
to be registered with :c:func:`bt_pacs_register` before it can be used. In addition,
408+
:c:func:`bt_pacs_register` also have to be called before :c:func:`bt_ascs_register` can be
409+
be called. All Kconfig options still remain. Runtime configuration cannot override a disabled
410+
Kconfig option. (:github:`83730`)
411+
406412
Bluetooth Classic
407413
=================
408414

include/zephyr/bluetooth/audio/pacs.h

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,43 @@ struct bt_pacs_cap {
4545
sys_snode_t _node;
4646
};
4747

48+
/** Structure for registering PACS */
49+
struct bt_bap_pacs_register_param {
50+
#if defined(CONFIG_BT_PAC_SNK) || defined(__DOXYGEN__)
51+
/**
52+
* @brief Enables or disables registration of Sink PAC Characteristic.
53+
*/
54+
bool snk_pac;
55+
#endif /* CONFIG_BT_PAC_SNK */
56+
57+
#if defined(CONFIG_BT_PAC_SNK_LOC) || defined(__DOXYGEN__)
58+
/**
59+
* @brief Enables or disables registration of Sink Location Characteristic.
60+
*
61+
* Registration of Sink Location is dependent on @ref bt_bap_pacs_register_param.snk_pac
62+
* also being set.
63+
*/
64+
bool snk_loc;
65+
#endif /* CONFIG_BT_PAC_SNK_LOC */
66+
67+
#if defined(CONFIG_BT_PAC_SRC) || defined(__DOXYGEN__)
68+
/**
69+
* @brief Enables or disables registration of Source PAC Characteristic.
70+
*/
71+
bool src_pac;
72+
#endif /* CONFIG_BT_PAC_SRC */
73+
74+
#if defined(CONFIG_BT_PAC_SRC_LOC) || defined(__DOXYGEN__)
75+
/**
76+
* @brief Enables or disables registration of Source Location Characteristic.
77+
*
78+
* Registration of Source Location is dependent on @ref bt_bap_pacs_register_param.src_pac
79+
* also being set.
80+
*/
81+
bool src_loc;
82+
#endif /* CONFIG_BT_PAC_SRC_LOC */
83+
};
84+
4885
/**
4986
* @typedef bt_pacs_cap_foreach_func_t
5087
* @brief Published Audio Capability iterator callback.
@@ -71,6 +108,22 @@ void bt_pacs_cap_foreach(enum bt_audio_dir dir,
71108
bt_pacs_cap_foreach_func_t func,
72109
void *user_data);
73110

111+
/**
112+
* @brief Register the Published Audio Capability Service instance.
113+
*
114+
* @param param PACS register parameters.
115+
*
116+
* @return 0 in case of success or negative value in case of error.
117+
*/
118+
int bt_pacs_register(const struct bt_bap_pacs_register_param *param);
119+
120+
/**
121+
* @brief Unregister the Published Audio Capability Service instance.
122+
*
123+
* @return 0 in case of success or negative value in case of error.
124+
*/
125+
int bt_pacs_unregister(void);
126+
74127
/**
75128
* @brief Register Published Audio Capability.
76129
*

samples/bluetooth/bap_broadcast_sink/src/main.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,8 +1272,13 @@ static struct bt_le_per_adv_sync_cb bap_pa_sync_cb = {
12721272
.term = bap_pa_sync_terminated_cb,
12731273
};
12741274

1275+
12751276
static int init(void)
12761277
{
1278+
const struct bt_bap_pacs_register_param pacs_param = {
1279+
.snk_pac = true,
1280+
.snk_loc = true,
1281+
};
12771282
int err;
12781283

12791284
err = bt_enable(NULL);
@@ -1284,6 +1289,12 @@ static int init(void)
12841289

12851290
printk("Bluetooth initialized\n");
12861291

1292+
err = bt_pacs_register(&pacs_param);
1293+
if (err) {
1294+
printk("Could not register PACS (err %d)\n", err);
1295+
return err;
1296+
}
1297+
12871298
err = bt_pacs_cap_register(BT_AUDIO_DIR_SINK, &cap);
12881299
if (err) {
12891300
printk("Capability register failed (err %d)\n", err);

samples/bluetooth/bap_unicast_server/src/main.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,9 +721,16 @@ static int set_available_contexts(void)
721721
return 0;
722722
}
723723

724+
724725
int main(void)
725726
{
726727
struct bt_le_ext_adv *adv;
728+
const struct bt_bap_pacs_register_param pacs_param = {
729+
.snk_pac = true,
730+
.snk_loc = true,
731+
.src_pac = true,
732+
.src_loc = true
733+
};
727734
int err;
728735

729736
err = bt_enable(NULL);
@@ -734,6 +741,12 @@ int main(void)
734741

735742
printk("Bluetooth initialized\n");
736743

744+
err = bt_pacs_register(&pacs_param);
745+
if (err) {
746+
printk("Could not register PACS (err %d)\n", err);
747+
return 0;
748+
}
749+
737750
bt_bap_unicast_server_register(&param);
738751
bt_bap_unicast_server_register_cb(&unicast_server_cb);
739752

samples/bluetooth/cap_acceptor/src/main.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ static int init_cap_acceptor(void)
256256
static const struct bt_audio_codec_cap lc3_codec_cap = BT_AUDIO_CODEC_CAP_LC3(
257257
SUPPORTED_FREQ, SUPPORTED_DURATION, MAX_CHAN_PER_STREAM, MIN_SDU, MAX_SDU,
258258
FRAMES_PER_SDU, (SINK_CONTEXT | SOURCE_CONTEXT));
259+
const struct bt_bap_pacs_register_param pacs_param = {
260+
.snk_pac = true,
261+
.snk_loc = true,
262+
.src_pac = true,
263+
.src_loc = true
264+
};
259265
int err;
260266

261267
err = bt_enable(NULL);
@@ -267,6 +273,12 @@ static int init_cap_acceptor(void)
267273

268274
LOG_INF("Bluetooth initialized");
269275

276+
err = bt_pacs_register(&pacs_param);
277+
if (err) {
278+
LOG_ERR("Could not register PACS (err %d)", err);
279+
return 0;
280+
}
281+
270282
if (IS_ENABLED(CONFIG_BT_PAC_SNK)) {
271283
static struct bt_pacs_cap sink_cap = {
272284
.codec_cap = &lc3_codec_cap,

samples/bluetooth/hap_ha/src/bap_unicast_sr.c

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,20 @@ static struct bt_pacs_cap cap_source = {
405405

406406
int bap_unicast_sr_init(void)
407407
{
408+
const struct bt_bap_pacs_register_param pacs_param = {
409+
.snk_pac = true,
410+
.snk_loc = true,
411+
.src_pac = true,
412+
.src_loc = true
413+
};
414+
int err;
415+
416+
err = bt_pacs_register(&pacs_param);
417+
if (err) {
418+
printk("Could not register PACS (err %d)\n", err);
419+
return err;
420+
}
421+
408422
bt_bap_unicast_server_register(&param);
409423
bt_bap_unicast_server_register_cb(&unicast_server_cb);
410424

samples/bluetooth/tmap_bmr/src/bap_broadcast_sink.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,8 +313,18 @@ static int reset(void)
313313

314314
int bap_broadcast_sink_init(void)
315315
{
316+
const struct bt_bap_pacs_register_param pacs_param = {
317+
.snk_pac = true,
318+
.snk_loc = true,
319+
};
316320
int err;
317321

322+
err = bt_pacs_register(&pacs_param);
323+
if (err) {
324+
printk("Could not register PACS (err %d)\n", err);
325+
return err;
326+
}
327+
318328
bt_bap_broadcast_sink_register_cb(&broadcast_sink_cbs);
319329
bt_le_per_adv_sync_cb_register(&broadcast_sync_cb);
320330

samples/bluetooth/tmap_peripheral/src/bap_unicast_sr.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,8 +367,23 @@ static struct bt_pacs_cap cap = {
367367
.codec_cap = &lc3_codec_cap,
368368
};
369369

370+
370371
int bap_unicast_sr_init(void)
371372
{
373+
const struct bt_bap_pacs_register_param pacs_param = {
374+
.snk_pac = true,
375+
.snk_loc = true,
376+
.src_pac = true,
377+
.src_loc = true
378+
};
379+
int err;
380+
381+
err = bt_pacs_register(&pacs_param);
382+
if (err) {
383+
printk("Could not register PACS (err %d)\n", err);
384+
return err;
385+
}
386+
372387
bt_bap_unicast_server_register(&param);
373388
bt_bap_unicast_server_register_cb(&unicast_server_cb);
374389

0 commit comments

Comments
 (0)