szymon-czapracki commented on code in PR #1747:
URL: https://github.com/apache/mynewt-nimble/pull/1747#discussion_r1567416904


##########
apps/bttester/src/btp_pacs.c:
##########
@@ -0,0 +1,300 @@
+/*
+ * 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.
+ */
+
+/* btp_pacs.c - Bluetooth Published Audio Capacity Service Tester */
+
+#include "audio/ble_audio.h"
+#include "audio/ble_audio_codec.h"
+#include "host/ble_gap.h"
+#include "syscfg/syscfg.h"
+#include <stdint.h>
+
+#if MYNEWT_VAL(BLE_AUDIO)
+
+#include "btp/btp.h"
+#include "btp/btp_pacs.h"
+#include "services/pacs/ble_audio_svc_pacs.h"
+#include "services/pacs/ble_audio_svc_pacs_lc3.h"
+
+#define BLE_SVC_AUDIO_PACS_LC3_CODEC_ID             0x06
+
+struct set_avail_cb_data {
+    uint16_t src_ctxts;
+    uint16_t snk_ctxts;
+};
+
+#ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SNK_METADATA
+static uint8_t ble_svc_audio_pacs_lc3_snk_metadata[] =
+{ UNMANGLE_MYNEWT_VAL(MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_METADATA)) };
+#endif
+
+static uint8_t ble_svc_audio_pacs_lc3_snk_codec_spec_caps[] = 
BLE_AUDIO_BUILD_CODEC_CAPS(
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_SAMPLING_FREQUENCIES),
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_FRAME_DURATIONS),
+    #ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SRC_AUDIO_CHANNEL_COUNTS
+        MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_AUDIO_CHANNEL_COUNTS),
+    #else
+    ,
+    #endif
+        MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_MIN_OCTETS_PER_CODEC_FRAME),
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_MAX_OCTETS_PER_CODEC_FRAME),
+    #ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SRC_MAX_CODEC_FRAMES_PER_SDU
+        MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_MAX_CODEC_FRAMES_PER_SDU),
+    #endif
+);
+
+static uint8_t ble_svc_audio_pacs_lc3_src_codec_spec_caps[] = 
BLE_AUDIO_BUILD_CODEC_CAPS(
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_SAMPLING_FREQUENCIES),
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_FRAME_DURATIONS),
+#ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SRC_AUDIO_CHANNEL_COUNTS
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_AUDIO_CHANNEL_COUNTS),
+#else
+    ,
+#endif
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_MIN_OCTETS_PER_CODEC_FRAME),
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_MAX_OCTETS_PER_CODEC_FRAME),
+#ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SRC_MAX_CODEC_FRAMES_PER_SDU
+    MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_MAX_CODEC_FRAMES_PER_SDU),
+#endif
+);
+
+static struct ble_audio_codec_register_params snk_codec_params = {
+    .codec_id = {
+        .format = BLE_SVC_AUDIO_PACS_LC3_CODEC_ID,
+        .company_id = 0x00,
+        .vendor_specific = 0x00
+    },
+    .codec_spec_caps_len = sizeof(ble_svc_audio_pacs_lc3_snk_codec_spec_caps),
+    .codec_spec_caps = ble_svc_audio_pacs_lc3_snk_codec_spec_caps,
+#ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SNK_METADATA
+    .metadata_len = sizeof(ble_svc_audio_pacs_lc3_snk_metadata),
+    .metadata = ble_svc_audio_pacs_lc3_snk_metadata,
+#else
+    .metadata_len = 0,
+#endif
+
+    .direction = BLE_AUDIO_CODEC_DIR_SINK_BIT
+};
+
+static struct ble_audio_codec_register_params src_codec_params = {
+    .codec_id = {
+        .format = BLE_SVC_AUDIO_PACS_LC3_CODEC_ID,
+        .company_id = 0x00,
+        .vendor_specific = 0x00
+    },
+    .codec_spec_caps_len = sizeof(ble_svc_audio_pacs_lc3_src_codec_spec_caps),
+    .codec_spec_caps = ble_svc_audio_pacs_lc3_src_codec_spec_caps,
+#ifdef MYNEWT_VAL_BLE_SVC_AUDIO_PACS_LC3_SRC_METADATA
+    .metadata_len = sizeof(ble_svc_audio_pacs_lc3_src_metadata),
+    .metadata = ble_svc_audio_pacs_lc3_src_metadata,
+#else
+    .metadata_len = 0,
+#endif
+    .direction = BLE_AUDIO_CODEC_DIR_SOURCE_BIT
+};
+
+int
+set_available(uint16_t conn_handle, void *arg)
+{
+    int rc;
+    struct set_avail_cb_data *avail_data = 
+        (struct set_avail_cb_data *) arg;
+
+    rc = ble_svc_audio_pacs_avail_contexts_set(conn_handle,
+                                               avail_data->snk_ctxts,
+                                               avail_data->src_ctxts);
+    if (rc) {
+        return BTP_STATUS_FAILED;
+    }
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+pacs_set_available_contexts()
+{
+    struct set_avail_cb_data cb_data;
+
+    cb_data.snk_ctxts = BLE_AUDIO_CONTEXT_TYPE_MEDIA;
+    cb_data.src_ctxts = BLE_AUDIO_CONTEXT_TYPE_MEDIA;
+
+    ble_gap_conn_foreach_handle(set_available, (void *)&cb_data);
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+pacs_set_snk_location()
+{
+    int rc;
+    struct ble_svc_audio_pacs_set_param snk_params = {
+        .audio_locations = 0,
+        .supported_contexts = 
MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_SUP_CONTEXTS)
+    };
+
+    rc = ble_svc_audio_pacs_set(BLE_AUDIO_CODEC_DIR_SINK_BIT, &snk_params);
+    if (rc) {
+        return BTP_STATUS_FAILED;
+    }
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+pacs_set_src_location()
+{
+    int rc;
+    struct ble_svc_audio_pacs_set_param src_params = {
+        .audio_locations = 0,
+        .supported_contexts = 
MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_SUP_CONTEXTS)
+    };
+
+    rc = ble_svc_audio_pacs_set(BLE_AUDIO_CODEC_DIR_SOURCE_BIT, &src_params);
+    if (rc) {
+        return BTP_STATUS_FAILED;
+    }
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+pacs_update_characteristic(const void *cmd, uint16_t cmd_len,
+                           void *rsp, uint16_t *rsp_len)
+{
+    int rc;
+    const struct pacs_update_characteristic_cmd *char_cmd = cmd;
+
+    switch (char_cmd->char_id) {
+        case BTP_PACS_CHARACTERISTIC_SINK_PAC:
+            rc = ble_audio_codec_register(&snk_codec_params, NULL);
+            if (rc) {
+                return BTP_STATUS_FAILED;
+            }
+        case BTP_PACS_CHARACTERISTIC_SOURCE_PAC:
+            rc = ble_audio_codec_register(&src_codec_params, NULL);
+            if (rc) {
+                return BTP_STATUS_FAILED;
+            }
+        case BTP_PACS_CHARACTERISTIC_SINK_AUDIO_LOCATIONS:
+            rc = pacs_set_snk_location();
+            if (rc) {
+                return BTP_STATUS_FAILED;
+            }
+        case BTP_PACS_CHARACTERISTIC_SOURCE_AUDIO_LOCATIONS:
+            rc = pacs_set_src_location();
+            if (rc) {
+                return BTP_STATUS_FAILED;
+            }
+        case BTP_PACS_CHARACTERISTIC_AVAILABLE_AUDIO_CONTEXTS:
+            rc = pacs_set_available_contexts();
+            if (rc) {
+                return BTP_STATUS_FAILED;
+            }
+        default:
+            return BTP_STATUS_FAILED;
+    }
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+pacs_set_supported_contexts(const void *cmd, uint16_t cmd_len,
+                            void *rsp, uint16_t *rsp_len)
+{
+    int rc;
+
+    struct ble_svc_audio_pacs_set_param src_params = {
+        .audio_locations = 
MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SRC_AUDIO_LOCATIONS),
+        .supported_contexts = 0
+    };
+    struct ble_svc_audio_pacs_set_param snk_params = {
+        .audio_locations = 
MYNEWT_VAL(BLE_SVC_AUDIO_PACS_LC3_SNK_SUP_AUDIO_LOCATIONS),
+        .supported_contexts = 0
+    };
+
+    rc = ble_svc_audio_pacs_set(BLE_AUDIO_CODEC_DIR_SOURCE_BIT, &src_params);
+    if (rc) {
+        return BTP_STATUS_FAILED;
+    }
+
+    rc = ble_svc_audio_pacs_set(BLE_AUDIO_CODEC_DIR_SINK_BIT, &snk_params);
+    if (rc) {
+        return BTP_STATUS_FAILED;
+    }
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static uint8_t
+supported_commands(const void *cmd, uint16_t cmd_len,
+                   void *rsp, uint16_t *rsp_len)
+{
+    struct btp_pacs_read_supported_commands_rp *rp = rsp;
+
+    /* octet 0 */
+    tester_set_bit(rp->data, BTP_PACS_READ_SUPPORTED_COMMANDS);
+    tester_set_bit(rp->data, BTP_PACS_UPDATE_CHARACTERISTIC);
+    tester_set_bit(rp->data, BTP_PACS_SET_LOCATION);
+    tester_set_bit(rp->data, BTP_PACS_SET_AVAILABLE_CONTEXTS);
+    tester_set_bit(rp->data, BTP_PACS_SET_SUPPORTED_CONTEXTS);
+
+    *rsp_len = sizeof(*rp) + 2;
+
+    return BTP_STATUS_SUCCESS;
+}
+
+static const struct btp_handler handlers[] = {
+    {
+        .opcode = BTP_PACS_READ_SUPPORTED_COMMANDS,
+        .expect_len = 0,
+        .func = supported_commands,
+    },
+    {
+        .opcode = BTP_PACS_UPDATE_CHARACTERISTIC,
+        .expect_len = BTP_HANDLER_LENGTH_VARIABLE,
+        .func = pacs_update_characteristic,
+    },
+    {
+        .opcode = BTP_PACS_SET_AVAILABLE_CONTEXTS,
+        .expect_len = BTP_HANDLER_LENGTH_VARIABLE,

Review Comment:
   Done



-- 
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