This is an automated email from the ASF dual-hosted git repository.

kopyscinski pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mynewt-nimble.git


The following commit(s) were added to refs/heads/master by this push:
     new 301cc998b host/audio/pacs: fix notifications for available contexts
301cc998b is described below

commit 301cc998b6ca5c51cafd2f39bc5843c07a1002ff
Author: Krzysztof Kopyściński <krzysztof.kopyscin...@codecoup.pl>
AuthorDate: Thu Apr 11 10:24:16 2024 +0200

    host/audio/pacs: fix notifications for available contexts
    
    Available contexts values are per connection. When value is changed, read
    access for notification gives BLE_HS_CONN_HANDLE_NONE as conn handle.
    This was making impossible to fetch the right value.
    Now, flag was introduced, for marking the changed value.
---
 .../audio/services/pacs/src/ble_audio_svc_pacs.c   | 23 ++++++++++++++++++----
 1 file changed, 19 insertions(+), 4 deletions(-)

diff --git a/nimble/host/audio/services/pacs/src/ble_audio_svc_pacs.c 
b/nimble/host/audio/services/pacs/src/ble_audio_svc_pacs.c
index 25b2e0490..eb3a9244e 100644
--- a/nimble/host/audio/services/pacs/src/ble_audio_svc_pacs.c
+++ b/nimble/host/audio/services/pacs/src/ble_audio_svc_pacs.c
@@ -29,6 +29,7 @@ static struct available_ctx {
     uint16_t conn_handle;
     uint16_t ble_svc_audio_pacs_avail_sink_contexts;
     uint16_t ble_svc_audio_pacs_avail_source_contexts;
+    uint8_t val_changed;
 }  ble_svc_audio_pacs_avail_contexts[MYNEWT_VAL(BLE_MAX_CONNECTIONS)] = {
     [0 ... MYNEWT_VAL(BLE_MAX_CONNECTIONS) - 1] = {
         .conn_handle = BLE_HS_CONN_HANDLE_NONE,
@@ -253,12 +254,20 @@ static int
 ble_svc_audio_pacs_avail_audio_ctx_read_access(uint16_t conn_handle,
                                                struct ble_gatt_access_ctxt 
*ctxt)
 {
-    struct available_ctx *avail_ctx;
+    struct available_ctx *avail_ctx = NULL;
     uint8_t *buf;
+    int i;
 
-    avail_ctx = ble_svc_audio_pacs_find_avail_ctx(conn_handle);
-    if (!avail_ctx) {
-        return BLE_HS_ENOENT;
+    if (conn_handle == BLE_HS_CONN_HANDLE_NONE) {
+        for (i = 0; i < MYNEWT_VAL(BLE_MAX_CONNECTIONS); i++) {
+            if (ble_svc_audio_pacs_avail_contexts[i].val_changed) {
+                avail_ctx = &ble_svc_audio_pacs_avail_contexts[i];
+                avail_ctx->val_changed = false;
+                break;
+            }
+        }
+    } else {
+        avail_ctx = ble_svc_audio_pacs_find_avail_ctx(conn_handle);
     }
 
     buf = os_mbuf_extend(ctxt->om, 4);
@@ -266,6 +275,11 @@ ble_svc_audio_pacs_avail_audio_ctx_read_access(uint16_t 
conn_handle,
         return BLE_ATT_ERR_INSUFFICIENT_RES;
     }
 
+    if (!avail_ctx) {
+        put_le32(buf + 0, 0);
+        return 0;
+    }
+
     put_le16(buf + 0, avail_ctx->ble_svc_audio_pacs_avail_sink_contexts);
     put_le16(buf + 2, avail_ctx->ble_svc_audio_pacs_avail_source_contexts);
 
@@ -409,6 +423,7 @@ ble_svc_audio_pacs_avail_contexts_set(uint16_t conn_handle,
 
     avail_ctx->ble_svc_audio_pacs_avail_sink_contexts = sink_contexts;
     avail_ctx->ble_svc_audio_pacs_avail_source_contexts = source_contexts;
+    avail_ctx->val_changed = true;
 
     return pac_notify(BLE_SVC_AUDIO_PACS_CHR_UUID16_AVAILABLE_AUDIO_CONTEXTS);
 }

Reply via email to