Home | History | Annotate | Download | only in usb
      1 /*
      2  * <linux/usb/audio.h> -- USB Audio definitions.
      3  *
      4  * Copyright (C) 2006 Thumtronics Pty Ltd.
      5  * Developed for Thumtronics by Grey Innovation
      6  * Ben Williamson <ben.williamson (at) greyinnovation.com>
      7  *
      8  * This software is distributed under the terms of the GNU General Public
      9  * License ("GPL") version 2, as published by the Free Software Foundation.
     10  *
     11  * This file holds USB constants and structures defined
     12  * by the USB Device Class Definition for Audio Devices.
     13  * Comments below reference relevant sections of that document:
     14  *
     15  * http://www.usb.org/developers/devclass_docs/audio10.pdf
     16  *
     17  * Types and defines in this file are either specific to version 1.0 of
     18  * this standard or common for newer versions.
     19  */
     20 
     21 #ifndef _UAPI__LINUX_USB_AUDIO_H
     22 #define _UAPI__LINUX_USB_AUDIO_H
     23 
     24 #include <linux/types.h>
     25 
     26 /* bInterfaceProtocol values to denote the version of the standard used */
     27 #define UAC_VERSION_1			0x00
     28 #define UAC_VERSION_2			0x20
     29 
     30 /* A.2 Audio Interface Subclass Codes */
     31 #define USB_SUBCLASS_AUDIOCONTROL	0x01
     32 #define USB_SUBCLASS_AUDIOSTREAMING	0x02
     33 #define USB_SUBCLASS_MIDISTREAMING	0x03
     34 
     35 /* A.5 Audio Class-Specific AC Interface Descriptor Subtypes */
     36 #define UAC_HEADER			0x01
     37 #define UAC_INPUT_TERMINAL		0x02
     38 #define UAC_OUTPUT_TERMINAL		0x03
     39 #define UAC_MIXER_UNIT			0x04
     40 #define UAC_SELECTOR_UNIT		0x05
     41 #define UAC_FEATURE_UNIT		0x06
     42 #define UAC1_PROCESSING_UNIT		0x07
     43 #define UAC1_EXTENSION_UNIT		0x08
     44 
     45 /* A.6 Audio Class-Specific AS Interface Descriptor Subtypes */
     46 #define UAC_AS_GENERAL			0x01
     47 #define UAC_FORMAT_TYPE			0x02
     48 #define UAC_FORMAT_SPECIFIC		0x03
     49 
     50 /* A.7 Processing Unit Process Types */
     51 #define UAC_PROCESS_UNDEFINED		0x00
     52 #define UAC_PROCESS_UP_DOWNMIX		0x01
     53 #define UAC_PROCESS_DOLBY_PROLOGIC	0x02
     54 #define UAC_PROCESS_STEREO_EXTENDER	0x03
     55 #define UAC_PROCESS_REVERB		0x04
     56 #define UAC_PROCESS_CHORUS		0x05
     57 #define UAC_PROCESS_DYN_RANGE_COMP	0x06
     58 
     59 /* A.8 Audio Class-Specific Endpoint Descriptor Subtypes */
     60 #define UAC_EP_GENERAL			0x01
     61 
     62 /* A.9 Audio Class-Specific Request Codes */
     63 #define UAC_SET_			0x00
     64 #define UAC_GET_			0x80
     65 
     66 #define UAC__CUR			0x1
     67 #define UAC__MIN			0x2
     68 #define UAC__MAX			0x3
     69 #define UAC__RES			0x4
     70 #define UAC__MEM			0x5
     71 
     72 #define UAC_SET_CUR			(UAC_SET_ | UAC__CUR)
     73 #define UAC_GET_CUR			(UAC_GET_ | UAC__CUR)
     74 #define UAC_SET_MIN			(UAC_SET_ | UAC__MIN)
     75 #define UAC_GET_MIN			(UAC_GET_ | UAC__MIN)
     76 #define UAC_SET_MAX			(UAC_SET_ | UAC__MAX)
     77 #define UAC_GET_MAX			(UAC_GET_ | UAC__MAX)
     78 #define UAC_SET_RES			(UAC_SET_ | UAC__RES)
     79 #define UAC_GET_RES			(UAC_GET_ | UAC__RES)
     80 #define UAC_SET_MEM			(UAC_SET_ | UAC__MEM)
     81 #define UAC_GET_MEM			(UAC_GET_ | UAC__MEM)
     82 
     83 #define UAC_GET_STAT			0xff
     84 
     85 /* A.10 Control Selector Codes */
     86 
     87 /* A.10.1 Terminal Control Selectors */
     88 #define UAC_TERM_COPY_PROTECT		0x01
     89 
     90 /* A.10.2 Feature Unit Control Selectors */
     91 #define UAC_FU_MUTE			0x01
     92 #define UAC_FU_VOLUME			0x02
     93 #define UAC_FU_BASS			0x03
     94 #define UAC_FU_MID			0x04
     95 #define UAC_FU_TREBLE			0x05
     96 #define UAC_FU_GRAPHIC_EQUALIZER	0x06
     97 #define UAC_FU_AUTOMATIC_GAIN		0x07
     98 #define UAC_FU_DELAY			0x08
     99 #define UAC_FU_BASS_BOOST		0x09
    100 #define UAC_FU_LOUDNESS			0x0a
    101 
    102 #define UAC_CONTROL_BIT(CS)	(1 << ((CS) - 1))
    103 
    104 /* A.10.3.1 Up/Down-mix Processing Unit Controls Selectors */
    105 #define UAC_UD_ENABLE			0x01
    106 #define UAC_UD_MODE_SELECT		0x02
    107 
    108 /* A.10.3.2 Dolby Prologic (tm) Processing Unit Controls Selectors */
    109 #define UAC_DP_ENABLE			0x01
    110 #define UAC_DP_MODE_SELECT		0x02
    111 
    112 /* A.10.3.3 3D Stereo Extender Processing Unit Control Selectors */
    113 #define UAC_3D_ENABLE			0x01
    114 #define UAC_3D_SPACE			0x02
    115 
    116 /* A.10.3.4 Reverberation Processing Unit Control Selectors */
    117 #define UAC_REVERB_ENABLE		0x01
    118 #define UAC_REVERB_LEVEL		0x02
    119 #define UAC_REVERB_TIME			0x03
    120 #define UAC_REVERB_FEEDBACK		0x04
    121 
    122 /* A.10.3.5 Chorus Processing Unit Control Selectors */
    123 #define UAC_CHORUS_ENABLE		0x01
    124 #define UAC_CHORUS_LEVEL		0x02
    125 #define UAC_CHORUS_RATE			0x03
    126 #define UAC_CHORUS_DEPTH		0x04
    127 
    128 /* A.10.3.6 Dynamic Range Compressor Unit Control Selectors */
    129 #define UAC_DCR_ENABLE			0x01
    130 #define UAC_DCR_RATE			0x02
    131 #define UAC_DCR_MAXAMPL			0x03
    132 #define UAC_DCR_THRESHOLD		0x04
    133 #define UAC_DCR_ATTACK_TIME		0x05
    134 #define UAC_DCR_RELEASE_TIME		0x06
    135 
    136 /* A.10.4 Extension Unit Control Selectors */
    137 #define UAC_XU_ENABLE			0x01
    138 
    139 /* MIDI - A.1 MS Class-Specific Interface Descriptor Subtypes */
    140 #define UAC_MS_HEADER			0x01
    141 #define UAC_MIDI_IN_JACK		0x02
    142 #define UAC_MIDI_OUT_JACK		0x03
    143 
    144 /* MIDI - A.1 MS Class-Specific Endpoint Descriptor Subtypes */
    145 #define UAC_MS_GENERAL			0x01
    146 
    147 /* Terminals - 2.1 USB Terminal Types */
    148 #define UAC_TERMINAL_UNDEFINED		0x100
    149 #define UAC_TERMINAL_STREAMING		0x101
    150 #define UAC_TERMINAL_VENDOR_SPEC	0x1FF
    151 
    152 /* Terminal Control Selectors */
    153 /* 4.3.2  Class-Specific AC Interface Descriptor */
    154 struct uac1_ac_header_descriptor {
    155 	__u8  bLength;			/* 8 + n */
    156 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
    157 	__u8  bDescriptorSubtype;	/* UAC_MS_HEADER */
    158 	__le16 bcdADC;			/* 0x0100 */
    159 	__le16 wTotalLength;		/* includes Unit and Terminal desc. */
    160 	__u8  bInCollection;		/* n */
    161 	__u8  baInterfaceNr[];		/* [n] */
    162 } __attribute__ ((packed));
    163 
    164 #define UAC_DT_AC_HEADER_SIZE(n)	(8 + (n))
    165 
    166 /* As above, but more useful for defining your own descriptors: */
    167 #define DECLARE_UAC_AC_HEADER_DESCRIPTOR(n)			\
    168 struct uac1_ac_header_descriptor_##n {			\
    169 	__u8  bLength;						\
    170 	__u8  bDescriptorType;					\
    171 	__u8  bDescriptorSubtype;				\
    172 	__le16 bcdADC;						\
    173 	__le16 wTotalLength;					\
    174 	__u8  bInCollection;					\
    175 	__u8  baInterfaceNr[n];					\
    176 } __attribute__ ((packed))
    177 
    178 /* 4.3.2.1 Input Terminal Descriptor */
    179 struct uac_input_terminal_descriptor {
    180 	__u8  bLength;			/* in bytes: 12 */
    181 	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
    182 	__u8  bDescriptorSubtype;	/* INPUT_TERMINAL descriptor subtype */
    183 	__u8  bTerminalID;		/* Constant uniquely terminal ID */
    184 	__le16 wTerminalType;		/* USB Audio Terminal Types */
    185 	__u8  bAssocTerminal;		/* ID of the Output Terminal associated */
    186 	__u8  bNrChannels;		/* Number of logical output channels */
    187 	__le16 wChannelConfig;
    188 	__u8  iChannelNames;
    189 	__u8  iTerminal;
    190 } __attribute__ ((packed));
    191 
    192 #define UAC_DT_INPUT_TERMINAL_SIZE			12
    193 
    194 /* Terminals - 2.2 Input Terminal Types */
    195 #define UAC_INPUT_TERMINAL_UNDEFINED			0x200
    196 #define UAC_INPUT_TERMINAL_MICROPHONE			0x201
    197 #define UAC_INPUT_TERMINAL_DESKTOP_MICROPHONE		0x202
    198 #define UAC_INPUT_TERMINAL_PERSONAL_MICROPHONE		0x203
    199 #define UAC_INPUT_TERMINAL_OMNI_DIR_MICROPHONE		0x204
    200 #define UAC_INPUT_TERMINAL_MICROPHONE_ARRAY		0x205
    201 #define UAC_INPUT_TERMINAL_PROC_MICROPHONE_ARRAY	0x206
    202 
    203 /* Terminals - control selectors */
    204 
    205 #define UAC_TERMINAL_CS_COPY_PROTECT_CONTROL		0x01
    206 
    207 /* 4.3.2.2 Output Terminal Descriptor */
    208 struct uac1_output_terminal_descriptor {
    209 	__u8  bLength;			/* in bytes: 9 */
    210 	__u8  bDescriptorType;		/* CS_INTERFACE descriptor type */
    211 	__u8  bDescriptorSubtype;	/* OUTPUT_TERMINAL descriptor subtype */
    212 	__u8  bTerminalID;		/* Constant uniquely terminal ID */
    213 	__le16 wTerminalType;		/* USB Audio Terminal Types */
    214 	__u8  bAssocTerminal;		/* ID of the Input Terminal associated */
    215 	__u8  bSourceID;		/* ID of the connected Unit or Terminal*/
    216 	__u8  iTerminal;
    217 } __attribute__ ((packed));
    218 
    219 #define UAC_DT_OUTPUT_TERMINAL_SIZE			9
    220 
    221 /* Terminals - 2.3 Output Terminal Types */
    222 #define UAC_OUTPUT_TERMINAL_UNDEFINED			0x300
    223 #define UAC_OUTPUT_TERMINAL_SPEAKER			0x301
    224 #define UAC_OUTPUT_TERMINAL_HEADPHONES			0x302
    225 #define UAC_OUTPUT_TERMINAL_HEAD_MOUNTED_DISPLAY_AUDIO	0x303
    226 #define UAC_OUTPUT_TERMINAL_DESKTOP_SPEAKER		0x304
    227 #define UAC_OUTPUT_TERMINAL_ROOM_SPEAKER		0x305
    228 #define UAC_OUTPUT_TERMINAL_COMMUNICATION_SPEAKER	0x306
    229 #define UAC_OUTPUT_TERMINAL_LOW_FREQ_EFFECTS_SPEAKER	0x307
    230 
    231 /* Set bControlSize = 2 as default setting */
    232 #define UAC_DT_FEATURE_UNIT_SIZE(ch)		(7 + ((ch) + 1) * 2)
    233 
    234 /* As above, but more useful for defining your own descriptors: */
    235 #define DECLARE_UAC_FEATURE_UNIT_DESCRIPTOR(ch)			\
    236 struct uac_feature_unit_descriptor_##ch {			\
    237 	__u8  bLength;						\
    238 	__u8  bDescriptorType;					\
    239 	__u8  bDescriptorSubtype;				\
    240 	__u8  bUnitID;						\
    241 	__u8  bSourceID;					\
    242 	__u8  bControlSize;					\
    243 	__le16 bmaControls[ch + 1];				\
    244 	__u8  iFeature;						\
    245 } __attribute__ ((packed))
    246 
    247 /* 4.3.2.3 Mixer Unit Descriptor */
    248 struct uac_mixer_unit_descriptor {
    249 	__u8 bLength;
    250 	__u8 bDescriptorType;
    251 	__u8 bDescriptorSubtype;
    252 	__u8 bUnitID;
    253 	__u8 bNrInPins;
    254 	__u8 baSourceID[];
    255 } __attribute__ ((packed));
    256 
    257 static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
    258 {
    259 	return desc->baSourceID[desc->bNrInPins];
    260 }
    261 
    262 static inline __u32 uac_mixer_unit_wChannelConfig(struct uac_mixer_unit_descriptor *desc,
    263 						  int protocol)
    264 {
    265 	if (protocol == UAC_VERSION_1)
    266 		return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
    267 			desc->baSourceID[desc->bNrInPins + 1];
    268 	else
    269 		return  (desc->baSourceID[desc->bNrInPins + 4] << 24) |
    270 			(desc->baSourceID[desc->bNrInPins + 3] << 16) |
    271 			(desc->baSourceID[desc->bNrInPins + 2] << 8)  |
    272 			(desc->baSourceID[desc->bNrInPins + 1]);
    273 }
    274 
    275 static inline __u8 uac_mixer_unit_iChannelNames(struct uac_mixer_unit_descriptor *desc,
    276 						int protocol)
    277 {
    278 	return (protocol == UAC_VERSION_1) ?
    279 		desc->baSourceID[desc->bNrInPins + 3] :
    280 		desc->baSourceID[desc->bNrInPins + 5];
    281 }
    282 
    283 static inline __u8 *uac_mixer_unit_bmControls(struct uac_mixer_unit_descriptor *desc,
    284 					      int protocol)
    285 {
    286 	return (protocol == UAC_VERSION_1) ?
    287 		&desc->baSourceID[desc->bNrInPins + 4] :
    288 		&desc->baSourceID[desc->bNrInPins + 6];
    289 }
    290 
    291 static inline __u8 uac_mixer_unit_iMixer(struct uac_mixer_unit_descriptor *desc)
    292 {
    293 	__u8 *raw = (__u8 *) desc;
    294 	return raw[desc->bLength - 1];
    295 }
    296 
    297 /* 4.3.2.4 Selector Unit Descriptor */
    298 struct uac_selector_unit_descriptor {
    299 	__u8 bLength;
    300 	__u8 bDescriptorType;
    301 	__u8 bDescriptorSubtype;
    302 	__u8 bUintID;
    303 	__u8 bNrInPins;
    304 	__u8 baSourceID[];
    305 } __attribute__ ((packed));
    306 
    307 static inline __u8 uac_selector_unit_iSelector(struct uac_selector_unit_descriptor *desc)
    308 {
    309 	__u8 *raw = (__u8 *) desc;
    310 	return raw[desc->bLength - 1];
    311 }
    312 
    313 /* 4.3.2.5 Feature Unit Descriptor */
    314 struct uac_feature_unit_descriptor {
    315 	__u8 bLength;
    316 	__u8 bDescriptorType;
    317 	__u8 bDescriptorSubtype;
    318 	__u8 bUnitID;
    319 	__u8 bSourceID;
    320 	__u8 bControlSize;
    321 	__u8 bmaControls[0]; /* variable length */
    322 } __attribute__((packed));
    323 
    324 static inline __u8 uac_feature_unit_iFeature(struct uac_feature_unit_descriptor *desc)
    325 {
    326 	__u8 *raw = (__u8 *) desc;
    327 	return raw[desc->bLength - 1];
    328 }
    329 
    330 /* 4.3.2.6 Processing Unit Descriptors */
    331 struct uac_processing_unit_descriptor {
    332 	__u8 bLength;
    333 	__u8 bDescriptorType;
    334 	__u8 bDescriptorSubtype;
    335 	__u8 bUnitID;
    336 	__u16 wProcessType;
    337 	__u8 bNrInPins;
    338 	__u8 baSourceID[];
    339 } __attribute__ ((packed));
    340 
    341 static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
    342 {
    343 	return desc->baSourceID[desc->bNrInPins];
    344 }
    345 
    346 static inline __u32 uac_processing_unit_wChannelConfig(struct uac_processing_unit_descriptor *desc,
    347 						       int protocol)
    348 {
    349 	if (protocol == UAC_VERSION_1)
    350 		return (desc->baSourceID[desc->bNrInPins + 2] << 8) |
    351 			desc->baSourceID[desc->bNrInPins + 1];
    352 	else
    353 		return  (desc->baSourceID[desc->bNrInPins + 4] << 24) |
    354 			(desc->baSourceID[desc->bNrInPins + 3] << 16) |
    355 			(desc->baSourceID[desc->bNrInPins + 2] << 8)  |
    356 			(desc->baSourceID[desc->bNrInPins + 1]);
    357 }
    358 
    359 static inline __u8 uac_processing_unit_iChannelNames(struct uac_processing_unit_descriptor *desc,
    360 						     int protocol)
    361 {
    362 	return (protocol == UAC_VERSION_1) ?
    363 		desc->baSourceID[desc->bNrInPins + 3] :
    364 		desc->baSourceID[desc->bNrInPins + 5];
    365 }
    366 
    367 static inline __u8 uac_processing_unit_bControlSize(struct uac_processing_unit_descriptor *desc,
    368 						    int protocol)
    369 {
    370 	return (protocol == UAC_VERSION_1) ?
    371 		desc->baSourceID[desc->bNrInPins + 4] :
    372 		desc->baSourceID[desc->bNrInPins + 6];
    373 }
    374 
    375 static inline __u8 *uac_processing_unit_bmControls(struct uac_processing_unit_descriptor *desc,
    376 						   int protocol)
    377 {
    378 	return (protocol == UAC_VERSION_1) ?
    379 		&desc->baSourceID[desc->bNrInPins + 5] :
    380 		&desc->baSourceID[desc->bNrInPins + 7];
    381 }
    382 
    383 static inline __u8 uac_processing_unit_iProcessing(struct uac_processing_unit_descriptor *desc,
    384 						   int protocol)
    385 {
    386 	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
    387 	return *(uac_processing_unit_bmControls(desc, protocol)
    388 			+ control_size);
    389 }
    390 
    391 static inline __u8 *uac_processing_unit_specific(struct uac_processing_unit_descriptor *desc,
    392 						 int protocol)
    393 {
    394 	__u8 control_size = uac_processing_unit_bControlSize(desc, protocol);
    395 	return uac_processing_unit_bmControls(desc, protocol)
    396 			+ control_size + 1;
    397 }
    398 
    399 /* 4.5.2 Class-Specific AS Interface Descriptor */
    400 struct uac1_as_header_descriptor {
    401 	__u8  bLength;			/* in bytes: 7 */
    402 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
    403 	__u8  bDescriptorSubtype;	/* AS_GENERAL */
    404 	__u8  bTerminalLink;		/* Terminal ID of connected Terminal */
    405 	__u8  bDelay;			/* Delay introduced by the data path */
    406 	__le16 wFormatTag;		/* The Audio Data Format */
    407 } __attribute__ ((packed));
    408 
    409 #define UAC_DT_AS_HEADER_SIZE		7
    410 
    411 /* Formats - A.1.1 Audio Data Format Type I Codes */
    412 #define UAC_FORMAT_TYPE_I_UNDEFINED	0x0
    413 #define UAC_FORMAT_TYPE_I_PCM		0x1
    414 #define UAC_FORMAT_TYPE_I_PCM8		0x2
    415 #define UAC_FORMAT_TYPE_I_IEEE_FLOAT	0x3
    416 #define UAC_FORMAT_TYPE_I_ALAW		0x4
    417 #define UAC_FORMAT_TYPE_I_MULAW		0x5
    418 
    419 struct uac_format_type_i_continuous_descriptor {
    420 	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
    421 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
    422 	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
    423 	__u8  bFormatType;		/* FORMAT_TYPE_1 */
    424 	__u8  bNrChannels;		/* physical channels in the stream */
    425 	__u8  bSubframeSize;		/* */
    426 	__u8  bBitResolution;
    427 	__u8  bSamFreqType;
    428 	__u8  tLowerSamFreq[3];
    429 	__u8  tUpperSamFreq[3];
    430 } __attribute__ ((packed));
    431 
    432 #define UAC_FORMAT_TYPE_I_CONTINUOUS_DESC_SIZE	14
    433 
    434 struct uac_format_type_i_discrete_descriptor {
    435 	__u8  bLength;			/* in bytes: 8 + (ns * 3) */
    436 	__u8  bDescriptorType;		/* USB_DT_CS_INTERFACE */
    437 	__u8  bDescriptorSubtype;	/* FORMAT_TYPE */
    438 	__u8  bFormatType;		/* FORMAT_TYPE_1 */
    439 	__u8  bNrChannels;		/* physical channels in the stream */
    440 	__u8  bSubframeSize;		/* */
    441 	__u8  bBitResolution;
    442 	__u8  bSamFreqType;
    443 	__u8  tSamFreq[][3];
    444 } __attribute__ ((packed));
    445 
    446 #define DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(n)		\
    447 struct uac_format_type_i_discrete_descriptor_##n {		\
    448 	__u8  bLength;						\
    449 	__u8  bDescriptorType;					\
    450 	__u8  bDescriptorSubtype;				\
    451 	__u8  bFormatType;					\
    452 	__u8  bNrChannels;					\
    453 	__u8  bSubframeSize;					\
    454 	__u8  bBitResolution;					\
    455 	__u8  bSamFreqType;					\
    456 	__u8  tSamFreq[n][3];					\
    457 } __attribute__ ((packed))
    458 
    459 #define UAC_FORMAT_TYPE_I_DISCRETE_DESC_SIZE(n)	(8 + (n * 3))
    460 
    461 struct uac_format_type_i_ext_descriptor {
    462 	__u8 bLength;
    463 	__u8 bDescriptorType;
    464 	__u8 bDescriptorSubtype;
    465 	__u8 bFormatType;
    466 	__u8 bSubslotSize;
    467 	__u8 bBitResolution;
    468 	__u8 bHeaderLength;
    469 	__u8 bControlSize;
    470 	__u8 bSideBandProtocol;
    471 } __attribute__((packed));
    472 
    473 /* Formats - Audio Data Format Type I Codes */
    474 
    475 #define UAC_FORMAT_TYPE_II_MPEG	0x1001
    476 #define UAC_FORMAT_TYPE_II_AC3	0x1002
    477 
    478 struct uac_format_type_ii_discrete_descriptor {
    479 	__u8 bLength;
    480 	__u8 bDescriptorType;
    481 	__u8 bDescriptorSubtype;
    482 	__u8 bFormatType;
    483 	__le16 wMaxBitRate;
    484 	__le16 wSamplesPerFrame;
    485 	__u8 bSamFreqType;
    486 	__u8 tSamFreq[][3];
    487 } __attribute__((packed));
    488 
    489 struct uac_format_type_ii_ext_descriptor {
    490 	__u8 bLength;
    491 	__u8 bDescriptorType;
    492 	__u8 bDescriptorSubtype;
    493 	__u8 bFormatType;
    494 	__u16 wMaxBitRate;
    495 	__u16 wSamplesPerFrame;
    496 	__u8 bHeaderLength;
    497 	__u8 bSideBandProtocol;
    498 } __attribute__((packed));
    499 
    500 /* type III */
    501 #define UAC_FORMAT_TYPE_III_IEC1937_AC3	0x2001
    502 #define UAC_FORMAT_TYPE_III_IEC1937_MPEG1_LAYER1	0x2002
    503 #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_NOEXT	0x2003
    504 #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_EXT	0x2004
    505 #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER1_LS	0x2005
    506 #define UAC_FORMAT_TYPE_III_IEC1937_MPEG2_LAYER23_LS	0x2006
    507 
    508 /* Formats - A.2 Format Type Codes */
    509 #define UAC_FORMAT_TYPE_UNDEFINED	0x0
    510 #define UAC_FORMAT_TYPE_I		0x1
    511 #define UAC_FORMAT_TYPE_II		0x2
    512 #define UAC_FORMAT_TYPE_III		0x3
    513 #define UAC_EXT_FORMAT_TYPE_I		0x81
    514 #define UAC_EXT_FORMAT_TYPE_II		0x82
    515 #define UAC_EXT_FORMAT_TYPE_III		0x83
    516 
    517 struct uac_iso_endpoint_descriptor {
    518 	__u8  bLength;			/* in bytes: 7 */
    519 	__u8  bDescriptorType;		/* USB_DT_CS_ENDPOINT */
    520 	__u8  bDescriptorSubtype;	/* EP_GENERAL */
    521 	__u8  bmAttributes;
    522 	__u8  bLockDelayUnits;
    523 	__le16 wLockDelay;
    524 } __attribute__((packed));
    525 #define UAC_ISO_ENDPOINT_DESC_SIZE	7
    526 
    527 #define UAC_EP_CS_ATTR_SAMPLE_RATE	0x01
    528 #define UAC_EP_CS_ATTR_PITCH_CONTROL	0x02
    529 #define UAC_EP_CS_ATTR_FILL_MAX		0x80
    530 
    531 /* status word format (3.7.1.1) */
    532 
    533 #define UAC1_STATUS_TYPE_ORIG_MASK		0x0f
    534 #define UAC1_STATUS_TYPE_ORIG_AUDIO_CONTROL_IF	0x0
    535 #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_IF	0x1
    536 #define UAC1_STATUS_TYPE_ORIG_AUDIO_STREAM_EP	0x2
    537 
    538 #define UAC1_STATUS_TYPE_IRQ_PENDING		(1 << 7)
    539 #define UAC1_STATUS_TYPE_MEM_CHANGED		(1 << 6)
    540 
    541 struct uac1_status_word {
    542 	__u8 bStatusType;
    543 	__u8 bOriginator;
    544 } __attribute__((packed));
    545 
    546 
    547 #endif /* _UAPI__LINUX_USB_AUDIO_H */
    548