1 /* btp_bap_unicast.h - Bluetooth BAP Tester */
2 
3 /*
4  * Copyright (c) 2023 Codecoup
5  * Copyright (c) 2024 Nordic Semiconductor ASA
6  *
7  * SPDX-License-Identifier: Apache-2.0
8  */
9 
10 #include <stdbool.h>
11 #include <stddef.h>
12 #include <stdint.h>
13 
14 #include <zephyr/autoconf.h>
15 #include <zephyr/bluetooth/addr.h>
16 #include <zephyr/bluetooth/audio/audio.h>
17 #include <zephyr/bluetooth/audio/bap.h>
18 #include <zephyr/bluetooth/audio/cap.h>
19 #include <zephyr/sys/util.h>
20 
21 #include "btp_bap_audio_stream.h"
22 
23 #define BTP_BAP_UNICAST_MAX_SNK_STREAMS_COUNT MIN(CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT, \
24 						  CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT)
25 #define BTP_BAP_UNICAST_MAX_SRC_STREAMS_COUNT MIN(CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT, \
26 						  CONFIG_BT_ASCS_MAX_ASE_SRC_COUNT)
27 #define BTP_BAP_UNICAST_MAX_STREAMS_COUNT BTP_BAP_UNICAST_MAX_SNK_STREAMS_COUNT + \
28 					  BTP_BAP_UNICAST_MAX_SRC_STREAMS_COUNT
29 #define BTP_BAP_UNICAST_MAX_END_POINTS_COUNT CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT + \
30 					     CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT
31 
32 struct btp_bap_unicast_group {
33 	struct bt_bap_qos_cfg qos[CONFIG_BT_BAP_UNICAST_CLIENT_GROUP_STREAM_COUNT];
34 	struct bt_bap_unicast_group *cig;
35 	uint8_t cig_id;
36 	bool in_use;
37 };
38 
39 struct btp_bap_unicast_stream {
40 	struct btp_bap_audio_stream audio_stream;
41 	uint8_t ase_id;
42 	uint8_t conn_id;
43 	uint8_t cig_id;
44 	uint8_t cis_id;
45 	struct bt_audio_codec_cfg codec_cfg;
46 	bool already_sent;
47 	bool in_use;
48 };
49 
50 struct btp_bap_unicast_connection {
51 	bt_addr_le_t address;
52 	struct btp_bap_unicast_stream streams[BTP_BAP_UNICAST_MAX_STREAMS_COUNT];
53 	size_t configured_sink_stream_count;
54 	size_t configured_source_stream_count;
55 	struct bt_bap_ep *end_points[BTP_BAP_UNICAST_MAX_END_POINTS_COUNT];
56 	size_t end_points_count;
57 };
58 
59 int btp_bap_unicast_init(void);
60 struct btp_bap_unicast_connection *btp_bap_unicast_conn_get(size_t conn_index);
61 int btp_bap_unicast_group_create(uint8_t cig_id, struct btp_bap_unicast_group **out_unicast_group);
62 struct btp_bap_unicast_group *btp_bap_unicast_group_find(uint8_t cig_id);
63 struct bt_bap_ep *btp_bap_unicast_end_point_find(struct btp_bap_unicast_connection *conn,
64 						 uint8_t ase_id);
65 struct btp_bap_unicast_stream *btp_bap_unicast_stream_find(struct btp_bap_unicast_connection *conn,
66 							   uint8_t ase_id);
67 struct btp_bap_unicast_stream *btp_bap_unicast_stream_alloc(
68 	struct btp_bap_unicast_connection *conn);
69 void btp_bap_unicast_stream_free(struct btp_bap_unicast_stream *stream);
70 
71 uint8_t btp_bap_discover(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
72 
73 uint8_t btp_ascs_configure_codec(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
74 uint8_t btp_ascs_configure_qos(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
75 uint8_t btp_ascs_enable(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
76 uint8_t btp_ascs_receiver_start_ready(const void *cmd, uint16_t cmd_len,
77 				      void *rsp, uint16_t *rsp_len);
78 uint8_t btp_ascs_receiver_stop_ready(const void *cmd, uint16_t cmd_len,
79 				     void *rsp, uint16_t *rsp_len);
80 uint8_t btp_ascs_disable(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
81 uint8_t btp_ascs_release(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
82 uint8_t btp_ascs_update_metadata(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
83 uint8_t btp_ascs_add_ase_to_cis(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
84 uint8_t btp_ascs_preconfigure_qos(const void *cmd, uint16_t cmd_len, void *rsp, uint16_t *rsp_len);
85