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 _UAPI__LINUX_USB_AUDIO_H
23#define _UAPI__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 */
156struct 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)			\
170struct 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 */
181struct 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 */
210struct 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)			\
246struct 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 */
258struct 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
267static inline __u8 uac_mixer_unit_bNrChannels(struct uac_mixer_unit_descriptor *desc)
268{
269	return desc->baSourceID[desc->bNrInPins];
270}
271
272static 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
285static 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
293static 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
308static 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
314static 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 */
321struct 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
330static 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 */
337struct 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
347static 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 */
354struct 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
364static inline __u8 uac_processing_unit_bNrChannels(struct uac_processing_unit_descriptor *desc)
365{
366	return desc->baSourceID[desc->bNrInPins];
367}
368
369static 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
382static 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
390static 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
405static 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
420static 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
436static 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 */
459static 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
474static 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 */
491struct 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
510struct 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
525struct 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)		\
538struct 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
552struct 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
569struct 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
580struct 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
608struct 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
632struct uac1_status_word {
633	__u8 bStatusType;
634	__u8 bOriginator;
635} __attribute__((packed));
636
637
638#endif /* _UAPI__LINUX_USB_AUDIO_H */
639