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