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_ac_selector_unit_descriptor {
652     uint8_t bLength;
653     uint8_t bDescriptorType;
654     uint8_t bDescriptorSubtype;
655     uint8_t bUnitID;
656     uint8_t bNrInPins;
657     uint8_t baSourceID[1];
658     uint8_t iSelector;
659 } __PACKED;
660 
661 #define AUDIO_SIZEOF_AC_SELECTOR_UNIT_DESC(n) (6 + n)
662 
663 struct audio_cs_if_as_general_descriptor {
664     uint8_t bLength;
665     uint8_t bDescriptorType;
666     uint8_t bDescriptorSubtype;
667     uint8_t bTerminalLink;
668     uint8_t bDelay;
669     uint16_t wFormatTag;
670 } __PACKED;
671 
672 #define AUDIO_SIZEOF_AS_GENERAL_DESC (7)
673 
674 struct audio_cs_if_as_format_type_descriptor {
675     uint8_t bLength;
676     uint8_t bDescriptorType;
677     uint8_t bDescriptorSubtype;
678     uint8_t bFormatType;
679     uint8_t bNrChannels;
680     uint8_t bSubframeSize;
681     uint8_t bBitResolution;
682     uint8_t bSamFreqType;
683     uint8_t tSamFreq[3];
684 } __PACKED;
685 
686 #define AUDIO_SIZEOF_FORMAT_TYPE_DESC(n) (8 + 3 * n)
687 
688 struct audio_ep_descriptor {
689     uint8_t bLength;
690     uint8_t bDescriptorType;
691     uint8_t bEndpointAddress;
692     uint8_t bmAttributes;
693     uint16_t wMaxPacketSize;
694     uint8_t bInterval;
695     uint8_t bRefresh;
696     uint8_t bSynchAddress;
697 } __PACKED;
698 
699 #define AUDIO_SIZEOF_EP_DESC (9)
700 
701 struct audio_cs_ep_ep_general_descriptor {
702     uint8_t bLength;
703     uint8_t bDescriptorType;
704     uint8_t bDescriptorSubtype;
705     uint8_t bmAttributes;
706     uint8_t bLockDelayUnits;
707     uint16_t wLockDelay;
708 } __PACKED;
709 
710 #define AUDIO_SIZEOF_CS_EP_GENERAL_DESC (7)
711 
712 // clang-format off
713 #define AUDIO_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, stridx, ...) \
714     /* Interface Association Descriptor */                                                                                       \
715     0x08,                                                                                                                        \
716     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                   \
717     bFirstInterface,                                                                                                             \
718     bInterfaceCount,                                                                                                             \
719     USB_DEVICE_CLASS_AUDIO,                                                                                                      \
720     AUDIO_SUBCLASS_AUDIOCONTROL,                                                                                                 \
721     AUDIO_PROTOCOL_UNDEFINED,                                                                                                    \
722     0x00,                                                                                                                        \
723     /* ------------------ AudioControl Interface ------------------ */\
724     0x09,                            /* bLength */                                                                               \
725     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                       \
726     bFirstInterface,                 /* bInterfaceNumber */                                                                      \
727     0x00,                            /* bAlternateSetting */                                                                     \
728     0x00,                            /* bNumEndpoints */                                                                         \
729     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                       \
730     AUDIO_SUBCLASS_AUDIOCONTROL,     /* bInterfaceSubClass */                                                                    \
731     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                                    \
732     stridx,                          /* iInterface */                                                                            \
733     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                               \
734     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                       \
735     AUDIO_CONTROL_HEADER,            /* bDescriptorSubtype */                                                                    \
736     WBVAL(0x0100),                   /* bcdADC */                                                                                \
737     WBVAL(wTotalLength),             /* wTotalLength */                                                                          \
738     PP_NARG(__VA_ARGS__),            /* bInCollection */                                                                         \
739     __VA_ARGS__                      /* baInterfaceNr */
740 
741 #define AUDIO_AC_DESCRIPTOR_INIT_LEN(n) (0x08 + 0x09 + 0x08 + n)
742 
743 #define AUDIO_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bNrChannels, wChannelConfig) \
744     0x0C,                            /* bLength */                                                   \
745     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                           \
746     AUDIO_CONTROL_INPUT_TERMINAL,    /* bDescriptorSubtype */                                        \
747     bTerminalID,                     /* bTerminalID */                                               \
748     WBVAL(wTerminalType),            /* wTerminalType : Microphone 0x0201 */                         \
749     0x00,                            /* bAssocTerminal */                                            \
750     bNrChannels,                     /* bNrChannels */                                               \
751     WBVAL(wChannelConfig),           /* wChannelConfig : Mono sets no position bits */               \
752     0x00,                            /* iChannelNames */                                             \
753     0x00                             /* iTerminal */
754 
755 #define AUDIO_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID) \
756     0x09,                            /* bLength */                                  \
757     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                          \
758     AUDIO_CONTROL_OUTPUT_TERMINAL,   /* bDescriptorSubtype */                       \
759     bTerminalID,                     /* bTerminalID */                              \
760     WBVAL(wTerminalType),            /* wTerminalType : USB Streaming */            \
761     0x00,                            /* bAssocTerminal */                           \
762     bSourceID,                       /* bSourceID */                                \
763     0x00                             /* iTerminal */
764 
765 #define AUDIO_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, bControlSize, ...) \
766     0x07 + PP_NARG(__VA_ARGS__),     /* bLength */                               \
767     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                       \
768     AUDIO_CONTROL_FEATURE_UNIT,      /* bDescriptorSubtype */                    \
769     bUnitID,                         /* bUnitID */                               \
770     bSourceID,                       /* bSourceID */                             \
771     bControlSize,                    /* bControlSize */                          \
772     __VA_ARGS__,                     /* bmaControls(0) Mute */                   \
773     0x00                             /* iTerminal */
774 
775 #define AUDIO_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \
776     0x09,                            /* bLength */                                                                       \
777     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
778     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
779     0x00,                            /* bAlternateSetting */                                                             \
780     0x00,                            /* bNumEndpoints */                                                                 \
781     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
782     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
783     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
784     0x00,                            /* iInterface */                                                                    \
785     0x09,                            /* bLength */                                                                       \
786     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
787     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
788     0x01,                            /* bAlternateSetting */                                                             \
789     0x01,                            /* bNumEndpoints */                                                                 \
790     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
791     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
792     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
793     0x00,                            /* iInterface */                                                                    \
794     0x07,                            /* bLength */                                                                       \
795     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
796     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                            \
797     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output Terminal*/                                 \
798     0x01,                            /* bDelay */                                                                        \
799     WBVAL(AUDIO_FORMAT_PCM),         /* wFormatTag : AUDIO_FORMAT_PCM */                                                 \
800     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                       \
801     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
802     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                            \
803     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                   \
804     bNrChannels,                     /* bNrChannels */                                                                   \
805     bSubFrameSize,                   /* bSubFrameSize : Bytes per audio subframe */                                      \
806     bBitResolution,                  /* bBitResolution : bits per sample */                                              \
807     (PP_NARG(__VA_ARGS__)/3),        /* bSamFreqType : only one frequency supported */                                   \
808     __VA_ARGS__,                     /* tSamFreq : Audio sampling frequency coded on 3 bytes */                          \
809     0x09,                            /* bLength */                                                                       \
810     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                               \
811     bEndpointAddress,                /* bEndpointAddress : IN endpoint 1 */                                              \
812     bmAttributes,                    /* bmAttributes */                                                                  \
813     WBVAL(wMaxPacketSize),           /* wMaxPacketSize */                                                                \
814     bInterval,                       /* bInterval : one packet per frame */                                              \
815     0x00,                            /* bRefresh */                                                                      \
816     0x00,                            /* bSynchAddress */                                                                 \
817     0x07,                            /* bLength */                                                                       \
818     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                               \
819     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                   \
820     AUDIO_EP_CONTROL_SAMPLING_FEQ,   /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */                                      \
821     0x00,                            /* bLockDelayUnits */                                                               \
822     0x00,                            /* wLockDelay */                                                                    \
823     0x00
824 
825 #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress, ...) \
826     0x09,                            /* bLength */                                                                       \
827     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
828     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
829     0x00,                            /* bAlternateSetting */                                                             \
830     0x00,                            /* bNumEndpoints */                                                                 \
831     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
832     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
833     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
834     0x00,                            /* iInterface */                                                                    \
835     0x09,                            /* bLength */                                                                       \
836     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
837     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
838     0x01,                            /* bAlternateSetting */                                                             \
839     0x02,                            /* bNumEndpoints */                                                                 \
840     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
841     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
842     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
843     0x00,                            /* iInterface */                                                                    \
844     0x07,                            /* bLength */                                                                       \
845     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
846     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                            \
847     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output Terminal*/                                 \
848     0x01,                            /* bDelay */                                                                        \
849     WBVAL(AUDIO_FORMAT_PCM),         /* wFormatTag : AUDIO_FORMAT_PCM */                                                 \
850     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                       \
851     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
852     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                            \
853     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                   \
854     bNrChannels,                     /* bNrChannels */                                                                   \
855     bSubFrameSize,                   /* bSubFrameSize : Bytes per audio subframe */                                      \
856     bBitResolution,                  /* bBitResolution : bits per sample */                                              \
857     (PP_NARG(__VA_ARGS__)/3),        /* bSamFreqType : only one frequency supported */                                   \
858     __VA_ARGS__,                     /* tSamFreq : Audio sampling frequency coded on 3 bytes */                          \
859     0x09,                            /* bLength */                                                                       \
860     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                               \
861     bEndpointAddress,                /* bEndpointAddress : IN endpoint 1 */                                              \
862     0x05,                            /* bmAttributes */                                                                  \
863     WBVAL(wMaxPacketSize),           /* wMaxPacketSize */                                                                \
864     bInterval,                       /* bInterval : one packet per frame */                                              \
865     0x00,                            /* bRefresh */                                                                      \
866     bFeedbackEndpointAddress,        /* bSynchAddress */                                                                 \
867     0x07,                            /* bLength */                                                                       \
868     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                               \
869     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                   \
870     AUDIO_EP_CONTROL_SAMPLING_FEQ,   /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */                                      \
871     0x00,                            /* bLockDelayUnits */                                                               \
872     0x00,                            /* wLockDelay */                                                                    \
873     0x00,                                                                                                                \
874     0x09,                            /* bLength */                                                                       \
875     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                               \
876     bFeedbackEndpointAddress,        /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */                       \
877     0x11,                            /* bmAttributes: TransferType=Isochronous  SyncType=None  EndpointType=Feedback */  \
878     WBVAL(4),                        /* XXXX wMaxPacketSize in Bytes */                                                  \
879     bInterval,                       /* bInterval */                                                                     \
880     0x03,                            /* bRefresh, 8ms */                                                                 \
881     0x00                             /* bSynchAddress */
882 
883 #define AUDIO_AS_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
884 #define AUDIO_AS_FEEDBACK_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07 + 0x09)
885 
886 #define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bSubFrameSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval, ...) \
887     0x09,                            /* bLength */                                                                       \
888     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
889     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
890     bAlternateSetting,               /* bAlternateSetting */                                                             \
891     0x01,                            /* bNumEndpoints */                                                                 \
892     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
893     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
894     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
895     0x00,                            /* iInterface */                                                                    \
896     0x07,                            /* bLength */                                                                       \
897     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
898     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                            \
899     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output Terminal*/                                 \
900     0x01,                            /* bDelay */                                                                        \
901     WBVAL(AUDIO_FORMAT_PCM),         /* wFormatTag : AUDIO_FORMAT_PCM */                                                 \
902     0x08 + PP_NARG(__VA_ARGS__),     /* bLength */                                                                       \
903     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                               \
904     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                            \
905     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                   \
906     bNrChannels,                     /* bNrChannels */                                                                   \
907     bSubFrameSize,                   /* bSubFrameSize : Bytes per audio subframe */                                      \
908     bBitResolution,                  /* bBitResolution : bits per sample */                                              \
909     (PP_NARG(__VA_ARGS__)/3),        /* bSamFreqType : only one frequency supported */                                   \
910     __VA_ARGS__,                     /* tSamFreq : Audio sampling frequency coded on 3 bytes */                          \
911     0x09,                            /* bLength */                                                                       \
912     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                               \
913     bEndpointAddress,                /* bEndpointAddress : IN endpoint 1 */                                              \
914     bmAttributes,                    /* bmAttributes */                                                                  \
915     WBVAL(wMaxPacketSize),           /* wMaxPacketSize */                                                                \
916     bInterval,                       /* bInterval : one packet per frame */                                              \
917     0x00,                            /* bRefresh */                                                                      \
918     0x00,                            /* bSynchAddress */                                                                 \
919     0x07,                            /* bLength */                                                                       \
920     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                               \
921     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                   \
922     AUDIO_EP_CONTROL_SAMPLING_FEQ,   /* bmAttributes AUDIO_SAMPLING_FREQ_CONTROL */                                      \
923     0x00,                            /* bLockDelayUnits */                                                               \
924     0x00,                            /* wLockDelay */                                                                    \
925     0x00
926 
927 #define AUDIO_AS_ALTSETTING_DESCRIPTOR_INIT_LEN(n) (0x09 + 0x07 + 0x08 + 3 * n + 0x09 + 0x07)
928 
929 #define AUDIO_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber)                                               \
930     0x09,                            /* bLength */                                                                       \
931     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
932     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
933     0x00,                            /* bAlternateSetting */                                                             \
934     0x01,                            /* bNumEndpoints */                                                                 \
935     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
936     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
937     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
938     0x00                             /* iInterface */
939 
940 #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT(bInterfaceNumber, bNumEndpoints)                                               \
941     0x09,                            /* bLength */                                                                       \
942     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
943     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
944     0x00,                            /* bAlternateSetting */                                                             \
945     bNumEndpoints,                   /* bNumEndpoints */                                                                 \
946     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
947     AUDIO_SUBCLASS_MIDISTREAMING,    /* bInterfaceSubClass */                                                            \
948     AUDIO_PROTOCOL_UNDEFINED,        /* bInterfaceProtocol */                                                            \
949     0x00                             /* iInterface */
950 
951 #define AUDIO_MS_STANDARD_DESCRIPTOR_INIT_LEN 0x09
952 
953 struct audio_v2_channel_cluster_descriptor {
954     uint8_t bNrChannels;
955     uint32_t bmChannelConfig;
956     uint8_t iChannelNames;
957 } __PACKED;
958 
959 #define AUDIO_V2_SIZEOF_CHANNEL_CLUSTER_DESC (6)
960 
961 struct audio_v2_cs_if_ac_header_descriptor {
962     uint8_t bLength;
963     uint8_t bDescriptorType;
964     uint8_t bDescriptorSubtype;
965     uint16_t bcdADC;
966     uint8_t bCategory;
967     uint16_t wTotalLength;
968     uint8_t bmControls;
969 } __PACKED;
970 
971 #define AUDIO_V2_SIZEOF_AC_HEADER_DESC (9)
972 
973 struct audio_v2_cs_if_ac_clock_source_descriptor {
974     uint8_t bLength;
975     uint8_t bDescriptorType;
976     uint8_t bDescriptorSubtype;
977     uint8_t bClockID;
978     uint8_t bmAttributes;
979     uint8_t bmControls;
980     uint8_t bAssocTerminal;
981     uint8_t iClockSource;
982 } __PACKED;
983 
984 #define AUDIO_V2_SIZEOF_AC_CLOCK_SOURCE_DESC (8)
985 
986 struct audio_v2_cs_if_ac_clock_selector_descriptor {
987     uint8_t bLength;
988     uint8_t bDescriptorType;
989     uint8_t bDescriptorSubtype;
990     uint8_t bClockID;
991     uint8_t bNrInPins;
992     uint8_t baCSourceID[1];
993     uint8_t iClockSelector;
994 } __PACKED;
995 
996 #define AUDIO_SIZEOF_AC_CLOCK_SELECTOR_DESC(n) (7 + n)
997 
998 struct audio_v2_cs_if_ac_clock_multiplier_descriptor {
999     uint8_t bLength;
1000     uint8_t bDescriptorType;
1001     uint8_t bDescriptorSubtype;
1002     uint8_t bClockID;
1003     uint8_t bCSourceID;
1004     uint8_t bmControls;
1005     uint8_t iClockMultiplier;
1006 } __PACKED;
1007 
1008 #define AUDIO_SIZEOF_AC_CLOCK_MULTIPLIER_DESC() (7)
1009 
1010 struct audio_v2_cs_if_ac_input_terminal_descriptor {
1011     uint8_t bLength;
1012     uint8_t bDescriptorType;
1013     uint8_t bDescriptorSubtype;
1014     uint8_t bTerminalID;
1015     uint16_t wTerminalType;
1016     uint8_t bAssocTerminal;
1017     uint8_t bCSourceID;
1018     uint8_t bNrChannels;
1019     uint32_t wChannelConfig;
1020     uint8_t iChannelNames;
1021     uint16_t bmControls;
1022     uint8_t iTerminal;
1023 } __PACKED;
1024 
1025 #define AUDIO_V2_SIZEOF_AC_INPUT_TERMINAL_DESC (17)
1026 
1027 struct audio_v2_cs_if_ac_output_terminal_descriptor {
1028     uint8_t bLength;
1029     uint8_t bDescriptorType;
1030     uint8_t bDescriptorSubtype;
1031     uint8_t bTerminalID;
1032     uint16_t wTerminalType;
1033     uint8_t bAssocTerminal;
1034     uint8_t bSourceID;
1035     uint8_t bCSourceID;
1036     uint16_t bmControls;
1037     uint8_t iTerminal;
1038 } __PACKED;
1039 
1040 #define AUDIO_V2_SIZEOF_AC_OUTPUT_TERMINAL_DESC (12)
1041 
1042 struct audio_v2_cs_if_ac_feature_unit_descriptor {
1043     uint8_t bLength;
1044     uint8_t bDescriptorType;
1045     uint8_t bDescriptorSubtype;
1046     uint8_t bUnitID;
1047     uint8_t bSourceID;
1048     uint32_t bmaControls[1];
1049     uint8_t iFeature;
1050 } __PACKED;
1051 
1052 #define AUDIO_V2_SIZEOF_AC_FEATURE_UNIT_DESC(ch) (6 + (ch + 1) * 4)
1053 
1054 struct audio_v2_cs_if_as_general_descriptor {
1055     uint8_t bLength;
1056     uint8_t bDescriptorType;
1057     uint8_t bDescriptorSubtype;
1058     uint8_t bTerminalLink;
1059     uint8_t bmControls;
1060     uint8_t bFormatType;
1061     uint32_t bmFormats;
1062     uint8_t bNrChannels;
1063     uint32_t bmChannelConfig;
1064     uint8_t iChannelNames;
1065 } __PACKED;
1066 
1067 #define AUDIO_V2_SIZEOF_AS_GENERAL_DESC (16)
1068 
1069 struct audio_v2_control_range1_param_block {
1070     uint16_t wNumSubRanges;
1071     struct
1072     {
1073         uint8_t bMin;
1074         uint8_t bMax;
1075         uint8_t bRes;
1076     }subrange[];
1077 } __PACKED;
1078 
1079 struct audio_v2_control_range2_param_block {
1080     uint16_t wNumSubRanges;
1081     struct
1082     {
1083         uint16_t wMin;
1084         uint16_t wMax;
1085         uint16_t wRes;
1086     }subrange[];
1087 } __PACKED;
1088 
1089 struct audio_v2_control_range3_param_block {
1090     uint16_t wNumSubRanges;
1091     struct
1092     {
1093         uint32_t dMin;
1094         uint32_t dMax;
1095         uint32_t dRes;
1096     }subrange[];
1097 } __PACKED;
1098 
1099 #define AUDIO_V2_AC_DESCRIPTOR_INIT(bFirstInterface, bInterfaceCount, wTotalLength, bCategory, bmControls, stridx) \
1100     /* Interface Association Descriptor */                                                                                       \
1101     0x08,                                                                                                                        \
1102     USB_DESCRIPTOR_TYPE_INTERFACE_ASSOCIATION,                                                                                   \
1103     bFirstInterface,                                                                                                             \
1104     bInterfaceCount,                                                                                                             \
1105     USB_DEVICE_CLASS_AUDIO,                                                                                                      \
1106     AUDIO_SUBCLASS_UNDEFINED,                                                                                                    \
1107     AUDIO_PROTOCOLv20,                                                                                                           \
1108     0x00,                                                                                                                        \
1109     /* ------------------ AudioControl Interface ------------------ */\
1110     0x09,                            /* bLength */                                                                               \
1111     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                       \
1112     bFirstInterface,                 /* bInterfaceNumber */                                                                      \
1113     0x00,                            /* bAlternateSetting */                                                                     \
1114     0x00,                            /* bNumEndpoints */                                                                         \
1115     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                       \
1116     AUDIO_SUBCLASS_AUDIOCONTROL,     /* bInterfaceSubClass */                                                                    \
1117     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                    \
1118     stridx,                          /* iInterface */                                                                            \
1119     0x09,                            /* bLength */                                                                               \
1120     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                       \
1121     AUDIO_CONTROL_HEADER,            /* bDescriptorSubtype */                                                                    \
1122     WBVAL(0x0200),                   /* bcdADC */                                                                                \
1123     bCategory,                       /* bCategory */                                                                             \
1124     WBVAL(wTotalLength),             /* wTotalLength */                                                                          \
1125     bmControls                       /* bmControls */                                                                            \
1126 
1127 #define AUDIO_V2_AC_DESCRIPTOR_INIT_LEN (0x08 + 0x09 + 0x09)
1128 
1129 #define AUDIO_V2_AC_CLOCK_SOURCE_DESCRIPTOR_INIT(bClockID, bmAttributes, bmControls) \
1130     0x08,                            /* bLength */                               \
1131     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                       \
1132     AUDIO_CONTROL_CLOCK_SOURCE,      /* bDescriptorSubtype */                    \
1133     bClockID,                        /* bClockID */                              \
1134     bmAttributes,                    /* bmAttributes */                          \
1135     bmControls,                      /* bmControls */                            \
1136     0x00,                            /* bAssocTerminal */                        \
1137     0x00                             /* iClockSource */
1138 
1139 #define AUDIO_V2_AC_INPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bCSourceID, bNrChannels, wChannelConfig, bmControls) \
1140     0x11,                            /* bLength */                                                                              \
1141     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                      \
1142     AUDIO_CONTROL_INPUT_TERMINAL,    /* bDescriptorSubtype */                                                                   \
1143     bTerminalID,                     /* bTerminalID */                                                                          \
1144     WBVAL(wTerminalType),            /* wTerminalType : Microphone 0x0201 */                                                    \
1145     0x00,                            /* bAssocTerminal */                                                                       \
1146     bCSourceID,                      /* bCSourceID */                                                                           \
1147     bNrChannels,                     /* bNrChannels */                                                                          \
1148     DBVAL(wChannelConfig),           /* wChannelConfig : Mono sets no position bits */                                          \
1149     0x00,                            /* iChannelNames */                                                                        \
1150     WBVAL(bmControls),               /* bmControls */                                                                           \
1151     0x00                             /* iTerminal */
1152 
1153 #define AUDIO_V2_AC_OUTPUT_TERMINAL_DESCRIPTOR_INIT(bTerminalID, wTerminalType, bSourceID, bCSourceID, bmControls) \
1154     0x0c,                            /* bLength */                                                 \
1155     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                         \
1156     AUDIO_CONTROL_OUTPUT_TERMINAL,   /* bDescriptorSubtype */                                      \
1157     bTerminalID,                     /* bTerminalID */                                             \
1158     WBVAL(wTerminalType),            /* wTerminalType : USB Streaming */                           \
1159     0x00,                            /* bAssocTerminal */                                          \
1160     bSourceID,                       /* bSourceID */                                               \
1161     bCSourceID,                      /* bCSourceID */                                              \
1162     WBVAL(bmControls),               /* bmControls */                                              \
1163     0x00                             /* iTerminal */
1164 
1165 #define AUDIO_V2_AC_FEATURE_UNIT_DESCRIPTOR_INIT(bUnitID, bSourceID, ...) \
1166     0x06 + (PP_NARG(__VA_ARGS__)),   /* bLength */                    \
1167     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */            \
1168     AUDIO_CONTROL_FEATURE_UNIT,      /* bDescriptorSubtype */         \
1169     bUnitID,                         /* bUnitID */                    \
1170     bSourceID,                       /* bSourceID */                  \
1171     __VA_ARGS__,                     /* bmaControls(0) Mute */        \
1172     0x00                             /* iTerminal */
1173 
1174 #define AUDIO_V2_AS_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
1175     0x09,                            /* bLength */                                                                                                                        \
1176     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1177     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1178     0x00,                            /* bAlternateSetting */                                                                                                              \
1179     0x00,                            /* bNumEndpoints */                                                                                                                  \
1180     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1181     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1182     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1183     0x00,                            /* iInterface */                                                                                                                     \
1184     0x09,                            /* bLength */                                                                                                                        \
1185     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1186     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1187     0x01,                            /* bAlternateSetting */                                                                                                              \
1188     0x01,                            /* bNumEndpoints */                                                                                                                  \
1189     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1190     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1191     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1192     0x00,                            /* iInterface */                                                                                                                     \
1193     0x10,                            /* bLength */                                                                                                                        \
1194     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1195     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                                                                             \
1196     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output or Input Terminal*/                                                                         \
1197     0x00,                            /* bmControls */                                                                                                                     \
1198     AUDIO_FORMAT_TYPE_I,             /* bFormatType : AUDIO_FORMAT_TYPE_I */                                                                                              \
1199     DBVAL(AUDIO_V2_FORMAT_PCM),      /* bmFormats PCM */                                                                                                                  \
1200     bNrChannels,                     /* bNrChannels */                                                                                                                    \
1201     DBVAL(bmChannelConfig),          /* bmChannelConfig */                                                                                                                \
1202     0x00,                            /* iChannelNames */                                                                                                                  \
1203     0x06,                            /* bLength */                                                                                                                        \
1204     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1205     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                                                                             \
1206     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                                                                    \
1207     bSubslotSize,                    /* bSubslotSize */                                                                                                                   \
1208     bBitResolution,                  /* bBitResolution */                                                                                                                 \
1209     0x07,                            /* bLength */                                                                                                                        \
1210     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1211     bEndpointAddress,                /* bEndpointAddress 3 out endpoint for Audio */                                                                                      \
1212     bmAttributes,                    /* bmAttributes */                                                                                                                   \
1213     WBVAL(wMaxPacketSize),           /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */                                                         \
1214     bInterval,                       /* bInterval */                                                                                                                      \
1215     0x08,                            /* bLength */                                                                                                                        \
1216     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                                                                                \
1217     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                                                                    \
1218     0x00,                            /* bmAttributes */                                                                                                                   \
1219     0x00,                            /* bmControls */                                                                                                                     \
1220     0x00,                            /* bLockDelayUnits */                                                                                                                \
1221     0x00,                            /* wLockDelay */                                                                                                                     \
1222     0x00
1223 
1224 #define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT(bInterfaceNumber, bAlternateSetting, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, bmAttributes, wMaxPacketSize, bInterval) \
1225     0x09,                            /* bLength */                                                                                                                        \
1226     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1227     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1228     bAlternateSetting,               /* bAlternateSetting */                                                                                                              \
1229     0x01,                            /* bNumEndpoints */                                                                                                                  \
1230     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1231     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1232     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1233     0x00,                            /* iInterface */                                                                                                                     \
1234     0x10,                            /* bLength */                                                                                                                        \
1235     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1236     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                                                                             \
1237     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output or Input Terminal*/                                                                         \
1238     0x00,                            /* bmControls */                                                                                                                     \
1239     AUDIO_FORMAT_TYPE_I,             /* bFormatType : AUDIO_FORMAT_TYPE_I */                                                                                              \
1240     DBVAL(AUDIO_V2_FORMAT_PCM),      /* bmFormats PCM */                                                                                                                  \
1241     bNrChannels,                     /* bNrChannels */                                                                                                                    \
1242     DBVAL(bmChannelConfig),          /* bmChannelConfig */                                                                                                                \
1243     0x00,                            /* iChannelNames */                                                                                                                  \
1244     0x06,                            /* bLength */                                                                                                                        \
1245     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1246     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                                                                             \
1247     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                                                                    \
1248     bSubslotSize,                    /* bSubslotSize */                                                                                                                   \
1249     bBitResolution,                  /* bBitResolution */                                                                                                                 \
1250     0x07,                            /* bLength */                                                                                                                        \
1251     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1252     bEndpointAddress,                /* bEndpointAddress 3 out endpoint for Audio */                                                                                      \
1253     bmAttributes,                    /* bmAttributes */                                                                                                                   \
1254     WBVAL(wMaxPacketSize),           /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */                                                         \
1255     bInterval,                       /* bInterval */                                                                                                                      \
1256     0x08,                            /* bLength */                                                                                                                        \
1257     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                                                                                \
1258     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                                                                    \
1259     0x00,                            /* bmAttributes */                                                                                                                   \
1260     0x00,                            /* bmControls */                                                                                                                     \
1261     0x00,                            /* bLockDelayUnits */                                                                                                                \
1262     0x00,                            /* wLockDelay */                                                                                                                     \
1263     0x00
1264 
1265 #define AUDIO_V2_AS_ALTSETTING0_DESCRIPTOR_INIT(bInterfaceNumber)                                               \
1266     0x09,                            /* bLength */                                                                       \
1267     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                               \
1268     bInterfaceNumber,                /* bInterfaceNumber */                                                              \
1269     0x00,                            /* bAlternateSetting */                                                             \
1270     0x01,                            /* bNumEndpoints */                                                                 \
1271     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                               \
1272     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                            \
1273     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                            \
1274     0x00                             /* iInterface */
1275 
1276 #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT(bInterfaceNumber, bTerminalLink, bNrChannels, bmChannelConfig, bSubslotSize, bBitResolution, bEndpointAddress, wMaxPacketSize, bInterval, bFeedbackEndpointAddress) \
1277     0x09,                            /* bLength */                                                                                                                        \
1278     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1279     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1280     0x00,                            /* bAlternateSetting */                                                                                                              \
1281     0x00,                            /* bNumEndpoints */                                                                                                                  \
1282     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1283     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1284     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1285     0x00,                            /* iInterface */                                                                                                                     \
1286     0x09,                            /* bLength */                                                                                                                        \
1287     USB_DESCRIPTOR_TYPE_INTERFACE,   /* bDescriptorType */                                                                                                                \
1288     bInterfaceNumber,                /* bInterfaceNumber */                                                                                                               \
1289     0x01,                            /* bAlternateSetting */                                                                                                              \
1290     0x02,                            /* bNumEndpoints */                                                                                                                  \
1291     USB_DEVICE_CLASS_AUDIO,          /* bInterfaceClass */                                                                                                                \
1292     AUDIO_SUBCLASS_AUDIOSTREAMING,   /* bInterfaceSubClass */                                                                                                             \
1293     AUDIO_PROTOCOLv20,               /* bInterfaceProtocol */                                                                                                             \
1294     0x00,                            /* iInterface */                                                                                                                     \
1295     0x10,                            /* bLength */                                                                                                                        \
1296     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1297     AUDIO_STREAMING_GENERAL,         /* bDescriptorSubtype */                                                                                                             \
1298     bTerminalLink,                   /* bTerminalLink : Unit ID of the Output or Input Terminal*/                                                                         \
1299     0x00,                            /* bmControls */                                                                                                                     \
1300     AUDIO_FORMAT_TYPE_I,             /* bFormatType : AUDIO_FORMAT_TYPE_I */                                                                                              \
1301     DBVAL(AUDIO_V2_FORMAT_PCM),      /* bmFormats PCM */                                                                                                                  \
1302     bNrChannels,                     /* bNrChannels */                                                                                                                    \
1303     DBVAL(bmChannelConfig),          /* bmChannelConfig */                                                                                                                \
1304     0x00,                            /* iChannelNames */                                                                                                                  \
1305     0x06,                            /* bLength */                                                                                                                        \
1306     AUDIO_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */                                                                                                                \
1307     AUDIO_STREAMING_FORMAT_TYPE,     /* bDescriptorSubtype */                                                                                                             \
1308     AUDIO_FORMAT_TYPE_I,             /* bFormatType */                                                                                                                    \
1309     bSubslotSize,                    /* bSubslotSize */                                                                                                                   \
1310     bBitResolution,                  /* bBitResolution */                                                                                                                 \
1311     0x07,                            /* bLength */                                                                                                                        \
1312     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1313     bEndpointAddress,                /* bEndpointAddress 3 out endpoint for Audio */                                                                                      \
1314     0x05,                            /* bmAttributes: TransferType=Isochronous  SyncType=Asynchronous  EndpointType=Data*/                                                \
1315     WBVAL(wMaxPacketSize),           /* XXXX wMaxPacketSize in Bytes (SampleRate * SlotByteSize * NumChannels) */                                                         \
1316     bInterval,                       /* bInterval */                                                                                                                      \
1317     0x08,                            /* bLength */                                                                                                                        \
1318     AUDIO_ENDPOINT_DESCRIPTOR_TYPE,  /* bDescriptorType */                                                                                                                \
1319     AUDIO_ENDPOINT_GENERAL,          /* bDescriptor */                                                                                                                    \
1320     0x00,                            /* bmAttributes */                                                                                                                   \
1321     0x00,                            /* bmControls */                                                                                                                     \
1322     0x00,                            /* bLockDelayUnits */                                                                                                                \
1323     0x00,                            /* wLockDelay */                                                                                                                     \
1324     0x00,                                                                                                                                                                 \
1325     0x07,                            /* bLength */                                                                                                                        \
1326     USB_DESCRIPTOR_TYPE_ENDPOINT,    /* bDescriptorType */                                                                                                                \
1327     bFeedbackEndpointAddress,        /* bFeedbackEndpointAddress Revise Dir to bEndpointAddress */                                                                        \
1328     0x11,                            /* bmAttributes: TransferType=Isochronous  SyncType=None  EndpointType=Feedback */                                                   \
1329     WBVAL(4),                        /* XXXX wMaxPacketSize in Bytes */                                                                                                   \
1330     bInterval                        /* bInterval */
1331 
1332 // clang-format on
1333 
1334 #define AUDIO_V2_AS_DESCRIPTOR_INIT_LEN            (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08)
1335 #define AUDIO_V2_AS_ALTSETTING_DESCRIPTOR_INIT_LEN (0x09 + 0x10 + 0x06 + 0x07 + 0x08)
1336 #define AUDIO_V2_AS_FEEDBACK_DESCRIPTOR_INIT_LEN   (0x09 + 0x09 + 0x10 + 0x06 + 0x07 + 0x08 + 0x07)
1337 
1338 #define AUDIO_SAMPLE_FREQ_NUM(num) (uint8_t)(num), (uint8_t)((num >> 8))
1339 #define AUDIO_SAMPLE_FREQ_3B(frq)  (uint8_t)(frq), (uint8_t)((frq >> 8)), (uint8_t)((frq >> 16))
1340 #define AUDIO_SAMPLE_FREQ_4B(frq)  (uint8_t)(frq), (uint8_t)((frq >> 8)), \
1341                                   (uint8_t)((frq >> 16)), (uint8_t)((frq >> 24))
1342 
1343 /* format 10.14 */
1344 #define AUDIO_FREQ_TO_FEEDBACK_FS(freq) ((freq << 10) / 1000)
1345 #define AUDIO_FEEDBACK_TO_BUF_FS(buf, feedback) \
1346     buf[0] = ((feedback << 4) & 0xFFU);         \
1347     buf[1] = (((feedback << 4) >> 8U) & 0xFFU); \
1348     buf[2] = (((feedback << 4) >> 16U) & 0xFFU)
1349 
1350 /* format 16.16 */
1351 #define AUDIO_FREQ_TO_FEEDBACK_HS(freq) ((freq << 13) / 1000)
1352 #define AUDIO_FEEDBACK_TO_BUF_HS(buf, feedback)                \
1353     buf[0] = (((feedback & 0x00001FFFu) << 3) & 0xFFu);        \
1354     buf[1] = ((((feedback & 0x00001FFFu) << 3) >> 8) & 0xFFu); \
1355     buf[2] = (((feedback & 0x01FFE000u) >> 13) & 0xFFu);       \
1356     buf[3] = (((feedback & 0x01FFE000u) >> 21) & 0xFFu)
1357 
1358 #endif /* USB_AUDIO_H */
1359