usb_audio.h 58 KB

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