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