MariuszSkamra commented on code in PR #1691:
URL: https://github.com/apache/mynewt-nimble/pull/1691#discussion_r1497290749


##########
nimble/host/services/audio/bass/src/ble_audio_svc_bass.c:
##########
@@ -0,0 +1,915 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+#include "host/ble_hs.h"
+#include "host/ble_gatt.h"
+#include "../../host/src/ble_gatt_priv.h"
+#include "../../host/src/ble_att_priv.h"
+#include "services/bass/ble_audio_svc_bass.h"
+#include "../../host/audio/include/host/audio/ble_audio_bsnk.h"
+
+#define EXPECTED_LEN_VARIABLE                                   (-1)
+#define BLE_SVC_AUDIO_BASS_RECEIVE_STATE_SRC_ID_NONE            0xFF
+#define BLE_SVC_AUDIO_BASS_RECEIVE_BIS_SYNC_STATE_ANY          0xFFFFFFFF
+
+enum ble_svc_audio_bass_ctrl_point_op_code {
+    BLE_AUDIO_SVC_BASS_REMOTE_SCAN_STOPPED,
+    BLE_AUDIO_SVC_BASS_REMOTE_SCAN_STARTED,
+    BLE_AUDIO_SVC_BASS_ADD_SOURCE,
+    BLE_AUDIO_SVC_BASS_MODIFY_SOURCE,
+    BLE_AUDIO_SVC_BASS_SET_BROADCAST_CODE,
+    BLE_AUDIO_SVC_BASS_REMOVE_SOURCE
+};
+
+typedef int ble_svc_audio_bass_ctrl_point_handler_cb(uint8_t *data, void *arg);
+
+static struct ble_svc_audio_bass_ctrl_point_ev {
+    ble_svc_audio_bass_ctrl_point_ev_fn *ctrl_point_ev_fn;
+    void *arg;
+} ctrl_point_ev;
+
+static struct ble_svc_audio_bass_receiver_state
+    receiver_states[MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX)] = {
+    [0 ... MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX) - 1] = {
+        .source_id = BLE_SVC_AUDIO_BASS_RECEIVE_STATE_SRC_ID_NONE
+    }
+};
+
+static struct ble_audio_event_listener ble_svc_audio_bass_audio_event_listener;
+
+static struct os_mempool ble_audio_svc_bass_metadata_pool;
+static os_membuf_t ble_audio_svc_bass_metadata_mem[
+    OS_MEMPOOL_SIZE(MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX) *
+                    
MYNEWT_VAL(BLE_SVC_AUDIO_BASS_MAX_SUBGROUPS_PER_RECV_STATE),
+                    MYNEWT_VAL(BLE_SVC_AUDIO_BASS_METADATA_MAX_SZ))];
+
+static int
+ble_svc_audio_bass_remote_scan_stopped(uint8_t *data, void *arg);
+static int
+ble_svc_audio_bass_remote_scan_started(uint8_t *data, void *arg);
+static int
+ble_svc_audio_bass_add_source(uint8_t *data, void *arg);
+static int
+ble_svc_audio_bass_modify_source(uint8_t *data, void *arg);
+static int
+ble_svc_audio_bass_set_broadcast_code(uint8_t *data, void *arg);
+static int
+ble_svc_audio_bass_remove_source(uint8_t *data, void *arg);
+
+static struct ble_svc_audio_bass_ctrl_point_handler {
+    uint8_t op_code;
+    int expected_len;
+    ble_svc_audio_bass_ctrl_point_handler_cb *handler_cb;
+} ble_svc_audio_bass_ctrl_point_handlers[] = {
+    {
+        .op_code = BLE_AUDIO_SVC_BASS_REMOTE_SCAN_STOPPED,
+        .expected_len = 0,
+        .handler_cb = ble_svc_audio_bass_remote_scan_stopped
+    }, {
+        .op_code = BLE_AUDIO_SVC_BASS_REMOTE_SCAN_STARTED,
+        .expected_len = 0,
+        .handler_cb = ble_svc_audio_bass_remote_scan_started
+    }, {
+        .op_code = BLE_AUDIO_SVC_BASS_ADD_SOURCE,
+        .expected_len = EXPECTED_LEN_VARIABLE,
+        .handler_cb = ble_svc_audio_bass_add_source
+    }, {
+        .op_code = BLE_AUDIO_SVC_BASS_MODIFY_SOURCE,
+        .expected_len = EXPECTED_LEN_VARIABLE,
+        .handler_cb = ble_svc_audio_bass_modify_source
+    }, {
+        .op_code = BLE_AUDIO_SVC_BASS_SET_BROADCAST_CODE,
+        .expected_len = 17,
+        .handler_cb = ble_svc_audio_bass_set_broadcast_code
+    }, {
+        .op_code = BLE_AUDIO_SVC_BASS_REMOVE_SOURCE,
+        .expected_len = 1,
+        .handler_cb = ble_svc_audio_bass_remove_source
+    }
+};
+
+static int
+ble_svc_audio_bass_access(uint16_t conn_handle, uint16_t attr_handle,
+                          struct ble_gatt_access_ctxt *ctxt, void *arg);
+
+static int
+ble_svc_audio_bass_ctrl_point_write_access(struct ble_gatt_access_ctxt *ctxt);
+static int
+ble_svc_audio_bass_rcv_state_read_access(struct ble_gatt_access_ctxt *ctxt, 
void *arg);
+
+static struct ble_gatt_chr_def 
ble_svc_audio_bass_chrs[MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX) + 2];
+
+static const struct ble_gatt_svc_def 
ble_svc_audio_bass_defs[MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX) + 2] = 
{
+    { /*** Service: Published Audio Capabilities Service (bass) */
+        .type = BLE_GATT_SVC_TYPE_PRIMARY,
+        .uuid = BLE_UUID16_DECLARE(BLE_SVC_AUDIO_BASS_UUID16),
+        .characteristics = ble_svc_audio_bass_chrs,
+    },
+    {
+        0, /* No more services. */
+    },
+};
+
+static int
+ble_svc_audio_bass_access(uint16_t conn_handle, uint16_t attr_handle,
+                          struct ble_gatt_access_ctxt *ctxt, void *arg)
+{
+    uint16_t uuid16 = ble_uuid_u16(ctxt->chr->uuid);
+    int rc;
+
+    switch (uuid16) {
+    case BLE_SVC_AUDIO_BASS_CHR_UUID16_BAS_CONTROL_POINT:
+        if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
+            rc = ble_svc_audio_bass_ctrl_point_write_access(ctxt);
+        } else {
+            assert(0);
+        }
+        return rc;
+    case BLE_SVC_AUDIO_BASS_CHR_UUID16_BROADCAST_RECEIVE_STATE:
+        if (ctxt->op == BLE_GATT_ACCESS_OP_READ_CHR) {
+            rc = ble_svc_audio_bass_rcv_state_read_access(ctxt, arg);
+        } else {
+            assert(0);
+        }
+        return rc;
+    default:
+        assert(0);
+    }
+}
+
+static uint8_t
+ble_svc_audio_bass_get_new_source_id()
+{
+    struct ble_svc_audio_bass_receiver_state *rcv_state;
+    struct ble_svc_audio_bass_receiver_state *next_rcv_state;
+    uint8_t free_source_id;
+    uint8_t highest_source_id = 0;
+    uint8_t lowest_source_id = BLE_SVC_AUDIO_BASS_RECEIVE_STATE_SRC_ID_NONE;
+
+    int i;
+
+    /* First characteristic is 
BLE_SVC_AUDIO_BASS_CHR_UUID16_BAS_CONTROL_POINT, iterate from 2nd */
+    for (i = 1; i <= MYNEWT_VAL(BLE_SVC_AUDIO_BASS_RECEIVE_STATE_MAX); i++) {
+        rcv_state = ble_svc_audio_bass_chrs[i].arg;
+        if (highest_source_id < rcv_state->source_id &&
+            rcv_state->source_id != 
BLE_SVC_AUDIO_BASS_RECEIVE_STATE_SRC_ID_NONE)
+        {
+            highest_source_id = rcv_state->source_id;
+        }
+
+        if (lowest_source_id > rcv_state->source_id) {
+            lowest_source_id = rcv_state->source_id;
+        }
+    }
+
+    if ((highest_source_id + 1) < 
BLE_SVC_AUDIO_BASS_RECEIVE_STATE_SRC_ID_NONE) {
+        return highest_source_id + 1;
+    }
+
+    return min(lowest_source_id + 1, 0);
+}
+
+static int
+ble_svc_audio_bass_remote_scan_stopped(uint8_t *data, void *arg)
+{
+    struct ble_svc_audio_bass_ctrl_point_event ev = {
+        .op = BLE_SVC_AUDIO_BASS_CTRL_POINT_EVENT_REMOTE_SCAN_STOPPED
+    };
+
+    if (ctrl_point_ev.ctrl_point_ev_fn) {
+        ctrl_point_ev.ctrl_point_ev_fn(&ev, ctrl_point_ev.arg);
+    }
+
+    return 0;
+}
+
+static int
+ble_svc_audio_bass_remote_scan_started(uint8_t *data, void *arg)
+{
+    struct ble_svc_audio_bass_ctrl_point_event ev = {
+        .op = BLE_SVC_AUDIO_BASS_CTRL_POINT_EVENT_REMOTE_SCAN_STARTED
+    };
+
+    if (ctrl_point_ev.ctrl_point_ev_fn) {
+        ctrl_point_ev.ctrl_point_ev_fn(&ev, ctrl_point_ev.arg);
+    }
+
+    return 0;
+}
+
+static int
+ble_svc_audio_bass_create_bsnk(ble_addr_t *addr, uint8_t sid,
+                               uint32_t broadcast_id, uint16_t pa_itvl,
+                               struct ble_audio_bsnk **out_bsnk)
+{
+    struct ble_audio_bsnk_create_params bsnk_create_params;
+
+    bsnk_create_params.adv_addr = addr;
+    bsnk_create_params.adv_sid = sid;
+    bsnk_create_params.broadcast_id = broadcast_id;
+    bsnk_create_params.pa_interval = pa_itvl;
+
+    return ble_audio_bsnk_create(&bsnk_create_params, out_bsnk);

Review Comment:
   This should be an event, since Scan Delegator can be standalone proxy.
   3.1. BAP role support requirements BAP 1.0 states that Broadcast Sink is 
dependent on Scan Delegator.
   



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@mynewt.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to