1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate 
28*7c478bd9Sstevel@tonic-gate #ifndef _SYS_USB_AUDIO_H
29*7c478bd9Sstevel@tonic-gate #define	_SYS_USB_AUDIO_H
30*7c478bd9Sstevel@tonic-gate 
31*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
32*7c478bd9Sstevel@tonic-gate 
33*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus
34*7c478bd9Sstevel@tonic-gate extern "C" {
35*7c478bd9Sstevel@tonic-gate #endif
36*7c478bd9Sstevel@tonic-gate 
37*7c478bd9Sstevel@tonic-gate /*
38*7c478bd9Sstevel@tonic-gate  * macros from audio spec 1.0
39*7c478bd9Sstevel@tonic-gate  *
40*7c478bd9Sstevel@tonic-gate  * audio class-specific descriptor types (Appendix A.4)
41*7c478bd9Sstevel@tonic-gate  */
42*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CS_DEVICE		0x21
43*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CS_CONFIGURATION	0x22
44*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CS_STRING		0x23
45*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CS_INTERFACE		0x24
46*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CS_ENDPOINT		0x25
47*7c478bd9Sstevel@tonic-gate 
48*7c478bd9Sstevel@tonic-gate /* audio class-specific AC Interface Descriptor Subtypes (A.5) */
49*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_HEADER		0x01
50*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_INPUT_TERMINAL	0x02
51*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_OUTPUT_TERMINAL	0x03
52*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MIXER_UNIT		0x04
53*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SELECTOR_UNIT		0x05
54*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FEATURE_UNIT		0x06
55*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_PROCESSING_UNIT	0x07
56*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_EXTENSION_UNIT	0x08
57*7c478bd9Sstevel@tonic-gate 
58*7c478bd9Sstevel@tonic-gate /* audio class-specific AS Interface descriptor Subtypes (A.6) */
59*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AS_GENERAL		0x01
60*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AS_FORMAT_TYPE	0x02
61*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AS_FORMAT_SPECIFIC	0x03
62*7c478bd9Sstevel@tonic-gate 
63*7c478bd9Sstevel@tonic-gate /* Processing Uniti Process Types (A.7) */
64*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_UP_DOWNMIX_PROCESS		0x01
65*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DOLBY_PROLOGIC_PROCESS	0x02
66*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_3D_STEREO_EXTENDER_PROCESS	0x03
67*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_REVERBERATION_PROCESS		0x04
68*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CHORUS_PROCESS		0x05
69*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DYN_RANGE_COMP_PROCESS	0x06
70*7c478bd9Sstevel@tonic-gate 
71*7c478bd9Sstevel@tonic-gate /* Audio Class-specific endpoint descriptor Subtypes (A.8) */
72*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_EP_GENERAL		0x07
73*7c478bd9Sstevel@tonic-gate 
74*7c478bd9Sstevel@tonic-gate /* Audio Class-specific Request Codes */
75*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SET_CUR		0x01
76*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_CUR		0x81
77*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SET_MIN		0x02
78*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_MIN		0x82
79*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SET_MAX		0x03
80*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_MAX		0x83
81*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SET_RES		0x04
82*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_RES		0x84
83*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SET_MEM		0x05
84*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_MEM		0x85
85*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GET_STAT		0xff
86*7c478bd9Sstevel@tonic-gate 
87*7c478bd9Sstevel@tonic-gate /* Terminal Control Selectors (A.10.1) */
88*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_COPY_PROTECT_CONTROL	0x01
89*7c478bd9Sstevel@tonic-gate 
90*7c478bd9Sstevel@tonic-gate /* Feature Unit Control Selectors (A.1.10.2) */
91*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MUTE_CONTROL		0x01
92*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_VOLUME_CONTROL	0x02
93*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_BASS_CONTROL		0x03
94*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MID_CONTROL		0x04
95*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TREBLE_CONTROL	0x05
96*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_GRAPHIC_CONTROL	0x06
97*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AUTOMATIC_GAIN_CONTROL 0x07
98*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DELAY_CONTROL		0x08
99*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_BASS_BOOST_CONTROL	0x09
100*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_LOUDNESS_CONTROL	0x0A
101*7c478bd9Sstevel@tonic-gate 
102*7c478bd9Sstevel@tonic-gate /* the spec defines volume control value of 0x8000 as silence */
103*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_VOLUME_SILENCE	0x8000
104*7c478bd9Sstevel@tonic-gate 
105*7c478bd9Sstevel@tonic-gate /* Up/Down-mix Processing Unit Control Selectors (A.10.3.1) */
106*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_UD_ENABLE_CONTROL	0x01
107*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_UD_MODE_SELECT_CONTROL 0x02
108*7c478bd9Sstevel@tonic-gate 
109*7c478bd9Sstevel@tonic-gate /* Dolby Prologic Processing Unit Control Selectors (A.10.3.2) */
110*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DP_ENABLE_CONTROL	0x01
111*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DP_MODE_SELECT_CONTROL 0x02
112*7c478bd9Sstevel@tonic-gate 
113*7c478bd9Sstevel@tonic-gate /* Reverberation Processing Unit Control Selectors (A.10.3.3) */
114*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_RV_ENABLE_CONTROL	0x01
115*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_REVERB_LEVEL_CONTROL	0x02
116*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_REVERB_TIME_CONTROL	0x03
117*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_REVERB_FEEDBACK_CONTROL 0x04
118*7c478bd9Sstevel@tonic-gate 
119*7c478bd9Sstevel@tonic-gate /* Chorus Processing Unit Control Selectors (A.10.3.5) */
120*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CH_ENABLE_CONTROL	0x01
121*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CHORUS_LEVEL_CONTROL	0x02
122*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CHORUS_RATE_CONTROL	0x03
123*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_CHORUS_DEPTH_CONTROL	0x04
124*7c478bd9Sstevel@tonic-gate 
125*7c478bd9Sstevel@tonic-gate /* Dynamic range compressor Processing Unit Control Selectors (A.10.3.6) */
126*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_DR_ENABLE_CONTROL	0x01
127*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_COMPRESSION_RATE_CONTROL 0x02
128*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MAXAMPL_CONTROL	0x03
129*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_THRESHOLD_CONTROL	0x04
130*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_ATTACK_TIME		0x05
131*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_RELEASE_TIME		0x06
132*7c478bd9Sstevel@tonic-gate 
133*7c478bd9Sstevel@tonic-gate /* Extension Unit Control Selectors (A.10.4) */
134*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_XU_ENABLE_CONTROL	0x01
135*7c478bd9Sstevel@tonic-gate 
136*7c478bd9Sstevel@tonic-gate /* Endpoint Control Selectors (A.10.5) */
137*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_SAMPLING_FREQ_CONTROL	0x01
138*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_PITCH_CONTROL		0x02
139*7c478bd9Sstevel@tonic-gate 
140*7c478bd9Sstevel@tonic-gate /* descriptors */
141*7c478bd9Sstevel@tonic-gate /* Class specific AC interface header descriptor (4.3.2) */
142*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_cs_if_descr {
143*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
144*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
145*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* HEADER */
146*7c478bd9Sstevel@tonic-gate 	uint16_t bcdADC;	/* release # */
147*7c478bd9Sstevel@tonic-gate 	uint16_t wTotalLength;	/* the whole wad */
148*7c478bd9Sstevel@tonic-gate 	uint8_t blnCollection;	/* # interfaces */
149*7c478bd9Sstevel@tonic-gate 	uint8_t baInterfaceNr[1]; /* interface # */
150*7c478bd9Sstevel@tonic-gate } usb_audio_cs_if_descr_t;
151*7c478bd9Sstevel@tonic-gate 
152*7c478bd9Sstevel@tonic-gate #define	CS_AC_IF_HEADER_FORMAT "cccsscc"
153*7c478bd9Sstevel@tonic-gate #define	CS_AC_IF_HEADER_SIZE 10
154*7c478bd9Sstevel@tonic-gate 
155*7c478bd9Sstevel@tonic-gate /* input terminal descriptor (4.3.2.1) */
156*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_input_term_descr {
157*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
158*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
159*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* INPUT_TERMINAL */
160*7c478bd9Sstevel@tonic-gate 	uint8_t bTerminalID;	/* unique identifier */
161*7c478bd9Sstevel@tonic-gate 	uint16_t wTerminalType;	/* type of terminal */
162*7c478bd9Sstevel@tonic-gate 	uint8_t bAssocTerminal; /* identifier */
163*7c478bd9Sstevel@tonic-gate 	uint8_t bNrChannels;	/* # channels */
164*7c478bd9Sstevel@tonic-gate 	uint16_t wChannelConfig; /* logical channel loc */
165*7c478bd9Sstevel@tonic-gate 	uint8_t iChannelNames;	/* string index */
166*7c478bd9Sstevel@tonic-gate 	uint8_t iTerminal;	/* terminal string index */
167*7c478bd9Sstevel@tonic-gate } usb_audio_input_term_descr_t;
168*7c478bd9Sstevel@tonic-gate 
169*7c478bd9Sstevel@tonic-gate #define	CS_AC_INPUT_TERM_FORMAT "ccccsccscc"
170*7c478bd9Sstevel@tonic-gate #define	CS_AC_INPUT_TERM_SIZE 12
171*7c478bd9Sstevel@tonic-gate 
172*7c478bd9Sstevel@tonic-gate /* output terminal descriptor (4.3.2.2) */
173*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_output_term_descr {
174*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
175*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
176*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* OUTPUT_TERMINAL */
177*7c478bd9Sstevel@tonic-gate 	uint8_t bTerminalID;	/* unique identifier */
178*7c478bd9Sstevel@tonic-gate 	uint16_t wTerminalType;	/* type of terminal */
179*7c478bd9Sstevel@tonic-gate 	uint8_t bAssocTerminal; /* identifier */
180*7c478bd9Sstevel@tonic-gate 	uint8_t bSourceID;	/* identifier */
181*7c478bd9Sstevel@tonic-gate 	uint8_t iTerminal;	/* terminal string index */
182*7c478bd9Sstevel@tonic-gate } usb_audio_output_term_descr_t;
183*7c478bd9Sstevel@tonic-gate 
184*7c478bd9Sstevel@tonic-gate #define	CS_AC_OUTPUT_TERM_FORMAT "ccccsccc"
185*7c478bd9Sstevel@tonic-gate #define	CS_AC_OUTPUT_TERM_SIZE 9
186*7c478bd9Sstevel@tonic-gate 
187*7c478bd9Sstevel@tonic-gate /*
188*7c478bd9Sstevel@tonic-gate  * mixer unit descriptor (4.3.2.3)
189*7c478bd9Sstevel@tonic-gate  * this is awkward descriptors because of the variable size array in
190*7c478bd9Sstevel@tonic-gate  * the middle (baSourceID).
191*7c478bd9Sstevel@tonic-gate  */
192*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_mixer_unit_descr1 {
193*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
194*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
195*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* MIXER_UNIT */
196*7c478bd9Sstevel@tonic-gate 	uint8_t bUnitID;	/* identifier */
197*7c478bd9Sstevel@tonic-gate 	uint8_t bNrInPins;	/* # input pins */
198*7c478bd9Sstevel@tonic-gate 	uint8_t baSourceID[1];	/* idenfifiers */
199*7c478bd9Sstevel@tonic-gate } usb_audio_mixer_unit_descr1_t;
200*7c478bd9Sstevel@tonic-gate 
201*7c478bd9Sstevel@tonic-gate #define	CS_AC_MIXER_UNIT_DESCR1_FORMAT "cccccc"
202*7c478bd9Sstevel@tonic-gate #define	CS_AC_MIXER_UNIT_DESCR1_SIZE 6
203*7c478bd9Sstevel@tonic-gate 
204*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_mixer_unit_descr2 {
205*7c478bd9Sstevel@tonic-gate 	uint8_t bNrChannels;	/* # channels */
206*7c478bd9Sstevel@tonic-gate 	uint16_t wChannelConfig; /* location of channels */
207*7c478bd9Sstevel@tonic-gate 	uint8_t iChannelNames;	/* string index */
208*7c478bd9Sstevel@tonic-gate 	uint8_t	bmControls[1];	/* bitmap prog. ctlrs */
209*7c478bd9Sstevel@tonic-gate } usb_audio_mixer_unit_descr2_t;
210*7c478bd9Sstevel@tonic-gate 
211*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_mixer_unit_descr3 {
212*7c478bd9Sstevel@tonic-gate 	uint8_t iMixer;	/* string index */
213*7c478bd9Sstevel@tonic-gate } usb_audio_mixer_unit_descr3_t;
214*7c478bd9Sstevel@tonic-gate 
215*7c478bd9Sstevel@tonic-gate /* selector unit descriptor (4.3.2.4) */
216*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_selector_unit_descr1 {
217*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
218*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
219*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* SELECTOR_UNIT */
220*7c478bd9Sstevel@tonic-gate 	uint8_t bUnitID;	/* identifier */
221*7c478bd9Sstevel@tonic-gate 	uint8_t bNrInPins;	/* input pins on the unit */
222*7c478bd9Sstevel@tonic-gate 	uint8_t baSourceID[1];	/* ID of pins */
223*7c478bd9Sstevel@tonic-gate } usb_audio_selector_unit_descr1_t;
224*7c478bd9Sstevel@tonic-gate 
225*7c478bd9Sstevel@tonic-gate #define	CS_AC_SELECTOR_UNIT_DESCR1_FORMAT "cccccc"
226*7c478bd9Sstevel@tonic-gate #define	CS_AC_SELECTOR_UNIT_DESCR1_SIZE 6
227*7c478bd9Sstevel@tonic-gate 
228*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_selector_unit_descr2 {
229*7c478bd9Sstevel@tonic-gate 	uint8_t iSelector[1];	/* string index */
230*7c478bd9Sstevel@tonic-gate } usb_audio_selector_unit_descr2_t;
231*7c478bd9Sstevel@tonic-gate 
232*7c478bd9Sstevel@tonic-gate /* feature unit descriptor (4.3.2.5) */
233*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_feature_unit_descr1 {
234*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
235*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
236*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* FEATURE_UNIT */
237*7c478bd9Sstevel@tonic-gate 	uint8_t bUnitID;	/* identifier */
238*7c478bd9Sstevel@tonic-gate 	uint8_t bSourceID;	/* identifier */
239*7c478bd9Sstevel@tonic-gate 	uint8_t bControlSize;	/* size of bmaControls */
240*7c478bd9Sstevel@tonic-gate 	uint8_t bmaControls[1];	/* bitmap of features */
241*7c478bd9Sstevel@tonic-gate } usb_audio_feature_unit_descr1_t;
242*7c478bd9Sstevel@tonic-gate 
243*7c478bd9Sstevel@tonic-gate #define	CS_AC_FEATURE_UNIT_FORMAT	"ccccccc"
244*7c478bd9Sstevel@tonic-gate #define	CS_AC_FEATURE_UNIT_SIZE		7
245*7c478bd9Sstevel@tonic-gate 
246*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_feature_unit_descr2 {
247*7c478bd9Sstevel@tonic-gate 	uint8_t iFeature;	/* string index */
248*7c478bd9Sstevel@tonic-gate } usb_audio_feature_unit_descr2_t;
249*7c478bd9Sstevel@tonic-gate 
250*7c478bd9Sstevel@tonic-gate /* processing unit descriptor (4.3.2.6) */
251*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_processing_unit_descr1 {
252*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
253*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
254*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* PROCESSING_UNIT */
255*7c478bd9Sstevel@tonic-gate 	uint8_t bUnitID;	/* identifier */
256*7c478bd9Sstevel@tonic-gate 	uint8_t	wProcessType;	/* type of processing */
257*7c478bd9Sstevel@tonic-gate 	uint8_t bNrInPins;	/* input pins on the unit */
258*7c478bd9Sstevel@tonic-gate 	uint8_t baSourceID[1];	/* ID of pins */
259*7c478bd9Sstevel@tonic-gate } usb_audio_processing_unit_descr1_t;
260*7c478bd9Sstevel@tonic-gate 
261*7c478bd9Sstevel@tonic-gate #define	CS_AC_PROCESSING_UNIT_DESCR1_FORMAT	"ccccwcc"
262*7c478bd9Sstevel@tonic-gate #define	CS_AC_PROCESSING_UNIT_DESCR1_SIZE	8
263*7c478bd9Sstevel@tonic-gate 
264*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_processing_unit_descr2 {
265*7c478bd9Sstevel@tonic-gate 	uint8_t	bNrChannels;	/* # log. output channels */
266*7c478bd9Sstevel@tonic-gate 	uint16_t wChannelConfig; /* spatial location */
267*7c478bd9Sstevel@tonic-gate 	uint8_t iChannelnames;	/* index to name */
268*7c478bd9Sstevel@tonic-gate 	uint8_t bControlSize;	/* size in bytes */
269*7c478bd9Sstevel@tonic-gate 	uint8_t bmControls[1];	/* control bits */
270*7c478bd9Sstevel@tonic-gate } usb_audio_processing_unit_descr2_t;
271*7c478bd9Sstevel@tonic-gate 
272*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_processing_unit_descr3 {
273*7c478bd9Sstevel@tonic-gate 	uint8_t iProcessing;	/* index to string descr */
274*7c478bd9Sstevel@tonic-gate 	uint8_t Process_specific[1];
275*7c478bd9Sstevel@tonic-gate } usb_audio_processing_unit_descr3_t;
276*7c478bd9Sstevel@tonic-gate 
277*7c478bd9Sstevel@tonic-gate /* extension unit descriptor (4.3.2.7) */
278*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_extension_unit_descr1 {
279*7c478bd9Sstevel@tonic-gate 	uint8_t	bLength;	/* size */
280*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
281*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* PROCESSING_UNIT */
282*7c478bd9Sstevel@tonic-gate 	uint8_t wExtensionCode; /* vendor spec. */
283*7c478bd9Sstevel@tonic-gate 	uint8_t bUnitID;	/* identifier */
284*7c478bd9Sstevel@tonic-gate 	uint8_t bNrInPins;	/* input pins on the unit */
285*7c478bd9Sstevel@tonic-gate 	uint8_t baSourceID[1];	/* ID of pins */
286*7c478bd9Sstevel@tonic-gate } usb_audio_extension_unit_descr1_t;
287*7c478bd9Sstevel@tonic-gate 
288*7c478bd9Sstevel@tonic-gate #define	CS_AC_EXTENSION_UNIT_DESCR1_FORMAT	"ccccwcc"
289*7c478bd9Sstevel@tonic-gate #define	CS_AC_EXTENSION_UNIT_DESCR1_SIZE	8
290*7c478bd9Sstevel@tonic-gate 
291*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_extension_unit_descr2 {
292*7c478bd9Sstevel@tonic-gate 	uint8_t	bNrChannels;	/* # log. output channels */
293*7c478bd9Sstevel@tonic-gate 	uint16_t wChannelConfig; /* spatial location */
294*7c478bd9Sstevel@tonic-gate 	uint8_t iChannelnames;	/* index to name */
295*7c478bd9Sstevel@tonic-gate 	uint8_t bControlSize;	/* size in bytes */
296*7c478bd9Sstevel@tonic-gate 	uint8_t bmControls[1];	/* control bits */
297*7c478bd9Sstevel@tonic-gate } usb_audio_extension_unit_descr2_t;
298*7c478bd9Sstevel@tonic-gate 
299*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_extension_unit_descr3 {
300*7c478bd9Sstevel@tonic-gate 	uint8_t iExtension;	/* index to string descr */
301*7c478bd9Sstevel@tonic-gate } usb_audio_extension_unit_descr3_t;
302*7c478bd9Sstevel@tonic-gate 
303*7c478bd9Sstevel@tonic-gate 
304*7c478bd9Sstevel@tonic-gate 
305*7c478bd9Sstevel@tonic-gate /* associated interface descriptor (4.3.2.8) */
306*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_associated_if_descr {
307*7c478bd9Sstevel@tonic-gate 	uint8_t	blength;	/* size */
308*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
309*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* ASSOC Interface */
310*7c478bd9Sstevel@tonic-gate 	uint8_t bInterfaceNr;	/* interface number */
311*7c478bd9Sstevel@tonic-gate } usb_audio_associated_if_descr_t;
312*7c478bd9Sstevel@tonic-gate 
313*7c478bd9Sstevel@tonic-gate 
314*7c478bd9Sstevel@tonic-gate /*
315*7c478bd9Sstevel@tonic-gate  * class specific AS interface descriptor (4.5.2)
316*7c478bd9Sstevel@tonic-gate  */
317*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_as_if_descr {
318*7c478bd9Sstevel@tonic-gate 	uint8_t	blength;	/* size */
319*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
320*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* AS_GENERAL */
321*7c478bd9Sstevel@tonic-gate 	uint8_t bTerminalLink;	/* identifier */
322*7c478bd9Sstevel@tonic-gate 	uint8_t bDelay;		/* delay in data path */
323*7c478bd9Sstevel@tonic-gate 	uint16_t wFormatTag;	/* data format */
324*7c478bd9Sstevel@tonic-gate } usb_audio_as_if_descr_t;
325*7c478bd9Sstevel@tonic-gate 
326*7c478bd9Sstevel@tonic-gate #define	AS_IF_DESCR_FORMAT	"cccccs"
327*7c478bd9Sstevel@tonic-gate #define	AS_IF_DESCR_SIZE	8
328*7c478bd9Sstevel@tonic-gate 
329*7c478bd9Sstevel@tonic-gate 
330*7c478bd9Sstevel@tonic-gate /* class specific AS isochronous audio data ep descr (4.6.1.2) */
331*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_as_isoc_ep_descr {
332*7c478bd9Sstevel@tonic-gate 	uint8_t	blength;	/* size */
333*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_ENDPOINT */
334*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* EP_GENERAL */
335*7c478bd9Sstevel@tonic-gate 	uint8_t bmAttributes;	/* bitmap of attributes */
336*7c478bd9Sstevel@tonic-gate 	uint8_t bLockDelayUnits; /* type of units */
337*7c478bd9Sstevel@tonic-gate 	uint8_t bLockDelay;	/* lock of internal clock */
338*7c478bd9Sstevel@tonic-gate } usb_audio_as_isoc_ep_descr_t;
339*7c478bd9Sstevel@tonic-gate 
340*7c478bd9Sstevel@tonic-gate #define	AS_ISOC_EP_DESCR_FORMAT "cccccc"
341*7c478bd9Sstevel@tonic-gate #define	AS_ISOC_EP_DESCR_SIZE 6
342*7c478bd9Sstevel@tonic-gate 
343*7c478bd9Sstevel@tonic-gate /*
344*7c478bd9Sstevel@tonic-gate  * data format descriptor, no need for parse format since
345*7c478bd9Sstevel@tonic-gate  * all fields are chars
346*7c478bd9Sstevel@tonic-gate  */
347*7c478bd9Sstevel@tonic-gate typedef struct usb_audio_type1_format_descr {
348*7c478bd9Sstevel@tonic-gate 	uint8_t	blength;	/* size */
349*7c478bd9Sstevel@tonic-gate 	uint8_t	bDescriptorType; /* CS_INTERFACE */
350*7c478bd9Sstevel@tonic-gate 	uint8_t bDescriptorSubType; /* FORMAT_TYPE */
351*7c478bd9Sstevel@tonic-gate 	uint8_t	bFormatType;	/* FORMAT_TYPE_1 */
352*7c478bd9Sstevel@tonic-gate 	uint8_t bNrChannels;	/* #phys channels */
353*7c478bd9Sstevel@tonic-gate 	uint8_t bSubFrameSize;	/* bytes per frame */
354*7c478bd9Sstevel@tonic-gate 	uint8_t bBitResolution;	/* bits in subframe */
355*7c478bd9Sstevel@tonic-gate 	uint8_t bSamFreqType;	/* sampling freq type */
356*7c478bd9Sstevel@tonic-gate 	uint8_t bSamFreqs[6];	/* sampling freqs */
357*7c478bd9Sstevel@tonic-gate } usb_audio_type1_format_descr_t;
358*7c478bd9Sstevel@tonic-gate 
359*7c478bd9Sstevel@tonic-gate #define	AUDIO_TYPE1_FORMAT_FORMAT "cccccccccc"
360*7c478bd9Sstevel@tonic-gate #define	AUDIO_TYPE1_FORMAT_SIZE	10
361*7c478bd9Sstevel@tonic-gate 
362*7c478bd9Sstevel@tonic-gate /* audio data format codes */
363*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE1_PCM		0x0001
364*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE1_PCM8		0x0002
365*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE1_IEEE_FLOAT	0x0003
366*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE1_ALAW		0x0004
367*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE1_MULAW		0x0005
368*7c478bd9Sstevel@tonic-gate 
369*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE2_MPEG		0x1001
370*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE2_AC		0x1002
371*7c478bd9Sstevel@tonic-gate 
372*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_AC_3	0x2001
373*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG1_L1	0x2002
374*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG1_L2	0x2003
375*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG2_NOEXT 0x2003
376*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG2_EXT 0x2004
377*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG2_L1_LS 0x2005
378*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE3_IEC1937_MPEG2_L2_LS 0x2006
379*7c478bd9Sstevel@tonic-gate 
380*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE_1			0x01
381*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE_2			0x02
382*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_FORMAT_TYPE_3			0x03
383*7c478bd9Sstevel@tonic-gate 
384*7c478bd9Sstevel@tonic-gate /* format specific control selectors */
385*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_DUAL_CHANNEL_CONTROL	0x01
386*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_SECOND_STEREO_CONTROL	0x02
387*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_MULTILINGUAL		0x03
388*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_DYN_RANGE_CONTROL		0x04
389*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_SCALING_CONTROL		0x05
390*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MP_HILO_SCALING_CONTROL	0x06
391*7c478bd9Sstevel@tonic-gate 
392*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AC_MODE_CONTROL		0x01
393*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AC_DYN_RANGE_CONTROL		0x02
394*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AC_SCALING_CONTROL		0x03
395*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_AC_HILO_SCALING_CONTROL	0x04
396*7c478bd9Sstevel@tonic-gate 
397*7c478bd9Sstevel@tonic-gate /* From USB Device Class Definition for Terminal Types */
398*7c478bd9Sstevel@tonic-gate /* USB Terminal Types (2.1) */
399*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_STREAMING		0x0101
400*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_VS			0x01ff
401*7c478bd9Sstevel@tonic-gate 
402*7c478bd9Sstevel@tonic-gate /* Input term types (2.2) */
403*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_MICROPHONE		0x0201
404*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DT_MICROPHONE	0x0202
405*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_PERS_MICROPHONE	0x0203
406*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_OMNI_DIR_MICROPHONE	0x0204
407*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_MICROPHONE_ARRAY	0x0205
408*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_PROCESSING_MIC_ARRAY 0x0206
409*7c478bd9Sstevel@tonic-gate 
410*7c478bd9Sstevel@tonic-gate /* output term types (2.3) */
411*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_SPEAKER		0x0301
412*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_HEADPHONES		0x0302
413*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DISPLAY_AUDIO	0x0303
414*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DT_SPEAKER		0x0304
415*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_ROOM_SPEAKER	0x0305
416*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_COMM_SPEAKER	0x0306
417*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_LF_EFFECTS_SPEAKER	0x0307
418*7c478bd9Sstevel@tonic-gate 
419*7c478bd9Sstevel@tonic-gate /* bi-directional terminal types (2.4) */
420*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_HANDSET		0x0401
421*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_HEADSET		0x0402
422*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_SPEAKERPHONE	0x0403
423*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_ECHO_SUPP_SPEAKERPHONE 0x0404
424*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_ECHO_CANCEL_SPEAKERPHONE 0x0405
425*7c478bd9Sstevel@tonic-gate 
426*7c478bd9Sstevel@tonic-gate /* telephony terminal types (2.5) */
427*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_PHONE_LINE		0x0501
428*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_TELEPHONE		0x0502
429*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DOWN_LINE_PHONE	0x0503
430*7c478bd9Sstevel@tonic-gate 
431*7c478bd9Sstevel@tonic-gate /* external terminal types (2.6) */
432*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_ANALOG_CONNECTOR	0x0601
433*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DIGITAL_AUDIO_IF	0x0602
434*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_LINE_CONNECTOR	0x0603
435*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_LEGACY_AUDIO_CONNECTOR 0x0604
436*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_SPDIF_IF		0x0605
437*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_1394_DA_STREAM	0x0606
438*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_1394_DV_STREAM_SNDTRCK 0x0607
439*7c478bd9Sstevel@tonic-gate 
440*7c478bd9Sstevel@tonic-gate /* embedded function term types (2.7) */
441*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_LVL_CAL_NOISE_SRC	0x0701
442*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_EQUAL_NOISE		0x0702
443*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_CD_PLAYER		0x0703
444*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DAT			0x0704
445*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DCC			0x0705
446*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_MINIDISK		0x0706
447*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_ANALOG_TAPE		0x0707
448*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_PHONOGRAPH		0x0708
449*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_VCR_AUDIO		0x0709
450*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_VIDEO_DISK_AUDIO	0x070A
451*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_DVD_AUDIO		0x070B
452*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_TV_TUNER_AUDIO	0x070C
453*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_SATELLITE_RCV_AUDIO	0x070D
454*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_CABLE_TUNER_AUDIO	0x070E
455*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_CABLE_DSS_AUDIO	0x070F
456*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_RADIO_RECEIVER	0x0710
457*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_RADIO_TRANSMITTER	0x0711
458*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_MULTI_TRACK_RECORDER 0x0712
459*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_TERM_TYPE_SYNTHESIZER		0x0713
460*7c478bd9Sstevel@tonic-gate 
461*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_ATTA		0x00000001
462*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_CLOSE	0x00000002
463*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_OPEN		0x00000004
464*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_EVENTS	0x00000008
465*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_PM		0x00000010
466*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_CB		0x00000020
467*7c478bd9Sstevel@tonic-gate #define	PRINT_MASK_ALL		0xFFFFFFFF
468*7c478bd9Sstevel@tonic-gate 
469*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MIN_PKTSZ	0
470*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MAX_PKTSZ	(4 * 1024)
471*7c478bd9Sstevel@tonic-gate 
472*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MUTE_ON	1
473*7c478bd9Sstevel@tonic-gate #define	USB_AUDIO_MUTE_OFF	0
474*7c478bd9Sstevel@tonic-gate 
475*7c478bd9Sstevel@tonic-gate #ifdef __cplusplus
476*7c478bd9Sstevel@tonic-gate }
477*7c478bd9Sstevel@tonic-gate #endif
478*7c478bd9Sstevel@tonic-gate 
479*7c478bd9Sstevel@tonic-gate #endif	/* _SYS_USB_AUDIO_H */
480