xref: /btstack/src/le-audio/le_audio.h (revision bbc6d413293156c7b1ae7a92291217ae2c1aa7fa)
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_ANY                       0x0FFF // Combination of all above
109 #define LE_AUDIO_CONTEXT_MASK_RFU                       0xF000
110 
111 #define LE_AUDIO_OTC_MIN_OBJECT_ID_VALUE                0x000000000100
112 #define LE_AUDIO_OTC_MAX_OBJECT_ID_VALUE                0xFFFFFFFFFFFF
113 
114 // ASCS: Framing for Codec Configured State
115 #define LE_AUDIO_UNFRAMED_ISOAL_MASK_PDUS_SUPPORTED             0x00
116 #define LE_AUDIO_UNFRAMED_ISOAL_MASK_PDUS_NOT_SUPPORTED         0x01
117 
118 // ASCS: Server responds with bitmap values: PHY Bitmap for Codec Configured State
119 #define LE_AUDIO_SERVER_PHY_MASK_NO_PREFERENCE                         0x00
120 #define LE_AUDIO_SERVER_PHY_MASK_1M                                    0x01
121 #define LE_AUDIO_SERVER_PHY_MASK_2M                                    0x02
122 #define LE_AUDIO_SERVER_PHY_MASK_CODED                                 0x04
123 
124 // ASCS: Latency for Codec Configured State
125 #define LE_AUDIO_SERVER_LATENCY_MASK_NO_PREFERENCE                     0x00
126 #define LE_AUDIO_SERVER_LATENCY_MASK_LOW                               0x01
127 #define LE_AUDIO_SERVER_LATENCY_MASK_BALANCED                          0x02
128 #define LE_AUDIO_SERVER_LATENCY_MASK_HIGH                              0x04
129 
130 typedef enum {
131     LE_AUDIO_ROLE_SINK = 0,
132     LE_AUDIO_ROLE_SOURCE,
133     LE_AUDIO_ROLE_INVALID
134 } le_audio_role_t;
135 
136 // GA Codec_Specific_Configuration LTV structures
137 typedef enum {
138     LE_AUDIO_CODEC_CONFIGURATION_TYPE_UNDEFINED = 0x00,
139     LE_AUDIO_CODEC_CONFIGURATION_TYPE_SAMPLING_FREQUENCY = 0x01,
140     LE_AUDIO_CODEC_CONFIGURATION_TYPE_FRAME_DURATION,
141     LE_AUDIO_CODEC_CONFIGURATION_TYPE_AUDIO_CHANNEL_ALLOCATION,
142     LE_AUDIO_CODEC_CONFIGURATION_TYPE_OCTETS_PER_CODEC_FRAME,
143     LE_AUDIO_CODEC_CONFIGURATION_TYPE_CODEC_FRAME_BLOCKS_PER_SDU,
144     LE_AUDIO_CODEC_CONFIGURATION_TYPE_RFU
145 } le_audio_codec_configuration_type_t;
146 
147 typedef enum {
148     LE_AUDIO_CODEC_CAPABILITY_TYPE_UNDEFINED = 0x00,
149     LE_AUDIO_CODEC_CAPABILITY_TYPE_SAMPLING_FREQUENCY = 0x01,
150     LE_AUDIO_CODEC_CAPABILITY_TYPE_FRAME_DURATION,
151     LE_AUDIO_CODEC_CAPABILITY_TYPE_SUPPORTED_AUDIO_CHANNEL_COUNTS,
152     LE_AUDIO_CODEC_CAPABILITY_TYPE_OCTETS_PER_CODEC_FRAME,
153     LE_AUDIO_CODEC_CAPABILITY_TYPE_CODEC_FRAME_BLOCKS_PER_SDU,
154     LE_AUDIO_CODEC_CAPABILITY_TYPE_RFU
155 } le_audio_codec_capability_type_t;
156 
157 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_8000_HZ      0x0001
158 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_11025_HZ     0x0002
159 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_16000_HZ     0x0004
160 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_22050_HZ     0x0008
161 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_24000_HZ     0x0010
162 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_32000_HZ     0x0020
163 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_44100_HZ     0x0040
164 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_48000_HZ     0x0080
165 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_88200_HZ     0x0100
166 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_96000_HZ     0x0200
167 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_176400_HZ    0x0400
168 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_192000_HZ    0x0800
169 #define LE_AUDIO_CODEC_SAMPLING_FREQUENCY_MASK_384000_HZ    0x1000
170 
171 typedef enum {
172     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_INVALID = 0x00,
173     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_8000_HZ,
174     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_11025_HZ,
175     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_16000_HZ,
176     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_22050_HZ,
177     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_24000_HZ,
178     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_32000_HZ,
179     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_44100_HZ,
180     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_48000_HZ,
181     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_88200_HZ,
182     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_96000_HZ,
183     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_176400_HZ,
184     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_192000_HZ,
185     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_384000_HZ,
186     LE_AUDIO_CODEC_SAMPLING_FREQUENCY_INDEX_RFU
187 } le_audio_codec_sampling_frequency_index_t;
188 
189 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_7500US               0x01
190 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_10000US              0x02
191 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_7500US_PREFERRED     0x10
192 #define LE_AUDIO_CODEC_FRAME_DURATION_MASK_10000US_PREFERRED    0x20
193 
194 typedef enum {
195     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_7500US = 0,
196     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_10000US,
197     LE_AUDIO_CODEC_FRAME_DURATION_INDEX_RFU
198 } le_audio_codec_frame_duration_index_t;
199 
200 typedef enum {
201     LE_AUDIO_QUALITY_LOW = 0x00,
202     LE_AUDIO_QUALITY_MEDIUM,
203     LE_AUDIO_QUALITY_HIGH
204 } le_audio_quality_t;
205 
206 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_1            0x01
207 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_2            0x02
208 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_3            0x04
209 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_4            0x08
210 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_5            0x10
211 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_6            0x20
212 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_7            0x40
213 #define LE_AUDIO_CODEC_AUDIO_CHANNEL_COUNT_MASK_8            0x80
214 
215 
216 // GA Metadata LTV structures
217 
218 typedef enum {
219     LE_AUDIO_METADATA_TYPE_INVALID = 0x00,
220     LE_AUDIO_METADATA_TYPE_PREFERRED_AUDIO_CONTEXTS = 0x01,
221     LE_AUDIO_METADATA_TYPE_STREAMING_AUDIO_CONTEXTS,
222     LE_AUDIO_METADATA_TYPE_PROGRAM_INFO,
223     LE_AUDIO_METADATA_TYPE_LANGUAGE,
224     LE_AUDIO_METADATA_TYPE_CCID_LIST,
225     LE_AUDIO_METADATA_TYPE_PARENTAL_RATING,
226     LE_AUDIO_METADATA_TYPE_PROGRAM_INFO_URI,
227     LE_AUDIO_METADATA_TYPE_MAPPED_EXTENDED_METADATA_BIT_POSITION,
228     LE_AUDIO_METADATA_TYPE_MAPPED_VENDOR_SPECIFIC_METADATA_BIT_POSITION,
229     // also used to indicate invalid packet type
230     LE_AUDIO_METADATA_TYPE_RFU,
231     LE_AUDIO_METADATA_TYPE_EXTENDED_METADATA = 0xFE, // mapped on RFU
232     LE_AUDIO_METADATA_TYPE_VENDOR_SPECIFIC_METADATA = 0xFF    // mapped on RFU+1
233 } le_audio_metadata_type_t;
234 
235 typedef enum {
236     LE_AUDIO_PARENTAL_RATING_NO_RATING = 0,
237     LE_AUDIO_PARENTAL_RATING_ANY_AGE,
238     LE_AUDIO_PARENTAL_RATING_AGE_2,
239     LE_AUDIO_PARENTAL_RATING_AGE_3,
240     LE_AUDIO_PARENTAL_RATING_AGE_4,
241     LE_AUDIO_PARENTAL_RATING_AGE_6,
242     LE_AUDIO_PARENTAL_RATING_AGE_7,
243     LE_AUDIO_PARENTAL_RATING_AGE_8,
244     LE_AUDIO_PARENTAL_RATING_AGE_9,
245     LE_AUDIO_PARENTAL_RATING_AGE_10,
246     LE_AUDIO_PARENTAL_RATING_RFU = 0x08
247 } le_audio_parental_rating_t;
248 
249 
250 typedef enum {
251     LE_AUDIO_CLIENT_TARGET_LATENCY_NO_PREFERENCE = 0,
252     LE_AUDIO_CLIENT_TARGET_LATENCY_LOW_LATENCY,
253     LE_AUDIO_CLIENT_TARGET_LATENCY_BALANCED_LATENCY_AND_RELIABILITY,
254     LE_AUDIO_CLIENT_TARGET_LATENCY_HIGH_RELIABILITY,
255     LE_AUDIO_CLIENT_TARGET_LATENCY_RFU,
256 } le_audio_client_target_latency_t;
257 
258 typedef enum {
259     LE_AUDIO_CLIENT_TARGET_PHY_NO_PREFERENCE = 0,
260     LE_AUDIO_CLIENT_TARGET_PHY_LOW,
261     LE_AUDIO_CLIENT_TARGET_PHY_BALANCED,
262     LE_AUDIO_CLIENT_TARGET_PHY_HIGH,
263     LE_AUDIO_CLIENT_TARGET_PHY_RFU
264 } le_audio_client_target_phy_t;
265 
266 // struct for codec id
267 typedef struct {
268     hci_audio_coding_format_t coding_format;
269     uint16_t company_id;
270     uint16_t vendor_specific_codec_id;
271 } le_audio_codec_id_t;
272 
273 
274 typedef enum {
275     LE_AUDIO_PA_SYNC_DO_NOT_SYNCHRONIZE_TO_PA = 0x00,
276     LE_AUDIO_PA_SYNC_SYNCHRONIZE_TO_PA_PAST_AVAILABLE,
277     LE_AUDIO_PA_SYNC_SYNCHRONIZE_TO_PA_PAST_NOT_AVAILABLE,
278     LE_AUDIO_PA_SYNC_RFU
279 } le_audio_pa_sync_t;
280 
281 typedef enum {
282     LE_AUDIO_PA_SYNC_STATE_NOT_SYNCHRONIZED_TO_PA = 0x00,
283     LE_AUDIO_PA_SYNC_STATE_SYNCINFO_REQUEST,
284     LE_AUDIO_PA_SYNC_STATE_SYNCHRONIZED_TO_PA,
285     LE_AUDIO_PA_SYNC_STATE_FAILED_TO_SYNCHRONIZE_TO_PA,
286     LE_AUDIO_PA_SYNC_STATE_NO_PAST,
287     LE_AUDIO_PA_SYNC_STATE_RFU
288 } le_audio_pa_sync_state_t;
289 
290 typedef enum {
291     LE_AUDIO_BIG_ENCRYPTION_NOT_ENCRYPTED = 0x00,
292     LE_AUDIO_BIG_ENCRYPTION_BROADCAST_CODE_REQUIRED,
293     LE_AUDIO_BIG_ENCRYPTION_DECRYPTING,
294     LE_AUDIO_BIG_ENCRYPTION_BAD_CODE,
295     LE_AUDIO_BIG_ENCRYPTION_RFU
296 } le_audio_big_encryption_t;
297 
298 
299 typedef struct {
300     uint16_t metadata_mask;
301 
302     uint16_t preferred_audio_contexts_mask;
303     uint16_t streaming_audio_contexts_mask;
304 
305     uint8_t  program_info_length;
306     uint8_t  program_info[LE_AUDIO_PROGRAM_INFO_MAX_LENGTH];
307 
308     uint32_t language_code; // 3-byte, lower case language code as defined in ISO 639-3
309 
310     uint8_t  ccids_num;
311     uint8_t  ccids[LE_CCIDS_MAX_NUM];
312 
313     le_audio_parental_rating_t parental_rating;
314 
315     uint8_t  program_info_uri_length;
316     uint8_t  program_info_uri[LE_AUDIO_PROGRAM_INFO_URI_MAX_LENGTH];
317 
318     uint16_t extended_metadata_type;
319     uint8_t  extended_metadata_length;
320     uint8_t  extended_metadata[LE_AUDIO_EXTENDED_METADATA_MAX_LENGHT];
321 
322     uint16_t vendor_specific_company_id;
323     uint8_t  vendor_specific_metadata_length;
324     uint8_t  vendor_specific_metadata[LE_AUDIO_VENDOR_SPECIFIC_METADATA_MAX_LENGTH];
325 
326     uint8_t unsupported_type;
327 
328 } le_audio_metadata_t;
329 
330 typedef struct {
331     const char * name;
332     le_audio_codec_sampling_frequency_index_t sampling_frequency_index;
333     le_audio_codec_frame_duration_index_t     frame_duration_index;
334     uint16_t octets_per_frame;
335 } le_audio_codec_configuration_t;
336 
337 typedef struct {
338     const char * name;
339     uint16_t sdu_interval_us;
340     uint8_t  framing;
341     uint16_t max_sdu_size;
342     uint8_t  retransmission_number;
343     uint16_t max_transport_latency_ms;
344 } le_audio_qos_configuration_t;
345 
346 #if defined __cplusplus
347 }
348 #endif
349 
350 #endif
351 
352