zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

audio.h (19488B) - Raw


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