Line data Source code
1 1 : /**
2 : * @file
3 : * @brief Header for Bluetooth Gaming Audio Profile (GMAP).
4 : *
5 : * Copyright (c) 2023-2024 Nordic Semiconductor ASA
6 : *
7 : * SPDX-License-Identifier: Apache-2.0
8 : */
9 :
10 : #ifndef ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_GMAP_
11 : #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_GMAP_
12 :
13 : /**
14 : * @brief Bluetooth Gaming Audio Profile (GMAP)
15 : *
16 : * @defgroup bt_gmap Bluetooth Gaming Audio Profile
17 : *
18 : * @since 3.5
19 : * @version 0.8.0
20 : *
21 : * @ingroup bluetooth
22 : * @{
23 : */
24 :
25 : #include <zephyr/bluetooth/conn.h>
26 : #include <zephyr/sys/util_macro.h>
27 :
28 : #ifdef __cplusplus
29 : extern "C" {
30 : #endif
31 :
32 : /** Gaming Role bitfield */
33 1 : enum bt_gmap_role {
34 : /**
35 : * @brief Gaming Role Unicast Game Gateway
36 : *
37 : * Requires @kconfig{CONFIG_BT_CAP_INITIATOR}, @kconfig{CONFIG_BT_BAP_UNICAST_CLIENT} and
38 : * @kconfig{CONFIG_BT_VCP_VOL_CTLR} to be enabled.
39 : */
40 : BT_GMAP_ROLE_UGG = BIT(0),
41 : /**
42 : * @brief Gaming Role Unicast Game Terminal
43 : *
44 : * Requires @kconfig{CONFIG_BT_CAP_ACCEPTOR} and @kconfig{CONFIG_BT_BAP_UNICAST_SERVER} to
45 : * be enabled.
46 : */
47 : BT_GMAP_ROLE_UGT = BIT(1),
48 : /**
49 : * @brief Gaming Role Broadcast Game Sender
50 : *
51 : * Requires @kconfig{CONFIG_BT_CAP_INITIATOR} and @kconfig{CONFIG_BT_BAP_BROADCAST_SOURCE}
52 : * to be enabled.
53 : */
54 : BT_GMAP_ROLE_BGS = BIT(2),
55 : /**
56 : * @brief Gaming Role Broadcast Game Receiver
57 : *
58 : * Requires @kconfig{CONFIG_BT_CAP_ACCEPTOR}, @kconfig{CONFIG_BT_BAP_BROADCAST_SINK} and
59 : * @kconfig{CONFIG_BT_VCP_VOL_REND} to be enabled.
60 : */
61 : BT_GMAP_ROLE_BGR = BIT(3),
62 : };
63 :
64 : /** Unicast Game Gateway Feature bitfield */
65 1 : enum bt_gmap_ugg_feat {
66 : /**
67 : * @brief Support transmitting multiple LC3 codec frames per block in an SDU
68 : *
69 : * Requires @kconfig{CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT} > 0
70 : */
71 : BT_GMAP_UGG_FEAT_MULTIPLEX = BIT(0),
72 : /**
73 : * @brief 96 kbps source support
74 : *
75 : * Requires @kconfig{CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SRC_COUNT} > 0
76 : */
77 : BT_GMAP_UGG_FEAT_96KBPS_SOURCE = BIT(1),
78 : /**
79 : * @brief Support for receiving at least two channels of audio, each in a separate CIS
80 : *
81 : * Requires @kconfig{CONFIG_BT_BAP_UNICAST_CLIENT_ASE_SNK_COUNT} > 1 and
82 : * @kconfig{CONFIG_BT_BAP_UNICAST_CLIENT_GROUP_STREAM_COUNT} > 1
83 : */
84 : BT_GMAP_UGG_FEAT_MULTISINK = BIT(2),
85 : };
86 :
87 : /** Unicast Game Terminal Feature bitfield */
88 1 : enum bt_gmap_ugt_feat {
89 : /**
90 : * @brief Source support
91 : *
92 : * Requires @kconfig{CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT} > 0
93 : */
94 : BT_GMAP_UGT_FEAT_SOURCE = BIT(0),
95 : /**
96 : * @brief 80 kbps source support
97 : *
98 : * Requires BT_GMAP_UGT_FEAT_SOURCE to be set as well
99 : */
100 : BT_GMAP_UGT_FEAT_80KBPS_SOURCE = BIT(1),
101 : /**
102 : * @brief Sink support
103 : *
104 : * Requires @kconfig{CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT} > 0
105 : */
106 : BT_GMAP_UGT_FEAT_SINK = BIT(2),
107 : /**
108 : * @brief 64 kbps sink support
109 : *
110 : * Requires BT_GMAP_UGT_FEAT_SINK to be set as well
111 : */
112 : BT_GMAP_UGT_FEAT_64KBPS_SINK = BIT(3),
113 : /**
114 : * @brief Support for receiving multiple LC3 codec frames per block in an SDU
115 : *
116 : * Requires BT_GMAP_UGT_FEAT_SINK to be set as well
117 : */
118 : BT_GMAP_UGT_FEAT_MULTIPLEX = BIT(4),
119 : /**
120 : * @brief Support for receiving at least two audio channels, each in a separate CIS
121 : *
122 : * Requires @kconfig{CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT} > 1 and
123 : * @kconfig{CONFIG_BT_ASCS_MAX_ACTIVE_ASES} > 1, and BT_GMAP_UGT_FEAT_SINK to be set as well
124 : */
125 : BT_GMAP_UGT_FEAT_MULTISINK = BIT(5),
126 : /**
127 : * @brief Support for sending at least two audio channels, each in a separate CIS
128 : *
129 : * Requires @kconfig{CONFIG_BT_ASCS_MAX_ASE_SNK_COUNT} > 1 and
130 : * @kconfig{CONFIG_BT_ASCS_MAX_ACTIVE_ASES} > 1, and BT_GMAP_UGT_FEAT_SOURCE to be set
131 : * as well
132 : */
133 : BT_GMAP_UGT_FEAT_MULTISOURCE = BIT(6),
134 : };
135 :
136 : /** Broadcast Game Sender Feature bitfield */
137 1 : enum bt_gmap_bgs_feat {
138 : /** 96 kbps support */
139 : BT_GMAP_BGS_FEAT_96KBPS = BIT(0),
140 : };
141 :
142 : /** Broadcast Game Receiver Feature bitfield */
143 1 : enum bt_gmap_bgr_feat {
144 : /**
145 : * @brief Support for receiving at least two audio channels, each in a separate BIS
146 : *
147 : * Requires @kconfig{CONFIG_BT_BAP_BROADCAST_SNK_STREAM_COUNT} > 1
148 : */
149 : BT_GMAP_BGR_FEAT_MULTISINK = BIT(0),
150 : /** @brief Support for receiving multiple LC3 codec frames per block in an SDU */
151 : BT_GMAP_BGR_FEAT_MULTIPLEX = BIT(1),
152 : };
153 :
154 : /** Broadcast Game Receiver Feature bitfield */
155 1 : struct bt_gmap_feat {
156 : /** Unicast Game Gateway features */
157 1 : enum bt_gmap_ugg_feat ugg_feat;
158 : /** Unicast Game Terminal features */
159 1 : enum bt_gmap_ugt_feat ugt_feat;
160 : /** Remote Broadcast Game Sender features */
161 1 : enum bt_gmap_bgs_feat bgs_feat;
162 : /** Remote Broadcast Game Receiver features */
163 1 : enum bt_gmap_bgr_feat bgr_feat;
164 : };
165 :
166 : /** @brief Hearing Access Service Client callback structure. */
167 1 : struct bt_gmap_cb {
168 : /**
169 : * @brief Callback function for bt_has_discover.
170 : *
171 : * This callback is called when discovery procedure is complete.
172 : *
173 : * @param conn Bluetooth connection object.
174 : * @param err 0 on success, ATT error or negative errno otherwise.
175 : * @param role Role of remote device. 0 on failure.
176 : * @param features Remote features.
177 : */
178 1 : void (*discover)(struct bt_conn *conn, int err, enum bt_gmap_role role,
179 : struct bt_gmap_feat features);
180 : };
181 :
182 : /**
183 : * @brief Registers the callbacks used by the Gaming Audio Profile.
184 : *
185 : * @param cb The callback structure.
186 : *
187 : * @retval -EINVAL if @p cb is NULL
188 : * @retval -EALREADY if callbacks have already be registered
189 : * @retval 0 on success
190 : */
191 1 : int bt_gmap_cb_register(const struct bt_gmap_cb *cb);
192 :
193 : /**
194 : * @brief Discover Gaming Service on a remote device.
195 : *
196 : * Procedure to find a Gaming Service on a server identified by @p conn.
197 : * The @ref bt_gmap_cb.discover callback is called when the discovery procedure completes of fails.
198 : * On discovery success the callback contains information about the remote device.
199 : *
200 : * @param conn Bluetooth connection object.
201 : *
202 : * @retval -EINVAL if @p conn is NULL
203 : * @retval -EBUSY if discovery is already in progress for @p conn
204 : * @retval -ENOEXEC if discovery failed to initiate
205 : * @retval 0 on success
206 : */
207 1 : int bt_gmap_discover(struct bt_conn *conn);
208 :
209 : /**
210 : * @brief Adds GMAS instance to database and sets the received Gaming Audio Profile role(s).
211 : *
212 : * @param role Gaming Audio Profile role(s) of the device (one or multiple).
213 : * @param features Features of the roles. If a role is not in the @p role parameter, then the
214 : * feature value for that role is simply ignored.
215 : *
216 : * @retval -EINVAL on invalid arguments
217 : * @retval -ENOEXEC on service register failure
218 : * @retval 0 on success
219 : */
220 1 : int bt_gmap_register(enum bt_gmap_role role, struct bt_gmap_feat features);
221 :
222 : /**
223 : * @brief Set one or multiple Gaming Audio Profile roles and features dynamically.
224 : *
225 : * Previously registered value will be overwritten. If there is a role change, this will trigger
226 : * a Gaming Audio Service (GMAS) service change. If there is only a feature change, no service
227 : * change will happen.
228 : *
229 : * @param role Gaming Audio Profile role(s).
230 : * @param features Features of the roles. If a role is not in the @p role parameter, then the
231 : * feature value for that role is simply ignored.
232 : *
233 : * @retval -ENOEXEC if the service has not yet been registered
234 : * @retval -EINVAL on invalid arguments
235 : * @retval -EALREADY if the @p role and @p features are the same as existing ones
236 : * @retval -ENOENT on service unregister failure
237 : * @retval -ECANCELED on service re-register failure
238 : * @retval 0 on success
239 : */
240 1 : int bt_gmap_set_role(enum bt_gmap_role role, struct bt_gmap_feat features);
241 :
242 : #ifdef __cplusplus
243 : }
244 : #endif
245 : /** @} */ /* end of bt_gmap */
246 :
247 : #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_GMAP_ */
|