@@ -55,20 +55,20 @@ struct pacs {
55
55
sys_slist_t list ;
56
56
};
57
57
58
- #if defined(CONFIG_BT_PAC_SNK )
58
+ #if defined(CONTIG_BT_PAC_SNK )
59
59
static uint16_t snk_available_contexts ;
60
- static const uint16_t snk_supported_contexts = CONFIG_BT_PACS_SNK_CONTEXT ;
60
+ static uint16_t snk_supported_contexts ;
61
61
#else
62
- static const uint16_t snk_available_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
63
- static const uint16_t snk_supported_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
62
+ static uint16_t snk_available_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
63
+ static uint16_t snk_supported_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
64
64
#endif /* CONFIG_BT_PAC_SNK */
65
65
66
66
#if defined(CONFIG_BT_PAC_SRC )
67
67
static uint16_t src_available_contexts ;
68
- static const uint16_t src_supported_contexts = CONFIG_BT_PACS_SRC_CONTEXT ;
68
+ static uint16_t src_supported_contexts ;
69
69
#else
70
- static const uint16_t src_available_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
71
- static const uint16_t src_supported_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
70
+ static uint16_t src_available_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
71
+ static uint16_t src_supported_contexts = BT_AUDIO_CONTEXT_TYPE_PROHIBITED ;
72
72
#endif /* CONFIG_BT_PAC_SRC */
73
73
74
74
NET_BUF_SIMPLE_DEFINE_STATIC (read_buf , CONFIG_BT_L2CAP_TX_MTU );
@@ -231,10 +231,12 @@ static ssize_t supported_context_read(struct bt_conn *conn,
231
231
}
232
232
233
233
static void available_contexts_notify (struct k_work * work );
234
+ static void supported_contexts_notify (struct k_work * work );
234
235
static K_WORK_DELAYABLE_DEFINE (available_contexts_work , available_contexts_notify ) ;
236
+ static K_WORK_DELAYABLE_DEFINE (supported_contexts_work , supported_contexts_notify ) ;
235
237
236
238
static int set_available_contexts (uint16_t contexts , uint16_t * available ,
237
- const uint16_t supported )
239
+ uint16_t supported )
238
240
{
239
241
int err ;
240
242
@@ -246,13 +248,45 @@ static int set_available_contexts(uint16_t contexts, uint16_t *available,
246
248
return 0 ;
247
249
}
248
250
251
+ err = k_work_reschedule (& available_contexts_work , PAC_NOTIFY_TIMEOUT );
252
+ if (err < 0 ) {
253
+ return err ;
254
+ }
255
+
249
256
* available = contexts ;
250
257
251
- err = k_work_reschedule (& available_contexts_work , PAC_NOTIFY_TIMEOUT );
258
+ return 0 ;
259
+ }
260
+
261
+ static int set_supported_contexts (uint16_t contexts , uint16_t * supported ,
262
+ uint16_t * available )
263
+ {
264
+ int err ;
265
+
266
+ /* Ensure unspecified is always supported */
267
+ contexts |= BT_AUDIO_CONTEXT_TYPE_UNSPECIFIED ;
268
+
269
+ if (* supported == contexts ) {
270
+ return 0 ;
271
+ }
272
+
273
+ err = k_work_reschedule (& supported_contexts_work , PAC_NOTIFY_TIMEOUT );
252
274
if (err < 0 ) {
253
275
return err ;
254
276
}
255
277
278
+ * supported = contexts ;
279
+
280
+ /* Update available contexts if needed*/
281
+ if ((contexts & * available ) != * available ) {
282
+ * available = * available & contexts ;
283
+ err = k_work_reschedule (& available_contexts_work ,
284
+ PAC_NOTIFY_TIMEOUT );
285
+ if (err < 0 ) {
286
+ LOG_WRN ("Update available contexts notify failed: %d" , err );
287
+ }
288
+ }
289
+
256
290
return 0 ;
257
291
}
258
292
@@ -281,11 +315,22 @@ static inline int set_snk_available_contexts(uint16_t contexts)
281
315
return set_available_contexts (contexts , & snk_available_contexts ,
282
316
snk_supported_contexts );
283
317
}
318
+
319
+ static inline int set_snk_supported_contexts (uint16_t contexts )
320
+ {
321
+ return set_supported_contexts (contexts , & snk_supported_contexts ,
322
+ & snk_available_contexts );
323
+ }
284
324
#else
285
325
static inline int set_snk_available_contexts (uint16_t contexts )
286
326
{
287
327
return - ENOTSUP ;
288
328
}
329
+
330
+ static inline int set_snk_supported_contexts (uint16_t contexts )
331
+ {
332
+ return - ENOTSUP ;
333
+ }
289
334
#endif /* CONFIG_BT_PAC_SNK */
290
335
291
336
#if defined(CONFIG_BT_PAC_SNK_LOC )
@@ -385,11 +430,22 @@ static inline int set_src_available_contexts(uint16_t contexts)
385
430
return set_available_contexts (contexts , & src_available_contexts ,
386
431
src_supported_contexts );
387
432
}
433
+
434
+ static inline int set_src_supported_contexts (uint16_t contexts )
435
+ {
436
+ return set_supported_contexts (contexts , & src_supported_contexts ,
437
+ & snk_supported_contexts );
438
+ }
388
439
#else
389
440
static inline int set_src_available_contexts (uint16_t contexts )
390
441
{
391
442
return - ENOTSUP ;
392
443
}
444
+
445
+ static inline int set_src_supported_contexts (uint16_t contexts )
446
+ {
447
+ return - ENOTSUP ;
448
+ }
393
449
#endif /* CONFIG_BT_PAC_SRC */
394
450
395
451
#if defined(CONFIG_BT_PAC_SRC_LOC )
@@ -602,6 +658,21 @@ static void available_contexts_notify(struct k_work *work)
602
658
}
603
659
}
604
660
661
+ static void supported_contexts_notify (struct k_work * work )
662
+ {
663
+ struct bt_pacs_context context = {
664
+ .snk = sys_cpu_to_le16 (snk_supported_contexts ),
665
+ .src = sys_cpu_to_le16 (src_supported_contexts ),
666
+ };
667
+ int err ;
668
+
669
+ err = bt_gatt_notify_uuid (NULL , BT_UUID_PACS_SUPPORTED_CONTEXT , pacs_svc .attrs ,
670
+ & context , sizeof (context ));
671
+ if (err != 0 && err != - ENOTCONN ) {
672
+ LOG_WRN ("Supported Audio Contexts notify failed: %d" , err );
673
+ }
674
+ }
675
+
605
676
bool bt_pacs_context_available (enum bt_audio_dir dir , uint16_t context )
606
677
{
607
678
if (dir == BT_AUDIO_DIR_SOURCE ) {
@@ -722,6 +793,18 @@ int bt_pacs_set_available_contexts(enum bt_audio_dir dir, enum bt_audio_context
722
793
return - EINVAL ;
723
794
}
724
795
796
+ int bt_pacs_set_supported_contexts (enum bt_audio_dir dir , enum bt_audio_context contexts )
797
+ {
798
+ switch (dir ) {
799
+ case BT_AUDIO_DIR_SINK :
800
+ return set_snk_supported_contexts (contexts );
801
+ case BT_AUDIO_DIR_SOURCE :
802
+ return set_src_supported_contexts (contexts );
803
+ }
804
+
805
+ return - EINVAL ;
806
+ }
807
+
725
808
enum bt_audio_context bt_pacs_get_available_contexts (enum bt_audio_dir dir )
726
809
{
727
810
switch (dir ) {
0 commit comments