1 /**
2  * @file
3  * @brief Header for Bluetooth GMAP LC3 presets.
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_LC3_PRESET_
11 #define ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_GMAP_LC3_PRESET_
12 
13 /**
14  * @brief Gaming Audio Profile (GMAP) LC3 Presets
15  *
16  * @defgroup bt_gmap_lc3_preset Gaming Audio Profile (GMAP) LC3 Presets
17  *
18  * @since 3.5
19  * @version 0.8.0
20  *
21  * @ingroup bluetooth
22  * @{
23  *
24  * These APIs provide presets for codec configuration and QoS based on values supplied by the
25  * codec configurations from table 3.16 in the GMAP v1.0 specification
26  */
27 
28 #include <zephyr/bluetooth/audio/audio.h>
29 #include <zephyr/bluetooth/audio/bap.h>
30 #include <zephyr/bluetooth/audio/bap_lc3_preset.h>
31 #include <zephyr/bluetooth/audio/lc3.h>
32 
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36 
37 /**
38  * @brief Helper to declare LC3 32_1_gr codec configuration
39  *
40  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
41  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
42  */
43 #define BT_GMAP_LC3_PRESET_32_1_GR(_loc, _stream_context)                                          \
44 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_32KHZ,                 \
45 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 60U, 1, \
46 						    _stream_context),                              \
47 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 60U, 1U, 15U, 10000U))
48 
49 /**
50  * @brief Helper to declare LC3 32_2_gr codec configuration
51  *
52  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
53  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
54  */
55 #define BT_GMAP_LC3_PRESET_32_2_GR(_loc, _stream_context)                                          \
56 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_32KHZ,                 \
57 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 80U, 1,  \
58 						    _stream_context),                              \
59 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 80U, 1U, 20U, 10000U))
60 
61 /**
62  * @brief Helper to declare LC3 48_1_gr codec configuration
63  *
64  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
65  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
66  */
67 #define BT_GMAP_LC3_PRESET_48_1_GR(_loc, _stream_context)                                          \
68 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
69 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 75U, 1, \
70 						    _stream_context),                              \
71 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 75U, 1U, 15U, 10000U))
72 
73 /**
74  * @brief Helper to declare LC3 48_2_gr codec configuration
75  *
76  *  Mandatory to support as both unicast client and server
77  *
78  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
79  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
80  */
81 #define BT_GMAP_LC3_PRESET_48_2_GR(_loc, _stream_context)                                          \
82 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
83 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 100U, 1, \
84 						    _stream_context),                              \
85 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 100U, 1U, 20U, 10000U))
86 
87 /**
88  * @brief Helper to declare LC3 48_3_gr codec configuration
89  *
90  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
91  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
92  */
93 #define BT_GMAP_LC3_PRESET_48_3_GR(_loc, _stream_context)                                          \
94 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
95 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 90U, 1, \
96 						    _stream_context),                              \
97 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 90U, 1U, 15U, 10000U))
98 
99 /**
100  * @brief Helper to declare LC3 48_4_gr codec configuration
101  *
102  *  Mandatory to support as unicast server
103  *
104  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
105  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
106  */
107 #define BT_GMAP_LC3_PRESET_48_4_GR(_loc, _stream_context)                                          \
108 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
109 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 120u, 1, \
110 						    _stream_context),                              \
111 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 120U, 1U, 20U, 10000U))
112 
113 /**
114  * @brief Helper to declare LC3 16_1_gs codec configuration
115  *
116  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
117  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
118  */
119 #define BT_GMAP_LC3_PRESET_16_1_GS(_loc, _stream_context)                                          \
120 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_16KHZ,                 \
121 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 30U, 1, \
122 						    _stream_context),                              \
123 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 30U, 1U, 15U, 60000U))
124 
125 /**
126  * @brief Helper to declare LC3 16_2_gs codec configuration
127  *
128  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
129  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
130  */
131 #define BT_GMAP_LC3_PRESET_16_2_GS(_loc, _stream_context)                                          \
132 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_16KHZ,                 \
133 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 40U, 1,  \
134 						    _stream_context),                              \
135 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 40U, 1U, 20U, 60000U))
136 
137 /**
138  * @brief Helper to declare LC3 32_1_gs codec configuration
139  *
140  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
141  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
142  */
143 #define BT_GMAP_LC3_PRESET_32_1_GS(_loc, _stream_context)                                          \
144 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_32KHZ,                 \
145 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 60U, 1, \
146 						    _stream_context),                              \
147 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 60U, 1U, 15U, 60000U))
148 
149 /**
150  * @brief Helper to declare LC3 32_2_gs codec configuration
151  *
152  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
153  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
154  */
155 #define BT_GMAP_LC3_PRESET_32_2_GS(_loc, _stream_context)                                          \
156 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_32KHZ,                 \
157 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 80U, 1,  \
158 						    _stream_context),                              \
159 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 80U, 1U, 20U, 60000U))
160 
161 /**
162  * @brief Helper to declare LC3 48_1_gs codec configuration
163  *
164  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
165  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
166  */
167 #define BT_GMAP_LC3_PRESET_48_1_GS(_loc, _stream_context)                                          \
168 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
169 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 75U, 1, \
170 						    _stream_context),                              \
171 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 75U, 1U, 15U, 60000U))
172 
173 /**
174  * @brief Helper to declare LC3 48_2_gs codec configuration
175  *
176  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
177  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
178  */
179 #define BT_GMAP_LC3_PRESET_48_2_GS(_loc, _stream_context)                                          \
180 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
181 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 100U, 1, \
182 						    _stream_context),                              \
183 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 100U, 1U, 20U, 60000U))
184 
185 /* GMAP LC3 broadcast presets defined by table 3.22 in the GMAP v1.0 specification */
186 
187 /**
188  * @brief Helper to declare LC3 48_1_g codec configuration
189  *
190  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
191  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
192  */
193 #define BT_GMAP_LC3_PRESET_48_1_G(_loc, _stream_context)                                           \
194 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
195 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 75U, 1, \
196 						    _stream_context),                              \
197 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 75U, 1U, 8U, 10000U))
198 
199 /**
200  * @brief Helper to declare LC3 48_2_g codec configuration
201  *
202  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
203  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
204  */
205 #define BT_GMAP_LC3_PRESET_48_2_G(_loc, _stream_context)                                           \
206 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
207 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 100U, 1, \
208 						    _stream_context),                              \
209 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 100U, 1U, 10U, 10000U))
210 
211 /**
212  * @brief Helper to declare LC3 48_3_g codec configuration
213  *
214  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
215  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
216  */
217 #define BT_GMAP_LC3_PRESET_48_3_G(_loc, _stream_context)                                           \
218 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
219 						    BT_AUDIO_CODEC_CFG_DURATION_7_5, _loc, 90U, 1, \
220 						    _stream_context),                              \
221 			  BT_BAP_QOS_CFG_UNFRAMED(7500u, 90U, 1U, 8U, 10000U))
222 
223 /**
224  * @brief Helper to declare LC3 48_4_g codec configuration
225  *
226  * @param _loc             Audio channel location bitfield (@ref bt_audio_location)
227  * @param _stream_context  Stream context (``BT_AUDIO_CONTEXT_*``)
228  */
229 #define BT_GMAP_LC3_PRESET_48_4_G(_loc, _stream_context)                                           \
230 	BT_BAP_LC3_PRESET(BT_AUDIO_CODEC_LC3_CONFIG(BT_AUDIO_CODEC_CFG_FREQ_48KHZ,                 \
231 						    BT_AUDIO_CODEC_CFG_DURATION_10, _loc, 120u, 1, \
232 						    _stream_context),                              \
233 			  BT_BAP_QOS_CFG_UNFRAMED(10000u, 120U, 1U, 10U, 10000U))
234 
235 #ifdef __cplusplus
236 }
237 #endif
238 /** @} */
239 
240 #endif /* ZEPHYR_INCLUDE_BLUETOOTH_AUDIO_GMAP_LC3_PRESET_ */
241