• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022, sakumisu
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  */
6 #ifndef USB_AUDIO_H
7 #define USB_AUDIO_H
8 
9 /** Audio Interface Subclass Codes
10  * Refer to Table A-2 from audio10.pdf
11  */
12 #define AUDIO_SUBCLASS_UNDEFINED      0x00
13 #define AUDIO_SUBCLASS_AUDIOCONTROL   0x01
14 #define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
15 #define AUDIO_SUBCLASS_MIDISTREAMING  0x03
16 
17 #define AUDIO_PROTOCOL_UNDEFINED 0x00
18 #define AUDIO_PROTOCOLv20        0x20 /* IP version 2.0 */
19 
20 /** Audio Class-Specific Request Codes
21  * Refer to Table A-9 from audio10.pdf
22  */
23 #define AUDIO_REQUEST_UNDEFINED 0x00
24 #define AUDIO_REQUEST_SET_CUR   0x01
25 #define AUDIO_REQUEST_GET_CUR   0x81
26 #define AUDIO_REQUEST_SET_MIN   0x02
27 #define AUDIO_REQUEST_GET_MIN   0x82
28 #define AUDIO_REQUEST_SET_MAX   0x03
29 #define AUDIO_REQUEST_GET_MAX   0x83
30 #define AUDIO_REQUEST_SET_RES   0x04
31 #define AUDIO_REQUEST_GET_RES   0x84
32 #define AUDIO_REQUEST_SET_MEM   0x05
33 #define AUDIO_REQUEST_GET_MEM   0x85
34 #define AUDIO_REQUEST_GET_STAT  0xFF
35 
36 /** Audio Class-Specific Request Codes
37  * Refer from audio20_final.pdf
38  */
39 #define AUDIO_REQUEST_CUR   0x01
40 #define AUDIO_REQUEST_RANGE 0x02
41 /** Audio Class-Specific Control Interface Descriptor Subtypes
42  * Refer to Table A-5 from audio10.pdf
43  */
44 #define AUDIO_CONTROL_UNDEF                0x01U
45 #define AUDIO_CONTROL_HEADER               0x01U
46 #define AUDIO_CONTROL_INPUT_TERMINAL       0x02U
47 #define AUDIO_CONTROL_OUTPUT_TERMINAL      0x03U
48 #define AUDIO_CONTROL_MIXER_UNIT           0x04U
49 #define AUDIO_CONTROL_SELECTOR_UNIT        0x05U
50 #define AUDIO_CONTROL_FEATURE_UNIT         0x06U
51 #define AUDIO_CONTROL_EFFECT_UNIT          0x07U
52 #define AUDIO_CONTROL_PROCESSING_UNIT      0x08U
53 #define AUDIO_CONTROL_EXTENSION_UNIT       0x09U
54 #define AUDIO_CONTROL_CLOCK_SOURCE         0x0aU
55 #define AUDIO_CONTROL_CLOCK_SELECTOR       0x0bU
56 #define AUDIO_CONTROL_CLOCK_MULTIPLIER     0x0cU
57 #define AUDIO_CONTROL_SAMPLERATE_CONVERTER 0x0dU
58 
59 /** Audio Class-Specific AS Interface Descriptor Subtypes
60  * Refer to Table A-6 from audio10.pdf
61  */
62 #define AUDIO_STREAMING_UNDEFINED   0x00U
63 #define AUDIO_STREAMING_GENERAL     0x01U
64 #define AUDIO_STREAMING_FORMAT_TYPE 0x02U
65 #define AUDIO_STREAMING_ENCODER     0x03U
66 #define AUDIO_STREAMING_DECODER     0x04U
67 
68 /* Clock Source Descriptor Clock Types */
69 #define AUDIO_CLKSRC_EXTERNAL       0x00 /* External clock */
70 #define AUDIO_CLKSRC_INTERNAL_FIXED 0x01 /* Internal fixed clock */
71 #define AUDIO_CLKSRC_INTERNAL_VAR   0x02 /* Internal variable clock */
72 #define AUDIO_CLKSRC_INTERNAL_PROG  0x03 /* Internal programmable clock */
73 
74 /* Effect Unit Effect Types */
75 #define AUDIO_EFFECT_UNDEF            0x00
76 #define AUDIO_EFFECT_PARAM_EQ_SECTION 0x01
77 #define AUDIO_EFFECT_REVERBERATION    0x02
78 #define AUDIO_EFFECT_MOD_DELAY        0x03
79 #define AUDIO_EFFECT_DYN_RANGE_COMP   0x04
80 
81 /* Processing Unit Process Types */
82 #define AUDIO_PROCESS_UNDEFINED       0x00
83 #define AUDIO_PROCESS_UPDOWNMIX       0x01
84 #define AUDIO_PROCESS_DOLBY_PROLOGIC  0x02
85 #define AUDIO_PROCESS_STEREO_EXTENDER 0x03
86 
87 /* Audio Class-Specific Endpoint Descriptor Subtypes */
88 #define AUDIO_ENDPOINT_UNDEFINED 0x00U
89 #define AUDIO_ENDPOINT_GENERAL   0x01U
90 
91 /* Feature Unit Control Bits */
92 #define AUDIO_CONTROL_MUTE              0x0001
93 #define AUDIO_CONTROL_VOLUME            0x0002
94 #define AUDIO_CONTROL_BASS              0x0004
95 #define AUDIO_CONTROL_MID               0x0008
96 #define AUDIO_CONTROL_TREBLE            0x0010
97 #define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
98 #define AUDIO_CONTROL_AUTOMATIC_GAIN    0x0040
99 #define AUDIO_CONTROL_DEALY             0x0080
100 #define AUDIO_CONTROL_BASS_BOOST        0x0100
101 #define AUDIO_CONTROL_LOUDNESS          0x0200
102 
103 /* Encoder Type Codes */
104 #define AUDIO_ENCODER_UNDEF 0x00
105 #define AUDIO_ENCODER_OTHER 0x01
106 #define AUDIO_ENCODER_MPEG  0x02
107 #define AUDIO_ENCODER_AC3   0x03
108 #define AUDIO_ENCODER_WMA   0x04
109 #define AUDIO_ENCODER_DTS   0x05
110 
111 /* Decoder Type Codes */
112 #define AUDIO_DECODER_UNDEF 0x00
113 #define AUDIO_DECODER_OTHER 0x01
114 #define AUDIO_DECODER_MPEG  0x02
115 #define AUDIO_DECODER_AC3   0x03
116 #define AUDIO_DECODER_WMA   0x04
117 #define AUDIO_DECODER_DTS   0x05
118 
119 /* Audio Descriptor Types */
120 #define AUDIO_UNDEFINED_DESCRIPTOR_TYPE     0x20
121 #define AUDIO_DEVICE_DESCRIPTOR_TYPE        0x21
122 #define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
123 #define AUDIO_STRING_DESCRIPTOR_TYPE        0x23
124 #define AUDIO_INTERFACE_DESCRIPTOR_TYPE     0x24
125 #define AUDIO_ENDPOINT_DESCRIPTOR_TYPE      0x25
126 
127 /* Audio Data Format Type I Codes */
128 #define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
129 #define AUDIO_FORMAT_PCM              0x0001
130 #define AUDIO_FORMAT_PCM8             0x0002
131 #define AUDIO_FORMAT_IEEE_FLOAT       0x0003
132 #define AUDIO_FORMAT_ALAW             0x0004
133 #define AUDIO_FORMAT_MULAW            0x0005
134 
135 #define AUDIO_V2_FORMAT_PCM              0x00000001
136 #define AUDIO_V2_FORMAT_PCM8             0x00000002
137 #define AUDIO_V2_FORMAT_IEEE_FLOAT       0x00000004
138 #define AUDIO_V2_FORMAT_ALAW             0x00000008
139 #define AUDIO_V2_FORMAT_MULAW            0x00000010
140 
141 /* bmChannelConfig: a bitmap field that indicates which spatial locations
142  * are occupied by the channels present in the cluster. The bit allocations
143  * are as follows:
144  */
145 #define AUDIO_CHANNEL_M    0         /* Mono */
146 #define AUDIO_CHANNEL_FL   (1 << 0)  /*  Front Left */
147 #define AUDIO_CHANNEL_FR   (1 << 1)  /*  Front Right */
148 #define AUDIO_CHANNEL_FC   (1 << 2)  /*  Front Center */
149 #define AUDIO_CHANNEL_LFE  (1 << 3)  /*  Low Frequency Effects */
150 #define AUDIO_CHANNEL_BL   (1 << 4)  /*  Back Left */
151 #define AUDIO_CHANNEL_BR   (1 << 5)  /*  Back Right */
152 #define AUDIO_CHANNEL_FLC  (1 << 6)  /*  Front Left of Center */
153 #define AUDIO_CHANNEL_FRC  (1 << 7)  /*  Front Right of Center */
154 #define AUDIO_CHANNEL_BC   (1 << 8)  /*  Back Center */
155 #define AUDIO_CHANNEL_SL   (1 << 9)  /*  Side Left */
156 #define AUDIO_CHANNEL_SR   (1 << 10) /*  Side Right */
157 #define AUDIO_CHANNEL_TC   (1 << 11) /*  Top Center */
158 #define AUDIO_CHANNEL_TFL  (1 << 12) /*  Top Front Left */
159 #define AUDIO_CHANNEL_TFC  (1 << 13) /*  Top Front Center */
160 #define AUDIO_CHANNEL_TFR  (1 << 14) /*  Top Front Right */
161 #define AUDIO_CHANNEL_TBL  (1 << 15) /*  Top Back Left */
162 #define AUDIO_CHANNEL_TBC  (1 << 16) /*  Top Back Center */
163 #define AUDIO_CHANNEL_TBR  (1 << 17) /*  Top Back Right */
164 #define AUDIO_CHANNEL_TFLC (1 << 18) /*  Top Front Left of Center */
165 #define AUDIO_CHANNEL_TFRC (1 << 19) /*  Top Front Right of Center */
166 #define AUDIO_CHANNEL_LLFE (1 << 20) /*  Left Low Frequency Effects */
167 #define AUDIO_CHANNEL_RLFE (1 << 21) /*  Right Low Frequency Effects */
168 #define AUDIO_CHANNEL_TSL  (1 << 22) /*  Top Side Left */
169 #define AUDIO_CHANNEL_TSR  (1 << 23) /*  Top Side Right */
170 #define AUDIO_CHANNEL_BOC  (1 << 24) /*  Bottom Center */
171 #define AUDIO_CHANNEL_BLC  (1 << 25) /*  Back Left of Center */
172 #define AUDIO_CHANNEL_BRC  (1 << 26) /*  Back Right of Center */
173                                      /* Bits 27-30: Reserved */
174 #define AUDIO_CHANNEL_RD (1 << 31)   /*  Raw Data */
175 
176 /* Audio Function Category Codes */
177 #define AUDIO_CATEGORY_UNDEF      0x00 /* Undefined */
178 #define AUDIO_CATEGORY_SPEAKER    0x01 /* Desktop speaker */
179 #define AUDIO_CATEGORY_THEATER    0x02 /* Home theater */
180 #define AUDIO_CATEGORY_MICROPHONE 0x03 /* Microphone */
181 #define AUDIO_CATEGORY_HEADSET    0x04 /* Headset */
182 #define AUDIO_CATEGORY_TELEPHONE  0x05 /* Telephone */
183 #define AUDIO_CATEGORY_CONVERTER  0x06 /* Converter */
184 #define AUDIO_CATEGORY_RECORDER   0x07 /* Voice/Sound recorder */
185 #define AUDIO_CATEGORY_IO_BOX     0x08 /* I/O box */
186 #define AUDIO_CATEGORY_INSTRUMENT 0x09 /* Musical instrument */
187 #define AUDIO_CATEGORY_PROAUDIO   0x0a /* Pro-audio */
188 #define AUDIO_CATEGORY_AV         0x0b /* Audio/video */
189 #define AUDIO_CATEGORY_CONTROL    0x0c /* Control panel */
190 #define AUDIO_CATEGORY_OTHER      0xff
191 
192 /* Clock Source Control Selectors */
193 #define AUDIO_CS_CONTROL_UNDEF       0x00
194 #define AUDIO_CS_CONTROL_SAM_FREQ    0x01
195 #define AUDIO_CS_CONTROL_CLOCK_VALID 0x02
196 
197 /* Clock Selector Control Selectors */
198 #define AUDIO_CX_CONTROL_UNDEF    0x00
199 #define AUDIO_CX_CONTROL_CLOCKSEL 0x01
200 
201 /* Clock Multiplier Control Selectors */
202 #define AUDIO_CM_CONTROL_UNDEF       0x00
203 #define AUDIO_CM_CONTROL_NUMERATOR   0x01
204 #define AUDIO_CM_CONTROL_DENOMINATOR 0x02
205 
206 /* Terminal Control Selectors */
207 #define AUDIO_TE_CONTROL_UNDEF        0x00
208 #define AUDIO_TE_CONTROL_COPY_PROTECT 0x01
209 #define AUDIO_TE_CONTROL_CONNECTOR    0x02
210 #define AUDIO_TE_CONTROL_OVERLOAD     0x03
211 #define AUDIO_TE_CONTROL_CLUSTER      0x04
212 #define AUDIO_TE_CONTROL_UNDERFLOW    0x05
213 #define AUDIO_TE_CONTROL_OVERFLOW     0x06
214 #define AUDIO_TE_CONTROL_LATENCY      0x07
215 
216 /* Mixer Control Selectors */
217 #define AUDIO_MU_CONTROL_UNDEF     0x00
218 #define AUDIO_MU_CONTROL_MIXER     0x01
219 #define AUDIO_MU_CONTROL_CLUSTER   0x02
220 #define AUDIO_MU_CONTROL_UNDERFLOW 0x03
221 #define AUDIO_MU_CONTROL_OVERFLOW  0x04
222 #define AUDIO_MU_CONTROL_LATENCY   0x05
223 
224 /* Selector Control Selectors */
225 #define AUDIO_SU_CONTROL_UNDEFINE 0x00
226 #define AUDIO_SU_CONTROL_SELECTOR 0x01
227 #define AUDIO_SU_CONTROL_LATENCY  0x02
228 
229 /* Feature Unit Control Selectors */
230 #define AUDIO_FU_CONTROL_UNDEF        0x00
231 #define AUDIO_FU_CONTROL_MUTE         0x01
232 #define AUDIO_FU_CONTROL_VOLUME       0x02
233 #define AUDIO_FU_CONTROL_BASS         0x03
234 #define AUDIO_FU_CONTROL_MID          0x04
235 #define AUDIO_FU_CONTROL_TREBLE       0x05
236 #define AUDIO_FU_CONTROL_EQUALIZER    0x06
237 #define AUDIO_FU_CONTROL_AGC          0x07
238 #define AUDIO_FU_CONTROL_DELAY        0x08
239 #define AUDIO_FU_CONTROL_BASS_BOOST   0x09
240 #define AUDIO_FU_CONTROL_LOUDNESS     0x0a
241 #define AUDIO_FU_CONTROL_INP_GAIN     0x0b
242 #define AUDIO_FU_CONTROL_INP_GAIN_PAD 0x0c
243 #define AUDIO_FU_CONTROL_PHASE_INVERT 0x0d
244 #define AUDIO_FU_CONTROL_UNDERFLOW    0x0e
245 #define AUDIO_FU_CONTROL_OVERFLOW     0x0f
246 #define AUDIO_FU_CONTROL_LATENCY      0x10
247 
248 #define AUDIO_V2_FU_CONTROL_UNDEF        0x00
249 #define AUDIO_V2_FU_CONTROL_MUTE         (0x03 << 0)
250 #define AUDIO_V2_FU_CONTROL_VOLUME       (0x03 << 2)
251 #define AUDIO_V2_FU_CONTROL_BASS         (0x03 << 4)
252 #define AUDIO_V2_FU_CONTROL_MID          (0x03 << 6)
253 #define AUDIO_V2_FU_CONTROL_TREBLE       (0x03 << 8)
254 #define AUDIO_V2_FU_CONTROL_EQUALIZER    (0x03 << 10)
255 #define AUDIO_V2_FU_CONTROL_AGC          (0x03 << 12)
256 #define AUDIO_V2_FU_CONTROL_DELAY        (0x03 << 14)
257 #define AUDIO_V2_FU_CONTROL_BASS_BOOST   (0x03 << 16)
258 #define AUDIO_V2_FU_CONTROL_LOUDNESS     (0x03 << 18)
259 #define AUDIO_V2_FU_CONTROL_INP_GAIN     (0x03 << 20)
260 #define AUDIO_V2_FU_CONTROL_INP_GAIN_PAD (0x03 << 22)
261 #define AUDIO_V2_FU_CONTROL_PHASE_INVERT (0x03 << 24)
262 #define AUDIO_V2_FU_CONTROL_UNDERFLOW    (0x03 << 26)
263 #define AUDIO_V2_FU_CONTROL_OVERFLOW     (0x03 << 28)
264 
265 /* Parametric Equalizer Section Effect Unit Control Selectors */
266 #define AUDIO_PE_CONTROL_UNDEF      0x00
267 #define AUDIO_PE_CONTROL_ENABLE     0x01
268 #define AUDIO_PE_CONTROL_CENTERFREQ 0x02
269 #define AUDIO_PE_CONTROL_QFACTOR    0x03
270 #define AUDIO_PE_CONTROL_GAIN       0x04
271 #define AUDIO_PE_CONTROL_UNDERFLOW  0x05
272 #define AUDIO_PE_CONTROL_OVERFLOW   0x06
273 #define AUDIO_PE_CONTROL_LATENCY    0x07
274 
275 /* Reverberation Effect Unit Control Selectors */
276 #define AUDIO_RV_CONTROL_UNDEF      0x00
277 #define AUDIO_RV_CONTROL_ENABLE     0x01
278 #define AUDIO_RV_CONTROL_TYPE       0x02
279 #define AUDIO_RV_CONTROL_LEVEL      0x03
280 #define AUDIO_RV_CONTROL_TIME       0x04
281 #define AUDIO_RV_CONTROL_FEEDBACK   0x05
282 #define AUDIO_RV_CONTROL_PREDELAY   0x06
283 #define AUDIO_RV_CONTROL_DENSITY    0x07
284 #define AUDIO_RV_CONTROL_HF_ROLLOFF 0x08
285 #define AUDIO_RV_CONTROL_UNDERFLOW  0x09
286 #define AUDIO_RV_CONTROL_OVERFLOW   0x0a
287 #define AUDIO_RV_CONTROL_LATENCY    0x0b
288 
289 /* Modulation Delay Effect Unit Control Selectors */
290 #define AUDIO_MD_CONTROL_UNDEF     0x00
291 #define AUDIO_MD_CONTROL_ENABLE    0x01
292 #define AUDIO_MD_CONTROL_BALANCE   0x02
293 #define AUDIO_MD_CONTROL_RATE      0x03
294 #define AUDIO_MD_CONTROL_DEPTH     0x04
295 #define AUDIO_MD_CONTROL_TIME      0x05
296 #define AUDIO_MD_CONTROL_FEEDBACK  0x06
297 #define AUDIO_MD_CONTROL_UNDERFLOW 0x07
298 #define AUDIO_MD_CONTROL_OVERFLOW  0x08
299 #define AUDIO_MD_CONTROL_LATENCY   0x09
300 
301 /* Dynamic Range Compressor Effect Unit Control Selectors */
302 #define AUDIO_DR_CONTROL_UNDEF        0x00
303 #define AUDIO_DR_CONTROL_ENABLE       0x01
304 #define AUDIO_DR_CONTROL_COMP_RATE    0x02
305 #define AUDIO_DR_CONTROL_MAXAMPL      0x03
306 #define AUDIO_DR_CONTROL_THRESHOLD    0x04
307 #define AUDIO_DR_CONTROL_ATTACK_TIME  0x05
308 #define AUDIO_DR_CONTROL_RELEASE_TIME 0x06
309 #define AUDIO_DR_CONTROL_UNDERFLOW    0x07
310 #define AUDIO_DR_CONTROL_OVERFLOW     0x08
311 #define AUDIO_DR_CONTROL_LATENCY      0x09
312 
313 /* Up/Down-mix Processing Unit Control Selectors */
314 #define AUDIO_UD_CONTROL_UNDEF       0x00
315 #define AUDIO_UD_CONTROL_ENABLE      0x01
316 #define AUDIO_UD_CONTROL_MODE_SELECT 0x02
317 #define AUDIO_UD_CONTROL_CLUSTER     0x03
318 #define AUDIO_UD_CONTROL_UNDERFLOW   0x04
319 #define AUDIO_UD_CONTROL_OVERFLOW    0x05
320 #define AUDIO_UD_CONTROL_LATENCY     0x06
321 
322 /* Dolby Prologic?Processing Unit Control Selectors */
323 #define AUDIO_DP_CONTROL_UNDEF       0x00
324 #define AUDIO_DP_CONTROL_ENABLE      0x01
325 #define AUDIO_DP_CONTROL_MODE_SELECT 0x02
326 #define AUDIO_DP_CONTROL_CLUSTER     0x03
327 #define AUDIO_DP_CONTROL_UNDERFLOW   0x04
328 #define AUDIO_DP_CONTROL_OVERFLOW    0x05
329 #define AUDIO_DP_CONTROL_LATENCY     0x06
330 
331 /* Stereo Extender Processing Unit Control Selectors */
332 #define AUDIO_STEXT_CONTROL_UNDEF     0x00
333 #define AUDIO_STEXT_CONTROL_ENABLE    0x01
334 #define AUDIO_STEXT_CONTROL_WIDTH     0x02
335 #define AUDIO_STEXT_CONTROL_UNDERFLOW 0x03
336 #define AUDIO_STEXT_CONTROL_OVERFLOW  0x04
337 #define AUDIO_STEXT_CONTROL_LATENCY   0x05
338 
339 /* Extension Unit Control Selectors */
340 
341 #define AUDIO_XU_CONTROL_UNDEF     0x00
342 #define AUDIO_XU_CONTROL_ENABLE    0x01
343 #define AUDIO_XU_CONTROL_CLUSTER   0x02
344 #define AUDIO_XU_CONTROL_UNDERFLOW 0x03
345 #define AUDIO_XU_CONTROL_OVERFLOW  0x04
346 #define AUDIO_XU_CONTROL_LATENCY   0x05
347 
348 /* AudioStreaming Interface Control Selectors */
349 
350 #define AUDIO_AS_CONTROL_UNDEF        0x00
351 #define AUDIO_AS_CONTROL_ACT_ALT      0x01
352 #define AUDIO_AS_CONTROL_VAL_ALT      0x02
353 #define AUDIO_AS_CONTROL_AUDIO_FORMAT 0x03
354 
355 /* Encoder Control Selectors */
356 
357 #define AUDIO_EN_CONTROL_UNDEF       0x00
358 #define AUDIO_EN_CONTROL_BIT_RATE    0x01
359 #define AUDIO_EN_CONTROL_QUALITY     0x02
360 #define AUDIO_EN_CONTROL_VBR         0x03
361 #define AUDIO_EN_CONTROL_TYPE        0x04
362 #define AUDIO_EN_CONTROL_UNDERFLOW   0x05
363 #define AUDIO_EN_CONTROL_OVERFLOW    0x06
364 #define AUDIO_EN_CONTROL_ENCODER_ERR 0x07
365 #define AUDIO_EN_CONTROL_PARAM1      0x08
366 #define AUDIO_EN_CONTROL_PARAM2      0x09
367 #define AUDIO_EN_CONTROL_PARAM3      0x0a
368 #define AUDIO_EN_CONTROL_PARAM4      0x0b
369 #define AUDIO_EN_CONTROL_PARAM5      0x0c
370 #define AUDIO_EN_CONTROL_PARAM6      0x0d
371 #define AUDIO_EN_CONTROL_PARAM7      0x0e
372 #define AUDIO_EN_CONTROL_PARAM8      0x0f
373 
374 /* MPEG Decoder Control Selectors */
375 
376 #define AUDIO_MPGD_CONTROL_UNDEF      0x00
377 #define AUDIO_MPGD_CONTROL_DUAL_CHAN  0x01
378 #define AUDIO_MPGD_CONTROL_2ND_STEREO 0x02
379 #define AUDIO_MPGD_CONTROL_MULTILING  0x03
380 #define AUDIO_MPGD_CONTROL_DYN_RANGE  0x04
381 #define AUDIO_MPGD_CONTROL_SCALING    0x05
382 #define AUDIO_MPGD_CONTROL_HILO_SCALE 0x06
383 #define AUDIO_MPGD_CONTROL_UNDERFLOW  0x07
384 #define AUDIO_MPGD_CONTROL_OVERFLOW   0x08
385 #define AUDIO_MPGD_CONTROL_DECODE_ERR 0x09
386 
387 /* AC-3 Decoder Control Selectors */
388 
389 #define AUDIO_AC3D_CONTROL_UNDEF      0x00
390 #define AUDIO_AC3D_CONTROL_MODE       0x01
391 #define AUDIO_AC3D_CONTROL_DYN_RANGE  0x02
392 #define AUDIO_AC3D_CONTROL_SCALING    0x03
393 #define AUDIO_AC3D_CONTROL_HILO_SCALE 0x04
394 #define AUDIO_AC3D_CONTROL_UNDERFLOW  0x05
395 #define AUDIO_AC3D_CONTROL_OVERFLOW   0x06
396 #define AUDIO_AC3D_CONTROL_DECODE_ERR 0x07
397 
398 /* WMA Decoder Control Selectors */
399 
400 #define AUDIO_WMAD_CONTROL_UNDEF      0x00
401 #define AUDIO_WMAD_CONTROL_UNDERFLOW  0x01
402 #define AUDIO_WMAD_CONTROL_OVERFLOW   0x02
403 #define AUDIO_WMAD_CONTROL_DECODE_ERR 0x03
404 
405 /* DTS Decoder Control Selectors */
406 
407 #define AUDIO_DTSD_CONTROL_UNDEF      0x00
408 #define AUDIO_DTSD_CONTROL_UNDERFLOW  0x01
409 #define AUDIO_DTSD_CONTROL_OVERFLOW   0x02
410 #define AUDIO_DTSD_CONTROL_DECODE_ERR 0x03
411 
412 /* Endpoint Control Selectors */
413 #define AUDIO_EP_CONTROL_UNDEF        0x00
414 #define AUDIO_EP_CONTROL_SAMPLING_FEQ 0x01
415 #define AUDIO_EP_CONTROL_PITCH        0x02
416 
417 /* Encoder Error Codes */
418 
419 /* <0: Reserved for vendor extensions */
420 
421 #define AUDIO_ENCODER_SUCCESS         0  /* No Error */
422 #define AUDIO_ENCODER_ERROR_NOMEM     1  /* Out of Memory */
423 #define AUDIO_ENCODER_ERROR_BW        2  /* Out of Bandwidth */
424 #define AUDIO_ENCODER_ERROR_CYCLE     3  /* Out of Processing Cycles */
425 #define AUDIO_ENCODER_ERROR_FRAME     4  /* General Format Frame Error */
426 #define AUDIO_ENCODER_ERROR_TOOSMALL  5  /* Format Frame Too Small */
427 #define AUDIO_ENCODER_ERROR_TOOBIG    6  /* Format Frame Too Large */
428 #define AUDIO_ENCODER_ERROR_BADFORMAT 7  /* Bad Data Format */
429 #define AUDIO_ENCODER_ERROR_NCHAN     8  /* Incorrect Number of Channels */
430 #define AUDIO_ENCODER_ERROR_RATE      9  /* Incorrect Sampling Rate */
431 #define AUDIO_ENCODER_ERROR_BITRATE   10 /* Unable to Meet Target Bitrate */
432 #define AUDIO_ENCODER_ERROR_PARMS     11 /* Inconsistent Set of Parameters */
433 #define AUDIO_ENCODER_ERROR_NOTREADY  12 /* Not Ready */
434 #define AUDIO_ENCODER_ERROR_BUSY      13 /* Busy */
435                                          /* >13: Reserved */
436 
437 /* Format Type Codes */
438 
439 #define AUDIO_FORMAT_TYPE_UNDEF  0x00
440 #define AUDIO_FORMAT_TYPEI       0x01
441 #define AUDIO_FORMAT_TYPEII      0x02
442 #define AUDIO_FORMAT_TYPEIII     0x03
443 #define AUDIO_FORMAT_TYPEIV      0x04
444 #define AUDIO_FORMAT_EXT_TYPEI   0x81
445 #define AUDIO_FORMAT_EXT_TYPEII  0x82
446 #define AUDIO_FORMAT_EXT_TYPEIII 0x83
447 
448 /* Audio Data Format Type I Bit Allocations */
449 
450 #define AUDIO_FORMAT_TYPEI_PCM       (1 << 0)
451 #define AUDIO_FORMAT_TYPEI_PCM8      (1 << 1)
452 #define AUDIO_FORMAT_TYPEI_IEEEFLOAT (1 << 2)
453 #define AUDIO_FORMAT_TYPEI_ALAW      (1 << 3)
454 #define AUDIO_FORMAT_TYPEI_MULAW     (1 << 4)
455 #define AUDIO_FORMAT_TYPEI_RAWDATA   (1 << 31)
456 
457 /* Audio Data Format Type II Bit Allocations */
458 
459 #define AUDIO_FORMAT_TYPEII_MPEG    (1 << 0)
460 #define AUDIO_FORMAT_TYPEII_AC3     (1 << 1)
461 #define AUDIO_FORMAT_TYPEII_WMA     (1 << 2)
462 #define AUDIO_FORMAT_TYPEII_DTS     (1 << 3)
463 #define AUDIO_FORMAT_TYPEII_RAWDATA (1 << 31)
464 
465 /* Audio Data Format Type III Bit Allocations */
466 
467 #define AUDIO_FORMAT_TYPEIII_IEC61937_AC3            (1 << 0)
468 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L1       (1 << 1)
469 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG1_L2_3     (1 << 1)
470 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_NOEXT    (1 << 2)
471 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_EXT      (1 << 3)
472 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_AAC_ADTS (1 << 4)
473 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L1_LS    (1 << 5)
474 #define AUDIO_FORMAT_TYPEIII_IEC61937_MPEG2_L2_3_LS  (1 << 6)
475 #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_I          (1 << 7)
476 #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_II         (1 << 8)
477 #define AUDIO_FORMAT_TYPEIII_IEC61937_DTS_III        (1 << 9)
478 #define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC          (1 << 10)
479 #define AUDIO_FORMAT_TYPEIII_IEC61937_ATRAC2_3       (1 << 11)
480 #define AUDIO_FORMAT_TYPEIII_WMA                     (1 << 12)
481 
482 /* Audio Data Format Type IV Bit Allocations */
483 
484 #define AUDIO_FORMAT_TYPEIV_PCM                     (1 << 0)
485 #define AUDIO_FORMAT_TYPEIV_PCM8                    (1 << 1)
486 #define AUDIO_FORMAT_TYPEIV_IEEE_FLOAT              (1 << 2)
487 #define AUDIO_FORMAT_TYPEIV_ALAW                    (1 << 3)
488 #define AUDIO_FORMAT_TYPEIV_MULAW                   (1 << 4)
489 #define AUDIO_FORMAT_TYPEIV_MPEG                    (1 << 5)
490 #define AUDIO_FORMAT_TYPEIV_AC3                     (1 << 6)
491 #define AUDIO_FORMAT_TYPEIV_WMA                     (1 << 7)
492 #define AUDIO_FORMAT_TYPEIV_IEC61937_AC3            (1 << 8)
493 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L1       (1 << 9)
494 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG1_L2_3     (1 << 10)
495 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_NOEXT    (1 << 10)
496 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_EXT      (1 << 11)
497 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_AAC_ADTS (1 << 12)
498 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L1_LS    (1 << 13)
499 #define AUDIO_FORMAT_TYPEIV_IEC61937_MPEG2_L2_3_LS  (1 << 14)
500 #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_I          (1 << 15)
501 #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_II         (1 << 16)
502 #define AUDIO_FORMAT_TYPEIV_IEC61937_DTS_III        (1 << 17)
503 #define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC          (1 << 18)
504 #define AUDIO_FORMAT_TYPEIV_IEC61937_ATRAC2_3       (1 << 19)
505 #define AUDIO_FORMAT_TYPEIV_TYPE_III_WMA            (1 << 20)
506 #define AUDIO_FORMAT_TYPEIV_IEC60958_PCM            (1 << 21)
507 
508 /* Side Band Protocol Codes */
509 #define AUDIO_SIDEBAND_PROTOCOL_UNDEF 0x00
510 #define AUDIO_PRES_TIMESTAMP_PROTOCOL 0x01
511 
512 /** USB Terminal Types
513  * Refer to Table 2-1 - Table 2-4 from termt10.pdf
514  */
515 
516 /* USB Terminal Types */
517 #define AUDIO_TERMINAL_UNDEF     0x0100
518 #define AUDIO_TERMINAL_STREAMING 0x0101
519 #define AUDIO_TERMINAL_VENDOR    0x01ff
520 
521 /* Input Terminal Types */
522 #define AUDIO_INTERM_UNDEF          0x0200 /* Undefined Type */
523 #define AUDIO_INTERM_MIC            0x0201 /* A generic microhpone */
524 #define AUDIO_INTERM_DESKTOP_MIC    0x0202 /* A desktop microphone */
525 #define AUDIO_INTERM_PERSONAL_MIC   0x0203 /* Head-mounted or clip-on microphone */
526 #define AUDIO_INTERM_OMNI_MIC       0x0204 /* Omni-directional microphone */
527 #define AUDIO_INTERM_MIC_ARRAY      0x0205 /* Microphone array */
528 #define AUDIO_INTERM_PROC_MIC_ARRAY 0x0206 /* Microphone array with signal processor */
529 
530 /* Output Terminal Types */
531 #define AUDIO_OUTTERM_UNDEF       0x0300 /* Undefined Type */
532 #define AUDIO_OUTTERM_SPEAKER     0x0301 /* Generic speakers */
533 #define AUDIO_OUTTERM_HEADPHONES  0x0302 /* A head-mounted audio output device */
534 #define AUDIO_OUTTERM_HEADDISPLAY 0x0303 /* Head Mounted Display Audio */
535 #define AUDIO_OUTTERM_DESKTOP     0x0304 /* Desktop speaker */
536 #define AUDIO_OUTTERM_ROOM        0x0305 /* Room speaker */
537 #define AUDIO_OUTTERM_COMMS       0x0306 /* Communication speaker */
538 #define AUDIO_OUTTERM_LOFREQ      0x0307 /* Low frequency effects speaker */
539 
540 /* Bi-directional Terminal Types */
541 #define AUDIO_BIDITERM_UNDEF        0x0400 /* Undefined Type */
542 #define AUDIO_BIDITERM_HANDSET      0x0401 /* Hand-held bi-directional audio device */
543 #define AUDIO_BIDITERM_HEADSET      0x0402 /* Head-mounted bi-directional audio device */
544 #define AUDIO_BIDITERM_SPEAKERPHONE 0x0403 /* Speakerphone, no echo reduction */
545 #define AUDIO_BIDITERM_ECHOSUPPRESS 0x0404 /* Echo-suppressing speakerphone */
546 #define AUDIO_BIDITERM_ECHOCANCEL   0x0405 /* Echo-canceling speakerphone */
547 
548 /* Telephony Terminal Types */
549 #define AUDIO_TELETERM_UNDEF     0x0500 /* Undefined Type */
550 #define AUDIO_TELETERM_PHONELINE 0x0501 /* Analog telephone line jack, an ISDN line,
551                                                 * a proprietary PBX interface, or a wireless link */
552 #define AUDIO_TELETERM_TELEPHONE 0x0502 /* Device can be used as a telephone */
553 #define AUDIO_TELETERM_DOWNLINE  0x0503 /* Down Line Phone */
554 
555 /* External Terminal Types */
556 #define AUDIO_EXTTERM_UNDEF   0x0600 /* Undefined Type */
557 #define AUDIO_EXTTERM_ANALOG  0x0601 /* Generic analog connector */
558 #define AUDIO_EXTTERM_DIGITAL 0x0602 /* Generic digital audio interface */
559 #define AUDIO_EXTTERM_LINE    0x0603 /* Analog connector at standard line levels */
560 #define AUDIO_EXTTERM_LEGACY  0x0604 /* Legacy audio line out connector */
561 #define AUDIO_EXTTERM_SPDIF   0x0605 /* SPDIF interface */
562 #define AUDIO_EXTTERM_1394DA  0x0606 /* 1394 DA stream */
563 #define AUDIO_EXTTERM_1394DV  0x0607 /* 1394 DV stream soundtrack */
564 #define AUDIO_EXTTERM_ADAT    0x0608 /* ADAT Lightpipe */
565 #define AUDIO_EXTTERM_TDIF    0x0609 /* TDIF  - Tascam Digital Interface */
566 #define AUDIO_EXTTERM_MADI    0x060a /* MADI - Multi-channel Audio Digital Interface (AES) */
567 
568 /* Embedded Function Terminal Types */
569 #define AUDIO_EMBEDTERM_UNDEF        0x0700 /* Undefined Type */
570 #define AUDIO_EMBEDTERM_CALIBRATION  0x0701 /* Level Calibration Noise Source */
571 #define AUDIO_EMBEDTERM_EQUALIZATION 0x0702 /* Equalization Noise */
572 #define AUDIO_EMBEDTERM_CD           0x0703 /* CD player */
573 #define AUDIO_EMBEDTERM_DAT          0x0704 /* Digital Audio Tape */
574 #define AUDIO_EMBEDTERM_DCC          0x0705 /* Digital Compact Cassette */
575 #define AUDIO_EMBEDTERM_COMPRESSED   0x0706 /* Compressed Audio Player */
576 #define AUDIO_EMBEDTERM_TAPE         0x0707 /* Analog Audio Tape */
577 #define AUDIO_EMBEDTERM_PHONOGRAPH   0x0708 /* Analog vinyl record player */
578 #define AUDIO_EMBEDTERM_VCR          0x0709 /* Audio track of VCR */
579 #define AUDIO_EMBEDTERM_VIDDISC      0x070a /* Audio track of VideoDisc player */
580 #define AUDIO_EMBEDTERM_DVD          0x070b /* Audio track of DVD player */
581 #define AUDIO_EMBEDTERM_TVTUNER      0x070c /* Audio track of TV tuner */
582 #define AUDIO_EMBEDTERM_SATELLITE    0x070d /* Audio track of satellite receiver */
583 #define AUDIO_EMBEDTERM_CABLETUNER   0x070e /* Audio track of cable tuner */
584 #define AUDIO_EMBEDTERM_DSS          0x070f /* Audio track of DSS receiver */
585 #define AUDIO_EMBEDTERM_RADIO        0x0710 /* AM/FM radio receiver */
586 #define AUDIO_EMBEDTERM_TRANSMITTER  0x0711 /* AM/FM radio transmitter */
587 #define AUDIO_EMBEDTERM_MULTITRACK   0x0712 /* A multi-track recording system */
588 #define AUDIO_EMBEDTERM_SYNTHESIZER  0x0713 /* Synthesizer */
589 #define AUDIO_EMBEDTERM_PIANO        0x0714 /* Piano */
590 #define AUDIO_EMBEDTERM_GUITAR       0x0715 /* Guitar */
591 #define AUDIO_EMBEDTERM_PERCUSSON    0x0716 /* Percussion Instrument */
592 #define AUDIO_EMBEDTERM_INSTRUMENT   0x0717 /* Other Musical Instrument */
593 
594 #define AUDIO_FORMAT_TYPE_I   0x01
595 #define AUDIO_FORMAT_TYPE_II  0x02
596 #define AUDIO_FORMAT_TYPE_III 0x03
597 
598 struct audio_cs_if_ac_header_descriptor {
599     uint8_t bLength;
600     uint8_t bDescriptorType;
601     uint8_t bDescriptorSubtype;
602     uint16_t bcdADC;
603     uint16_t wTotalLength;
604     uint8_t bInCollection;
605     uint8_t baInterfaceNr[];
606 } __PACKED;
607 
608 #define AUDIO_SIZEOF_AC_HEADER_DESC(n) (8 + n)
609 
610 struct audio_cs_if_ac_input_terminal_descriptor {
611     uint8_t bLength;
612     uint8_t bDescriptorType;
613     uint8_t bDescriptorSubtype;
614     uint8_t bTerminalID;
615     uint16_t wTerminalType;
616     uint8_t bAssocTerminal;
617     uint8_t bNrChannels;
618     uint16_t wChannelConfig;
619     uint8_t iChannelNames;
620     uint8_t iTerminal;
621 } __PACKED;
622 
623 #define AUDIO_SIZEOF_AC_INPUT_TERMINAL_DESC (12)
624 
625 struct audio_cs_if_ac_output_terminal_descriptor {
626     uint8_t bLength;
627     uint8_t bDescriptorType;
628     uint8_t bDescriptorSubtype;
629     uint8_t bTerminalID;
630     uint16_t wTerminalType;
631     uint8_t bAssocTerminal;
632     uint8_t bSourceID;
633     uint8_t iTerminal;
634 } __PACKED;
635 
636 #define AUDIO_SIZEOF_AC_OUTPUT_TERMINAL_DESC (9)
637 
638 struct audio_cs_if_ac_feature_unit_descriptor {
639     uint8_t bLength;
640     uint8_t bDescriptorType;
641     uint8_t bDescriptorSubtype;
642     uint8_t bUnitID;
643     uint8_t bSourceID;
644     uint8_t bControlSize;
645     uint8_t bmaControls[1];
646     uint8_t iFeature;
647 } __PACKED;
648 
649 #define AUDIO_SIZEOF_AC_FEATURE_UNIT_DESC(ch, n) (7 + (ch + 1) * n)
650 
651 struct audio_cs_if_as_general_descriptor {
652     uint8_t bLength;
653     uint8_t bDescriptorType;
654     uint8_t bDescriptorSubtype;
655     uint8_t bTerminalLink;
656     uint8_t bDelay;
657     uint16_t wFormatTag;
658 } __PACKED;
659 
660 #define AUDIO_SIZEOF_AS_GENERAL_DESC (7)
661 
662 struct audio_cs_if_as_format_type_descriptor {
663     uint8_t bLength;
664     uint8_t bDescriptorType;
665     uint8_t bDescriptorSubtype;
666     uint8_t bFormatType;
667     uint8_t bNrChannels;
668     uint8_t bSubframeSize;
669     uint8_t bBitResolution;
670     uint8_t bSamFreqType;
671     uint8_t tSamFreq[3];
672 } __PACKED;
673 
674 #define AUDIO_SIZEOF_FORMAT_TYPE_DESC(n) (8 + 3 * n)
675 
676 struct audio_ep_descriptor {
677     uint8_t bLength;
678     uint8_t bDescriptorType;
679     uint8_t bEndpointAddress;
680     uint8_t bmAttributes;
681     uint16_t wMaxPacketSize;
682     uint8_t bInterval;
683     uint8_t bRefresh;
684     uint8_t bSynchAddress;
685 } __PACKED;
686 
687 #define AUDIO_SIZEOF_EP_DESC (9)
688 
689 struct audio_cs_ep_ep_general_descriptor {
690     uint8_t bLength;
691     uint8_t bDescriptorType;
692     uint8_t bDescriptorSubtype;
693     uint8_t bmAttributes;
694     uint8_t bLockDelayUnits;
695     uint16_t wLockDelay;
696 } __PACKED;
697 
698 #define AUDIO_SIZEOF_CS_EP_GENERAL_DESC (7)
699 
700 // clang-format off
701 #define AUDIO_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, stridx, ...) \
702     /* Interface Association Descriptor */                                                                                       \
703     0x08,                                                                                                                        \
704     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                   \
705     bFirstInterface,                                                                                                             \
706     bInterfaceCount,                                                                                                             \
707     USB_DEVICE_CLASS_AUDIO,                                                                                                      \
708     AUDIO_SUBCLASS_AUDIOCONTROL,                                                                                                 \
709     AUDIO_PROTOCOL_UNDEFINED,                                                                                                    \
710     0x00,                                                                                                                        \
711     /* ------------------ AudioControl Interface ------------------ */\
712     0x09,                            /* bLength */                                                                               \
713     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                       \
714     bFirstInterface,                 /* bInterfaceNumber */                                                                      \
715     0x00,                            /* bAlternateSetting */                                                                     \
716     0x00,                            /* bNumEndpoints */                                                                         \
717     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                       \
718     AUDIO_SUBCLASS_AUDIOCONTROL,     /* bInterfaceSubClass */                                                                    \
719     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                                    \
720     stridx,                          /* iInterface */                                                                            \
721     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                               \
722     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                       \
723     AUDIO_CONTROL_HEADER,            /* bDescriptorSubtype */                                                                    \
724     WBVAL(0x0100),                   /* bcdADC */                                                                                \
725     WBVAL(wTotalLength),             /* wTotalLength */                                                                          \
726     PP_NARG(__VA_ARGS__),            /* bInCollection */                                                                         \
727     __VA_ARGS__                      /* baInterfaceNr */
728 
729 #define AUDIO_AC_DESCRIPTOR_INIT_LEN(n) (0x08 + 0x09 + 0x08 + n)
730 
731 #define AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bNrChannels, wChannelConfig) \
732     0x0C,                            /* bLength */                                                   \
733     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                           \
734     AUDIO_CONTROL_INPUT_TERMINAL,    /* bDescriptorSubtype */                                        \
735     bTerminalID,                     /* bTerminalID */                                               \
736     WBVAL(wTerminalType),            /* wTerminalType : Microphone 0x0201 */                         \
737     0x00,                            /* bAssocTerminal */                                            \
738     bNrChannels,                     /* bNrChannels */                                               \
739     WBVAL(wChannelConfig),           /* wChannelConfig : Mono sets no position bits */               \
740     0x00,                            /* iChannelNames */                                             \
741     0x00                             /* iTerminal */
742 
743 #define AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID) \
744     0x09,                            /* bLength */                                  \
745     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                          \
746     AUDIO_CONTROL_OUTPUT_TERMINAL,   /* bDescriptorSubtype */                       \
747     bTerminalID,                     /* bTerminalID */                              \
748     WBVAL(wTerminalType),            /* wTerminalType : USB Streaming */            \
749     0x00,                            /* bAssocTerminal */                           \
750     bSourceID,                       /* bSourceID */                                \
751     0x00                             /* iTerminal */
752 
753 #define AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, bControlSize, ...) \
754     0x07 + PP_NARG(__VA_ARGS__),     /* bLength */                               \
755     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                       \
756     AUDIO_CONTROL_FEATURE_UNIT,      /* bDescriptorSubtype */                    \
757     bUnitID,                         /* bUnitID */                               \
758     bSourceID,                       /* bSourceID */                             \
759     bControlSize,                    /* bControlSize */                          \
760     __VA_ARGS__,                     /* bmaControls(0) Mute */                   \
761     0x00                             /* iTerminal */
762 
763 #define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \
764     0x09,                            /* bLength */                                                                       \
765     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
766     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
767     0x00,                            /* bAlternateSetting */                                                             \
768     0x00,                            /* bNumEndpoints */                                                                 \
769     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
770     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
771     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
772     0x00,                            /* iInterface */                                                                    \
773     0x09,                            /* bLength */                                                                       \
774     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
775     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
776     0x01,                            /* bAlternateSetting */                                                             \
777     0x01,                            /* bNumEndpoints */                                                                 \
778     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
779     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
780     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
781     0x00,                            /* iInterface */                                                                    \
782     0x07,                            /* bLength */                                                                       \
783     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
784     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                            \
785     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output Terminal*/                                 \
786     0x01,                            /* bDelay */                                                                        \
787     WBVAL(AUDIO_FORMAT_PCM),         /* wFormatTag : AUDIO_FORMAT_PCM */                                                 \
788     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                       \
789     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
790     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                            \
791     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                   \
792     bNrChannels,                     /* bNrChannels */                                                                   \
793     bSubFrameSize,                   /* bSubFrameSize : Bytes per audio subframe */                                      \
794     bBitResolution,                  /* bBitResolution : bits per sample */                                              \
795     (PP_NARG(__VA_ARGS__)/3),        /* bSamFreqType : only one frequency supported */                                   \
796     __VA_ARGS__,                     /* tSamFreq : Audio sampling frequency coded on 3 bytes */                          \
797     0x09,                            /* bLength */                                                                       \
798     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                               \
799     bEndpointAddress,                /* bEndpointAddress : IN endpoint 1 */                                              \
800     bmAttributes,                    /* bmAttributes */                                                                  \
801     WBVAL(wMaxPacketSize),           /* wMaxPacketSize */                                                                \
802     bInterval,                       /* bInterval : one packet per frame */                                              \
803     0x00,                            /* bRefresh */                                                                      \
804     0x00,                            /* bSynchAddress */                                                                 \
805     0x07,                            /* bLength */                                                                       \
806     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                               \
807     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                   \
808     AUDIO_EP_CONTROL_SAMPLING_FEQ,   /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */                                      \
809     0x00,                            /* bLockDelayUnits */                                                               \
810     0x00,                            /* wLockDelay */                                                                    \
811     0x00
812 
813 #define AUDIO_AS_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
814 
815 #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints)                                               \
816     0x09,                            /* bLength */                                                                       \
817     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
818     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
819     0x00,                            /* bAlternateSetting */                                                             \
820     bNumEndpoints,                   /* bNumEndpoints */                                                                 \
821     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
822     AUDIO_SUBCLASS_MIDISTREAMING,    /* bInterfaceSubClass */                                                            \
823     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
824     0x00                             /* iInterface */
825 
826 #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT_LEN 0x09
827 
828 struct audio_v2_channel_cluster_descriptor {
829     uint8_t bNrChannels;
830     uint32_t bmChannelConfig;
831     uint8_t iChannelNames;
832 } __PACKED;
833 
834 #define AUDIO_V2_SIZEOF_CHANNEL_CLUSTER_DESC (6)
835 
836 struct audio_v2_cs_if_ac_header_descriptor {
837     uint8_t bLength;
838     uint8_t bDescriptorType;
839     uint8_t bDescriptorSubtype;
840     uint16_t bcdADC;
841     uint8_t bCategory;
842     uint16_t wTotalLength;
843     uint8_t bmControls;
844 } __PACKED;
845 
846 #define AUDIO_V2_SIZEOF_AC_HEADER_DESC (9)
847 
848 struct audio_v2_cs_if_ac_clock_source_descriptor {
849     uint8_t bLength;
850     uint8_t bDescriptorType;
851     uint8_t bDescriptorSubtype;
852     uint8_t bClockID;
853     uint8_t bmAttributes;
854     uint8_t bmControls;
855     uint8_t bAssocTerminal;
856     uint8_t iClockSource;
857 } __PACKED;
858 
859 #define AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC (8)
860 
861 struct audio_v2_cs_if_ac_clock_selector_descriptor {
862     uint8_t bLength;
863     uint8_t bDescriptorType;
864     uint8_t bDescriptorSubtype;
865     uint8_t bClockID;
866     uint8_t bNrInPins;
867     uint8_t baCSourceID[1];
868     uint8_t iClockSelector;
869 } __PACKED;
870 
871 #define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(n) (7 + n)
872 
873 struct audio_v2_cs_if_ac_clock_multiplier_descriptor {
874     uint8_t bLength;
875     uint8_t bDescriptorType;
876     uint8_t bDescriptorSubtype;
877     uint8_t bClockID;
878     uint8_t bCSourceID;
879     uint8_t bmControls;
880     uint8_t iClockMultiplier;
881 } __PACKED;
882 
883 #define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC() (7)
884 
885 struct audio_v2_cs_if_ac_input_terminal_descriptor {
886     uint8_t bLength;
887     uint8_t bDescriptorType;
888     uint8_t bDescriptorSubtype;
889     uint8_t bTerminalID;
890     uint16_t wTerminalType;
891     uint8_t bAssocTerminal;
892     uint8_t bCSourceID;
893     uint8_t bNrChannels;
894     uint32_t wChannelConfig;
895     uint8_t iChannelNames;
896     uint16_t bmControls;
897     uint8_t iTerminal;
898 } __PACKED;
899 
900 #define AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC (17)
901 
902 struct audio_v2_cs_if_ac_output_terminal_descriptor {
903     uint8_t bLength;
904     uint8_t bDescriptorType;
905     uint8_t bDescriptorSubtype;
906     uint8_t bTerminalID;
907     uint16_t wTerminalType;
908     uint8_t bAssocTerminal;
909     uint8_t bSourceID;
910     uint8_t bCSourceID;
911     uint16_t bmControls;
912     uint8_t iTerminal;
913 } __PACKED;
914 
915 #define AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC (12)
916 
917 struct audio_v2_cs_if_ac_feature_unit_descriptor {
918     uint8_t bLength;
919     uint8_t bDescriptorType;
920     uint8_t bDescriptorSubtype;
921     uint8_t bUnitID;
922     uint8_t bSourceID;
923     uint32_t bmaControls[1];
924     uint8_t iFeature;
925 } __PACKED;
926 
927 #define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + (ch + 1) * 4)
928 
929 struct audio_v2_cs_if_as_general_descriptor {
930     uint8_t bLength;
931     uint8_t bDescriptorType;
932     uint8_t bDescriptorSubtype;
933     uint8_t bTerminalLink;
934     uint8_t bmControls;
935     uint8_t bFormatType;
936     uint32_t bmFormats;
937     uint8_t bNrChannels;
938     uint32_t bmChannelConfig;
939     uint8_t iChannelNames;
940 } __PACKED;
941 
942 #define AUDIO_V2_SIZEOF_AS_GENERAL_DESC (16)
943 
944 struct audio_v2_control_range1_param_block {
945     uint16_t wNumSubRanges;
946     struct
947     {
948         uint8_t bMin;
949         uint8_t bMax;
950         uint8_t bRes;
951     }subrange[];
952 } __PACKED;
953 
954 struct audio_v2_control_range2_param_block {
955     uint16_t wNumSubRanges;
956     struct
957     {
958         uint16_t wMin;
959         uint16_t wMax;
960         uint16_t wRes;
961     }subrange[];
962 } __PACKED;
963 
964 struct audio_v2_control_range3_param_block {
965     uint16_t wNumSubRanges;
966     struct
967     {
968         uint32_t dMin;
969         uint32_t dMax;
970         uint32_t dRes;
971     }subrange[];
972 } __PACKED;
973 
974 #define AUDIO_V2_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, bCategory, bmControls, stridx) \
975     /* Interface Association Descriptor */                                                                                       \
976     0x08,                                                                                                                        \
977     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                   \
978     bFirstInterface,                                                                                                             \
979     bInterfaceCount,                                                                                                             \
980     USB_DEVICE_CLASS_AUDIO,                                                                                                      \
981     AUDIO_SUBCLASS_UNDEFINED,                                                                                                    \
982     AUDIO_PROTOCOLv20,                                                                                                           \
983     0x00,                                                                                                                        \
984     /* ------------------ AudioControl Interface ------------------ */\
985     0x09,                            /* bLength */                                                                               \
986     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                       \
987     bFirstInterface,                 /* bInterfaceNumber */                                                                      \
988     0x00,                            /* bAlternateSetting */                                                                     \
989     0x00,                            /* bNumEndpoints */                                                                         \
990     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                       \
991     AUDIO_SUBCLASS_AUDIOCONTROL,     /* bInterfaceSubClass */                                                                    \
992     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                    \
993     stridx,                          /* iInterface */                                                                            \
994     0x09,                            /* bLength */                                                                               \
995     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                       \
996     AUDIO_CONTROL_HEADER,            /* bDescriptorSubtype */                                                                    \
997     WBVAL(0x0200),                   /* bcdADC */                                                                                \
998     bCategory,                       /* bCategory */                                                                             \
999     WBVAL(wTotalLength),             /* wTotalLength */                                                                          \
1000     bmControls                       /* bmControls */                                                                            \
1001 
1002 #define AUDIO_V2_AC_DESCRIPTOR_INIT_LEN (0x08 + 0x09 + 0x09)
1003 
1004 #define AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(bClockID, bmAttributes, bmControls) \
1005     0x08,                            /* bLength */                               \
1006     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                       \
1007     AUDIO_CONTROL_CLOCK_SOURCE,      /* bDescriptorSubtype */                    \
1008     bClockID,                        /* bClockID */                              \
1009     bmAttributes,                    /* bmAttributes */                          \
1010     bmControls,                      /* bmControls */                            \
1011     0x00,                            /* bAssocTerminal */                        \
1012     0x00                             /* iClockSource */
1013 
1014 #define AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bCSourceID, bNrChannels, wChannelConfig, bmControls) \
1015     0x11,                            /* bLength */                                                                              \
1016     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                      \
1017     AUDIO_CONTROL_INPUT_TERMINAL,    /* bDescriptorSubtype */                                                                   \
1018     bTerminalID,                     /* bTerminalID */                                                                          \
1019     WBVAL(wTerminalType),            /* wTerminalType : Microphone 0x0201 */                                                    \
1020     0x00,                            /* bAssocTerminal */                                                                       \
1021     bCSourceID,                      /* bCSourceID */                                                                           \
1022     bNrChannels,                     /* bNrChannels */                                                                          \
1023     DBVAL(wChannelConfig),           /* wChannelConfig : Mono sets no position bits */                                          \
1024     0x00,                            /* iChannelNames */                                                                        \
1025     WBVAL(bmControls),               /* bmControls */                                                                           \
1026     0x00                             /* iTerminal */
1027 
1028 #define AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID, bCSourceID, bmControls) \
1029     0x0c,                            /* bLength */                                                 \
1030     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                         \
1031     AUDIO_CONTROL_OUTPUT_TERMINAL,   /* bDescriptorSubtype */                                      \
1032     bTerminalID,                     /* bTerminalID */                                             \
1033     WBVAL(wTerminalType),            /* wTerminalType : USB Streaming */                           \
1034     0x00,                            /* bAssocTerminal */                                          \
1035     bSourceID,                       /* bSourceID */                                               \
1036     bCSourceID,                      /* bCSourceID */                                              \
1037     WBVAL(bmControls),               /* bmControls */                                              \
1038     0x00                             /* iTerminal */
1039 
1040 #define AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, ...) \
1041     0x06 + (PP_NARG(__VA_ARGS__)),   /* bLength */                    \
1042     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */            \
1043     AUDIO_CONTROL_FEATURE_UNIT,      /* bDescriptorSubtype */         \
1044     bUnitID,                         /* bUnitID */                    \
1045     bSourceID,                       /* bSourceID */                  \
1046     __VA_ARGS__,                     /* bmaControls(0) Mute */        \
1047     0x00                             /* iTerminal */
1048 
1049 #define AUDIO_V2_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
1050     0x09,                            /* bLength */                                                                                                                        \
1051     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1052     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1053     0x00,                            /* bAlternateSetting */                                                                                                              \
1054     0x00,                            /* bNumEndpoints */                                                                                                                  \
1055     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1056     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1057     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1058     0x00,                            /* iInterface */                                                                                                                     \
1059     0x09,                            /* bLength */                                                                                                                        \
1060     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1061     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1062     0x01,                            /* bAlternateSetting */                                                                                                              \
1063     0x01,                            /* bNumEndpoints */                                                                                                                  \
1064     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1065     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1066     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1067     0x00,                            /* iInterface */                                                                                                                     \
1068     0x10,                            /* bLength */                                                                                                                        \
1069     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1070     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                                                                             \
1071     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output or Input Terminal*/                                                                         \
1072     0x00,                            /* bmControls */                                                                                                                     \
1073     AUDIO_FORMAT_TYPE_I,             /* bFormatType : AUDIO_FORMAT_TYPE_I */                                                                                              \
1074     DBVAL(AUDIO_V2_FORMAT_PCM),      /* bmFormats PCM */                                                                                                                  \
1075     bNrChannels,                     /* bNrChannels */                                                                                                                    \
1076     DBVAL(bmChannelConfig),          /* bmChannelConfig */                                                                                                                \
1077     0x00,                            /* iChannelNames */                                                                                                                  \
1078     0x06,                            /* bLength */                                                                                                                        \
1079     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1080     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                                                                             \
1081     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                                                                    \
1082     bSubslotSize,                    /* bSubslotSize */                                                                                                                   \
1083     bBitResolution,                  /* bBitResolution */                                                                                                                 \
1084     0x07,                            /* bLength */                                                                                                                        \
1085     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1086     bEndpointAddress,                /* bEndpointAddress 3 out endpoint for Audio */                                                                                      \
1087     bmAttributes,                    /* bmAttributes */                                                                                                                   \
1088     WBVAL(wMaxPacketSize),           /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */                                                         \
1089     bInterval,                       /* bInterval */                                                                                                                      \
1090     0x08,                            /* bLength */                                                                                                                        \
1091     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                                                                                \
1092     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                                                                    \
1093     0x00,                            /* bmAttributes */                                                                                                                   \
1094     0x00,                            /* bmControls */                                                                                                                     \
1095     0x00,                            /* bLockDelayUnits */                                                                                                                \
1096     0x00,                            /* wLockDelay */                                                                                                                     \
1097     0x00
1098 
1099 #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress) \
1100     0x09,                            /* bLength */                                                                                                                        \
1101     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1102     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1103     0x00,                            /* bAlternateSetting */                                                                                                              \
1104     0x00,                            /* bNumEndpoints */                                                                                                                  \
1105     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1106     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1107     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1108     0x00,                            /* iInterface */                                                                                                                     \
1109     0x09,                            /* bLength */                                                                                                                        \
1110     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1111     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1112     0x01,                            /* bAlternateSetting */                                                                                                              \
1113     0x02,                            /* bNumEndpoints */                                                                                                                  \
1114     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1115     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1116     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1117     0x00,                            /* iInterface */                                                                                                                     \
1118     0x10,                            /* bLength */                                                                                                                        \
1119     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1120     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                                                                             \
1121     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output or Input Terminal*/                                                                         \
1122     0x00,                            /* bmControls */                                                                                                                     \
1123     AUDIO_FORMAT_TYPE_I,             /* bFormatType : AUDIO_FORMAT_TYPE_I */                                                                                              \
1124     DBVAL(AUDIO_V2_FORMAT_PCM),      /* bmFormats PCM */                                                                                                                  \
1125     bNrChannels,                     /* bNrChannels */                                                                                                                    \
1126     DBVAL(bmChannelConfig),          /* bmChannelConfig */                                                                                                                \
1127     0x00,                            /* iChannelNames */                                                                                                                  \
1128     0x06,                            /* bLength */                                                                                                                        \
1129     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1130     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                                                                             \
1131     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                                                                    \
1132     bSubslotSize,                    /* bSubslotSize */                                                                                                                   \
1133     bBitResolution,                  /* bBitResolution */                                                                                                                 \
1134     0x07,                            /* bLength */                                                                                                                        \
1135     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1136     bEndpointAddress,                /* bEndpointAddress 3 out endpoint for Audio */                                                                                      \
1137     0x05,                            /* bmAttributes: TransferType=Isochronous  SyncType=Asynchronous  EndpointType=Data*/                                                \
1138     WBVAL(wMaxPacketSize),           /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */                                                         \
1139     bInterval,                       /* bInterval */                                                                                                                      \
1140     0x08,                            /* bLength */                                                                                                                        \
1141     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                                                                                \
1142     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                                                                    \
1143     0x00,                            /* bmAttributes */                                                                                                                   \
1144     0x00,                            /* bmControls */                                                                                                                     \
1145     0x00,                            /* bLockDelayUnits */                                                                                                                \
1146     0x00,                            /* wLockDelay */                                                                                                                     \
1147     0x00,                                                                                                                                                                 \
1148     0x07,                            /* bLength */                                                                                                                        \
1149     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1150     bFeedbackEndpointAddress,        /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */                                                                        \
1151     0x11,                            /* bmAttributes: TransferType=Isochronous  SyncType=None  EndpointType=Feedback */                                                   \
1152     WBVAL(4),                        /* XXXX wMaxPacketSize in Bytes */                                                                                                   \
1153     bInterval                        /* bInterval */                                                                                                                      \
1154 
1155 // clang-format on
1156 
1157 #define AUDIO_V2_AS_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08)
1158 #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07)
1159 
1160 #define AUDIO_SAMPLE_FREQ_NUM(num) (uint8_t)(num), (uint8_t)((num >> 8))
1161 #define AUDIO_SAMPLE_FREQ_3B(frq)  (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
1162 #define AUDIO_SAMPLE_FREQ_4B(frq)  (uint8_t)(frq), (uint8_t)((frq >> 8)), \
1163                                   (uint8_t)((frq >> 16)), (uint8_t)((frq >> 24))
1164 
1165 #endif /* USB_AUDIO_H */
1166