xref: /btstack/src/le-audio/le_audio.h (revision 77bf845768a9c39a5561c69033c0112e62f08947)
1 /*
2  * Copyright (C) 2022 BlueKitchen GmbH
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the copyright holders nor the names of
14  *    contributors may be used to endorse or promote products derived
15  *    from this software without specific prior written permission.
16  * 4. Any redistribution, use, or modification is done solely for
17  *    personal benefit and not for any commercial purpose or for
18  *    monetary gain.
19  *
20  * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
21  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
24  * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27  * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
30  * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  * Please inquire about commercial licensing options at
34  * [email protected]
35  *
36  */
37 
38 /**
39  * @title Volume Offset Control Service Server
40  *
41  */
42 
43 #ifndef LE_AUDIO_H
44 #define LE_AUDIO_H
45 
46 #include <stdint.h>
47 
48 #include "bluetooth.h"
49 
50 #if defined __cplusplus
51 extern "C" {
52 #endif
53 
54 #define LE_AUDIO_MAX_CODEC_CONFIG_SIZE                          19
55 #define LE_CCIDS_MAX_NUM                                        10
56 
57 #define LE_AUDIO_PROGRAM_INFO_MAX_LENGTH                        20
58 #define LE_AUDIO_PROGRAM_INFO_URI_MAX_LENGTH                    20
59 #define LE_AUDIO_EXTENDED_METADATA_MAX_LENGHT                   20
60 #define LE_AUDIO_VENDOR_SPECIFIC_METADATA_MAX_LENGTH            20
61 
62 // Generic Audio/Audio Location Definitions/Bitmap
63 #define LE_AUDIO_LOCATION_MASK_NOT_ALLOWED                   0x00000000
64 #define LE_AUDIO_LOCATION_MASK_FRONT_LEFT                    0x00000001
65 #define LE_AUDIO_LOCATION_MASK_FRONT_RIGHT                   0x00000002
66 #define LE_AUDIO_LOCATION_MASK_FRONT_CENTER                  0x00000004
67 #define LE_AUDIO_LOCATION_MASK_LOW_FREQUENCY_EFFECTS1        0x00000008
68 #define LE_AUDIO_LOCATION_MASK_BACK_LEFT                     0x00000010
69 #define LE_AUDIO_LOCATION_MASK_BACK_RIGHT                    0x00000020
70 #define LE_AUDIO_LOCATION_MASK_FRONT_LEFT_OF_CENTER          0x00000040
71 #define LE_AUDIO_LOCATION_MASK_FRONT_RIGHT_OF_CENTER         0x00000080
72 #define LE_AUDIO_LOCATION_MASK_BACK_CENTER                   0x00000100
73 #define LE_AUDIO_LOCATION_MASK_LOW_FREQUENCY_EFFECTS2        0x00000200
74 #define LE_AUDIO_LOCATION_MASK_SIDE_LEFT                     0x00000400
75 #define LE_AUDIO_LOCATION_MASK_SIDE_RIGHT                    0x00000800
76 #define LE_AUDIO_LOCATION_MASK_TOP_FRONT_LEFT                0x00001000
77 #define LE_AUDIO_LOCATION_MASK_TOP_FRONT_RIGHT               0x00002000
78 #define LE_AUDIO_LOCATION_MASK_TOP_FRONT_CENTER              0x00004000
79 #define LE_AUDIO_LOCATION_MASK_TOP_CENTER                    0x00008000
80 #define LE_AUDIO_LOCATION_MASK_TOP_BACK_LEFT                 0x00010000
81 #define LE_AUDIO_LOCATION_MASK_TOP_BACK_RIGHT                0x00020000
82 #define LE_AUDIO_LOCATION_MASK_TOP_SIDE_LEFT                 0x00040000
83 #define LE_AUDIO_LOCATION_MASK_TOP_SIDE_RIGHT                0x00080000
84 #define LE_AUDIO_LOCATION_MASK_TOP_BACK_CENTER               0x00100000
85 #define LE_AUDIO_LOCATION_MASK_BOTTOM_FRONT_CENTER           0x00200000
86 #define LE_AUDIO_LOCATION_MASK_BOTTOM_FRONT_LEFT             0x00400000
87 #define LE_AUDIO_LOCATION_MASK_BOTTOM_FRONT_RIGHT            0x00800000
88 #define LE_AUDIO_LOCATION_MASK_FRONT_LEFT_WIDE               0x01000000
89 #define LE_AUDIO_LOCATION_MASK_FRONT_RIGHT_WIDE              0x02000000
90 #define LE_AUDIO_LOCATION_MASK_LEFT_SURROUND                 0x04000000
91 #define LE_AUDIO_LOCATION_MASK_RIGHT_SURROUND                0x08000000
92 #define LE_AUDIO_LOCATION_MASK_RFU                           0xF0000000
93 
94 // Generic Audio/Context Mask
95 #define LE_AUDIO_CONTEXT_MASK_PROHIBITED                0x0000
96 #define LE_AUDIO_CONTEXT_MASK_UNSPECIFIED               0x0001
97 #define LE_AUDIO_CONTEXT_MASK_CONVERSATIONAL            0x0002 // Conversation between humans, for example, in telephony or video calls, including traditional cellular as well as VoIP and Push-to-Talk
98 #define LE_AUDIO_CONTEXT_MASK_MEDIA                     0x0004 // Media, for example, music playback, radio, podcast or movie soundtrack, or tv audio
99 #define LE_AUDIO_CONTEXT_MASK_GAME                      0x0008 // Audio associated with video gaming, for example gaming media; gaming effects; music and in-game voice chat between participants; or a mix of all the above
100 #define LE_AUDIO_CONTEXT_MASK_INSTRUCTIONAL             0x0010 // Instructional audio, for example, in navigation, announcements, or user guidance
101 #define LE_AUDIO_CONTEXT_MASK_VOICE_ASSISTANTS          0x0020 // Man-machine communication, for example, with voice recognition or virtual assistants
102 #define LE_AUDIO_CONTEXT_MASK_LIVE                      0x0040 // Live audio, for example, from a microphone where audio is perceived both through a direct acoustic path and through an LE Audio Stream
103 #define LE_AUDIO_CONTEXT_MASK_SOUND_EFFECTS             0x0080 // Sound effects including keyboard and touch feedback; menu and user interface sounds; and other system sounds
104 #define LE_AUDIO_CONTEXT_MASK_NOTIFICATIONS             0x0100 // Notification and reminder sounds; attention-seeking audio, for example, in beeps signaling the arrival of a message
105 #define LE_AUDIO_CONTEXT_MASK_RINGTONE                  0x0200 // Alerts the user to an incoming call, for example, an incoming telephony or video call, including traditional cellular as well as VoIP and Push-to-Talk
106 #define LE_AUDIO_CONTEXT_MASK_ALERTS                    0x0400 // Alarms and timers; immediate alerts, for example, in a critical battery alarm, timer expiry or alarm clock, toaster, cooker, kettle, microwave, etc.
107 #define LE_AUDIO_CONTEXT_MASK_EMERGENCY_ALARM           0x0800 //Emergency alarm Emergency sounds, for example, fire alarms or other urgent alerts
108 #define LE_AUDIO_CONTEXT_MASK_RFU                       0xF000
109 
110 #define LE_AUDIO_OTC_MIN_OBJECT_ID_VALUE                0x000000000100
111 #define LE_AUDIO_OTC_MAX_OBJECT_ID_VALUE                0xFFFFFFFFFFFF
112 
113 // ASCS: Framing for Codec Configured State
114 #define LE_AUDIO_UNFRAMED_ISOAL_MASK_PDUS_SUPPORTED             0x00
115 #define LE_AUDIO_UNFRAMED_ISOAL_MASK_PDUS_NOT_SUPPORTED         0x01
116 
117 // ASCS: Server responds with bitmap values: PHY Bitmap for Codec Configured State
118 #define LE_AUDIO_SERVER_PHY_MASK_NO_PREFERENCE                         0x00
119 #define LE_AUDIO_SERVER_PHY_MASK_1M                                    0x01
120 #define LE_AUDIO_SERVER_PHY_MASK_2M                                    0x02
121 #define LE_AUDIO_SERVER_PHY_MASK_CODED                                 0x04
122 
123 // ASCS: Latency for Codec Configured State
124 #define LE_AUDIO_SERVER_LATENCY_MASK_NO_PREFERENCE                     0x00
125 #define LE_AUDIO_SERVER_LATENCY_MASK_LOW                               0x01
126 #define LE_AUDIO_SERVER_LATENCY_MASK_BALANCED                          0x02
127 #define LE_AUDIO_SERVER_LATENCY_MASK_HIGH                              0x04
128 
129 typedef enum {
130     LE_AUDIO_ROLE_SINK = 0,
131     LE_AUDIO_ROLE_SOURCE,
132     LE_AUDIO_ROLE_INVALID
133 } le_audio_role_t;
134 
135 // GA Codec_Specific_Configuration LTV structures
136 typedef enum {
137     LE_AUDIO_CODEC_CONFIGURATION_TYPE_UNDEFINED = 0x00,
138     LE_AUDIO_CODEC_CONFIGURATION_TYPE_SAMPLING_FREQUENCY = 0x01,
139     LE_AUDIO_CODEC_CONFIGURATION_TYPE_FRAME_DURATION,
140     LE_AUDIO_CODEC_CONFIGURATION_TYPE_AUDIO_CHANNEL_ALLOCATION,
141     LE_AUDIO_CODEC_CONFIGURATION_TYPE_OCTETS_PER_CODEC_FRAME,
142     LE_AUDIO_CODEC_CONFIGURATION_TYPE_CODEC_FRAME_BLOCKS_PER_SDU,
143     LE_AUDIO_CODEC_CONFIGURATION_TYPE_RFU
144 } le_audio_codec_configuration_type_t;
145 
146 typedef enum {
147     LE_AUDIO_CODEC_CAPABILITY_TYPE_UNDEFINED = 0x00,
148     LE_AUDIO_CODEC_CAPABILITY_TYPE_SAMPLING_FREQUENCY = 0x01,
149     LE_AUDIO_CODEC_CAPABILITY_TYPE_FRAME_DURATION,
150     LE_AUDIO_CODEC_CAPABILITY_TYPE_SUPPORTED_AUDIO_CHANNEL_COUNTS,
151     LE_AUDIO_CODEC_CAPABILITY_TYPE_OCTETS_PER_CODEC_FRAME,
152     LE_AUDIO_CODEC_CAPABILITY_TYPE_CODEC_FRAME_BLOCKS_PER_SDU,
153     LE_AUDIO_CODEC_CAPABILITY_TYPE_RFU
154 } le_audio_codec_capability_type_t;
155 
156 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_8000_HZ      0x0001
157 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_11025_HZ     0x0002
158 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_16000_HZ     0x0004
159 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_22050_HZ     0x0008
160 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_24000_HZ     0x0010
161 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_32000_HZ     0x0020
162 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_44100_HZ     0x0040
163 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_48000_HZ     0x0080
164 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_88200_HZ     0x0100
165 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_96000_HZ     0x0200
166 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_176400_HZ    0x0400
167 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_192000_HZ    0x0800
168 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_384000_HZ    0x1000
169 
170 typedef enum {
171     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_INVALID = 0x00,
172     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_8000_HZ,
173     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_11025_HZ,
174     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_16000_HZ,
175     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_22050_HZ,
176     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_24000_HZ,
177     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_32000_HZ,
178     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_44100_HZ,
179     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_48000_HZ,
180     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_88200_HZ,
181     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_96000_HZ,
182     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_176400_HZ,
183     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_192000_HZ,
184     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_384000_HZ,
185     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_RFU
186 } le_audio_codec_sampling_frequency_index_t;
187 
188 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_7500US               0x01
189 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_10000US              0x02
190 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_7500US_PREFERRED     0x10
191 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_10000US_PREFERRED    0x20
192 
193 typedef enum {
194     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_7500US = 0,
195     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_10000US,
196     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_RFU
197 } le_audio_codec_frame_duration_index_t;
198 
199 typedef enum {
200     LE_AUDIO_QUALITY_LOW = 0x00,
201     LE_AUDIO_QUALITY_MEDIUM,
202     LE_AUDIO_QUALITY_HIGH
203 } le_audio_quality_t;
204 
205 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_1            0x01
206 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_2            0x02
207 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_3            0x04
208 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_4            0x08
209 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_5            0x10
210 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_6            0x20
211 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_7            0x40
212 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_8            0x80
213 
214 
215 // GA Metadata LTV structures
216 
217 typedef enum {
218     LE_AUDIO_METADATA_TYPE_INVALID = 0x00,
219     LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS = 0x01,
220     LE_AUDIO_METADATA_TYPE_STREAMING_AUDIO_CONTEXTS,
221     LE_AUDIO_METADATA_TYPE_PROGRAM_INFO,
222     LE_AUDIO_METADATA_TYPE_LANGUAGE,
223     LE_AUDIO_METADATA_TYPE_CCID_LIST,
224     LE_AUDIO_METADATA_TYPE_PARENTAL_RATING,
225     LE_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI,
226     LE_AUDIO_METADATA_TYPE_MAPPED_EXTENDED_METADATA_BIT_POSITION,
227     LE_AUDIO_METADATA_TYPE_MAPPED_VENDOR_SPECIFIC_METADATA_BIT_POSITION,
228     // also used to indicate invalid packet type
229     LE_AUDIO_METADATA_TYPE_RFU,
230     LE_AUDIO_METADATA_TYPE_EXTENDED_METADATA = 0xFE, // mapped on RFU
231     LE_AUDIO_METADATA_TYPE_VENDOR_SPECIFIC_METADATA = 0xFF    // mapped on RFU+1
232 } le_audio_metadata_type_t;
233 
234 typedef enum {
235     LE_AUDIO_PARENTAL_RATING_NO_RATING = 0,
236     LE_AUDIO_PARENTAL_RATING_ANY_AGE,
237     LE_AUDIO_PARENTAL_RATING_AGE_2,
238     LE_AUDIO_PARENTAL_RATING_AGE_3,
239     LE_AUDIO_PARENTAL_RATING_AGE_4,
240     LE_AUDIO_PARENTAL_RATING_AGE_6,
241     LE_AUDIO_PARENTAL_RATING_AGE_7,
242     LE_AUDIO_PARENTAL_RATING_AGE_8,
243     LE_AUDIO_PARENTAL_RATING_AGE_9,
244     LE_AUDIO_PARENTAL_RATING_AGE_10,
245     LE_AUDIO_PARENTAL_RATING_RFU = 0x08
246 } le_audio_parental_rating_t;
247 
248 
249 typedef enum {
250     LE_AUDIO_CLIENT_TARGET_LATENCY_NO_PREFERENCE = 0,
251     LE_AUDIO_CLIENT_TARGET_LATENCY_LOW_LATENCY,
252     LE_AUDIO_CLIENT_TARGET_LATENCY_BALANCED_LATENCY_AND_RELIABILITY,
253     LE_AUDIO_CLIENT_TARGET_LATENCY_HIGH_RELIABILITY,
254     LE_AUDIO_CLIENT_TARGET_LATENCY_RFU,
255 } le_audio_client_target_latency_t;
256 
257 typedef enum {
258     LE_AUDIO_CLIENT_TARGET_PHY_NO_PREFERENCE = 0,
259     LE_AUDIO_CLIENT_TARGET_PHY_LOW,
260     LE_AUDIO_CLIENT_TARGET_PHY_BALANCED,
261     LE_AUDIO_CLIENT_TARGET_PHY_HIGH,
262     LE_AUDIO_CLIENT_TARGET_PHY_RFU
263 } le_audio_client_target_phy_t;
264 
265 // struct for codec id
266 typedef struct {
267     hci_audio_coding_format_t coding_format;
268     uint16_t company_id;
269     uint16_t vendor_specific_codec_id;
270 } le_audio_codec_id_t;
271 
272 
273 typedef enum {
274     LE_AUDIO_PA_SYNC_DO_NOT_SYNCHRONIZE_TO_PA = 0x00,
275     LE_AUDIO_PA_SYNC_SYNCHRONIZE_TO_PA_PAST_AVAILABLE,
276     LE_AUDIO_PA_SYNC_SYNCHRONIZE_TO_PA_PAST_NOT_AVAILABLE,
277     LE_AUDIO_PA_SYNC_RFU
278 } le_audio_pa_sync_t;
279 
280 typedef enum {
281     LE_AUDIO_PA_SYNC_STATE_NOT_SYNCHRONIZED_TO_PA = 0x00,
282     LE_AUDIO_PA_SYNC_STATE_SYNCINFO_REQUEST,
283     LE_AUDIO_PA_SYNC_STATE_SYNCHRONIZED_TO_PA,
284     LE_AUDIO_PA_SYNC_STATE_FAILED_TO_SYNCHRONIZE_TO_PA,
285     LE_AUDIO_PA_SYNC_STATE_NO_PAST,
286     LE_AUDIO_PA_SYNC_STATE_RFU
287 } le_audio_pa_sync_state_t;
288 
289 typedef enum {
290     LE_AUDIO_BIG_ENCRYPTION_NOT_ENCRYPTED = 0x00,
291     LE_AUDIO_BIG_ENCRYPTION_BROADCAST_CODE_REQUIRED,
292     LE_AUDIO_BIG_ENCRYPTION_DECRYPTING,
293     LE_AUDIO_BIG_ENCRYPTION_BAD_CODE,
294     LE_AUDIO_BIG_ENCRYPTION_RFU
295 } le_audio_big_encryption_t;
296 
297 
298 typedef struct {
299     uint16_t metadata_mask;
300 
301     uint16_t preferred_audio_contexts_mask;
302     uint16_t streaming_audio_contexts_mask;
303 
304     uint8_t  program_info_length;
305     uint8_t  program_info[LE_AUDIO_PROGRAM_INFO_MAX_LENGTH];
306 
307     uint32_t language_code; // 3-byte, lower case language code as defined in ISO 639-3
308 
309     uint8_t  ccids_num;
310     uint8_t  ccids[LE_CCIDS_MAX_NUM];
311 
312     le_audio_parental_rating_t parental_rating;
313 
314     uint8_t  program_info_uri_length;
315     uint8_t  program_info_uri[LE_AUDIO_PROGRAM_INFO_URI_MAX_LENGTH];
316 
317     uint16_t extended_metadata_type;
318     uint8_t  extended_metadata_length;
319     uint8_t  extended_metadata[LE_AUDIO_EXTENDED_METADATA_MAX_LENGHT];
320 
321     uint16_t vendor_specific_company_id;
322     uint8_t  vendor_specific_metadata_length;
323     uint8_t  vendor_specific_metadata[LE_AUDIO_VENDOR_SPECIFIC_METADATA_MAX_LENGTH];
324 } le_audio_metadata_t;
325 
326 typedef struct {
327     const char * name;
328     le_audio_codec_sampling_frequency_index_t sampling_frequency_index;
329     le_audio_codec_frame_duration_index_t     frame_duration_index;
330     uint16_t octets_per_frame;
331 } le_audio_codec_configuration_t;
332 
333 typedef struct {
334     const char * name;
335     uint16_t sdu_interval_us;
336     uint8_t  framing;
337     uint16_t max_sdu_size;
338     uint8_t  retransmission_number;
339     uint16_t max_transport_latency_ms;
340 } le_audio_qos_configuration_t;
341 
342 #if defined __cplusplus
343 }
344 #endif
345 
346 #endif
347 
348