uaudio.c revision 193640
1/*	$NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $	*/
2/*	$FreeBSD: head/sys/dev/sound/usb/uaudio.c 193640 2009-06-07 19:12:08Z ariff $ */
3
4/*-
5 * Copyright (c) 1999 The NetBSD Foundation, Inc.
6 * All rights reserved.
7 *
8 * This code is derived from software contributed to The NetBSD Foundation
9 * by Lennart Augustsson (lennart@augustsson.net) at
10 * Carlstedt Research & Technology.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 * 1. Redistributions of source code must retain the above copyright
16 *    notice, this list of conditions and the following disclaimer.
17 * 2. Redistributions in binary form must reproduce the above copyright
18 *    notice, this list of conditions and the following disclaimer in the
19 *    documentation and/or other materials provided with the distribution.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33
34/*
35 * USB audio specs: http://www.usb.org/developers/devclass_docs/audio10.pdf
36 *                  http://www.usb.org/developers/devclass_docs/frmts10.pdf
37 *                  http://www.usb.org/developers/devclass_docs/termt10.pdf
38 */
39
40/*
41 * Also merged:
42 *  $NetBSD: uaudio.c,v 1.94 2005/01/15 15:19:53 kent Exp $
43 *  $NetBSD: uaudio.c,v 1.95 2005/01/16 06:02:19 dsainty Exp $
44 *  $NetBSD: uaudio.c,v 1.96 2005/01/16 12:46:00 kent Exp $
45 *  $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $
46 */
47
48#include "usbdevs.h"
49#include <dev/usb/usb.h>
50#include <dev/usb/usb_mfunc.h>
51#include <dev/usb/usb_error.h>
52
53#define	USB_DEBUG_VAR uaudio_debug
54
55#include <dev/usb/usb_core.h>
56#include <dev/usb/usb_lookup.h>
57#include <dev/usb/usb_debug.h>
58#include <dev/usb/usb_util.h>
59#include <dev/usb/usb_busdma.h>
60#include <dev/usb/usb_parse.h>
61#include <dev/usb/usb_request.h>
62#include <dev/usb/usb_mbuf.h>
63#include <dev/usb/usb_dev.h>
64#include <dev/usb/usb_dynamic.h>
65
66#include <dev/usb/quirk/usb_quirk.h>
67
68#include <sys/reboot.h>			/* for bootverbose */
69
70#ifdef HAVE_KERNEL_OPTION_HEADERS
71#include "opt_snd.h"
72#endif
73
74#include <dev/sound/pcm/sound.h>
75#include <dev/sound/usb/uaudioreg.h>
76#include <dev/sound/usb/uaudio.h>
77#include <dev/sound/chip.h>
78#include "feeder_if.h"
79
80static int uaudio_default_rate = 96000;
81static int uaudio_default_bits = 32;
82static int uaudio_default_channels = 2;
83
84#if USB_DEBUG
85static int uaudio_debug = 0;
86
87SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
88SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW,
89    &uaudio_debug, 0, "uaudio debug level");
90SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RW,
91    &uaudio_default_rate, 0, "uaudio default sample rate");
92SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RW,
93    &uaudio_default_bits, 0, "uaudio default sample bits");
94SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW,
95    &uaudio_default_channels, 0, "uaudio default sample channels");
96#endif
97
98#define	UAUDIO_MINFRAMES       16	/* must be factor of 8 due HS-USB */
99#define	UAUDIO_NCHANBUFS        2	/* number of outstanding request */
100#define	UAUDIO_RECURSE_LIMIT   24	/* rounds */
101
102#define	MAKE_WORD(h,l) (((h) << 8) | (l))
103#define	BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
104#define	UAUDIO_MAX_CHAN(x) (x)
105
106struct uaudio_mixer_node {
107	int32_t	minval;
108	int32_t	maxval;
109#define	MIX_MAX_CHAN 8
110	int32_t	wValue[MIX_MAX_CHAN];	/* using nchan */
111	uint32_t delta;
112	uint32_t mul;
113	uint32_t ctl;
114
115	uint16_t wData[MIX_MAX_CHAN];	/* using nchan */
116	uint16_t wIndex;
117
118	uint8_t	update[(MIX_MAX_CHAN + 7) / 8];
119	uint8_t	nchan;
120	uint8_t	type;
121#define	MIX_ON_OFF	1
122#define	MIX_SIGNED_16	2
123#define	MIX_UNSIGNED_16	3
124#define	MIX_SIGNED_8	4
125#define	MIX_SELECTOR	5
126#define	MIX_UNKNOWN     6
127#define	MIX_SIZE(n) ((((n) == MIX_SIGNED_16) || \
128		      ((n) == MIX_UNSIGNED_16)) ? 2 : 1)
129#define	MIX_UNSIGNED(n) ((n) == MIX_UNSIGNED_16)
130
131#define	MAX_SELECTOR_INPUT_PIN 256
132	uint8_t	slctrtype[MAX_SELECTOR_INPUT_PIN];
133	uint8_t	class;
134
135	struct uaudio_mixer_node *next;
136};
137
138struct uaudio_chan {
139	struct pcmchan_caps pcm_cap;	/* capabilities */
140
141	struct snd_dbuf *pcm_buf;
142	const struct usb_config *usb2_cfg;
143	struct mtx *pcm_mtx;		/* lock protecting this structure */
144	struct uaudio_softc *priv_sc;
145	struct pcm_channel *pcm_ch;
146	struct usb_xfer *xfer[UAUDIO_NCHANBUFS];
147	const struct usb2_audio_streaming_interface_descriptor *p_asid;
148	const struct usb2_audio_streaming_type1_descriptor *p_asf1d;
149	const struct usb2_audio_streaming_endpoint_descriptor *p_sed;
150	const usb2_endpoint_descriptor_audio_t *p_ed1;
151	const usb2_endpoint_descriptor_audio_t *p_ed2;
152	const struct uaudio_format *p_fmt;
153
154	uint8_t *buf;			/* pointer to buffer */
155	uint8_t *start;			/* upper layer buffer start */
156	uint8_t *end;			/* upper layer buffer end */
157	uint8_t *cur;			/* current position in upper layer
158					 * buffer */
159
160	uint32_t intr_size;		/* in bytes */
161	uint32_t block_size;
162	uint32_t sample_rate;
163	uint32_t format;
164	uint32_t pcm_format[2];
165
166	uint16_t bytes_per_frame;
167
168	uint8_t	valid;
169	uint8_t	iface_index;
170	uint8_t	iface_alt_index;
171};
172
173#define	UMIDI_N_TRANSFER    4		/* units */
174#define	UMIDI_CABLES_MAX   16		/* units */
175#define	UMIDI_BULK_SIZE  1024		/* bytes */
176
177struct umidi_sub_chan {
178	struct usb_fifo_sc fifo;
179	uint8_t *temp_cmd;
180	uint8_t	temp_0[4];
181	uint8_t	temp_1[4];
182	uint8_t	state;
183#define	UMIDI_ST_UNKNOWN   0		/* scan for command */
184#define	UMIDI_ST_1PARAM    1
185#define	UMIDI_ST_2PARAM_1  2
186#define	UMIDI_ST_2PARAM_2  3
187#define	UMIDI_ST_SYSEX_0   4
188#define	UMIDI_ST_SYSEX_1   5
189#define	UMIDI_ST_SYSEX_2   6
190
191	uint8_t	read_open:1;
192	uint8_t	write_open:1;
193	uint8_t	unused:6;
194};
195
196struct umidi_chan {
197
198	struct umidi_sub_chan sub[UMIDI_CABLES_MAX];
199	struct mtx mtx;
200
201	struct usb_xfer *xfer[UMIDI_N_TRANSFER];
202
203	uint8_t	iface_index;
204	uint8_t	iface_alt_index;
205
206	uint8_t	flags;
207#define	UMIDI_FLAG_READ_STALL  0x01
208#define	UMIDI_FLAG_WRITE_STALL 0x02
209
210	uint8_t	read_open_refcount;
211	uint8_t	write_open_refcount;
212
213	uint8_t	curr_cable;
214	uint8_t	max_cable;
215	uint8_t	valid;
216};
217
218struct uaudio_softc {
219	struct sbuf sc_sndstat;
220	struct sndcard_func sc_sndcard_func;
221	struct uaudio_chan sc_rec_chan;
222	struct uaudio_chan sc_play_chan;
223	struct umidi_chan sc_midi_chan;
224
225	struct usb_device *sc_udev;
226	struct usb_xfer *sc_mixer_xfer[1];
227	struct uaudio_mixer_node *sc_mixer_root;
228	struct uaudio_mixer_node *sc_mixer_curr;
229
230	uint32_t sc_mix_info;
231	uint32_t sc_recsrc_info;
232
233	uint16_t sc_audio_rev;
234	uint16_t sc_mixer_count;
235
236	uint8_t	sc_sndstat_valid;
237	uint8_t	sc_mixer_iface_index;
238	uint8_t	sc_mixer_iface_no;
239	uint8_t	sc_mixer_chan;
240	uint8_t	sc_pcm_registered:1;
241	uint8_t	sc_mixer_init:1;
242	uint8_t	sc_uq_audio_swap_lr:1;
243	uint8_t	sc_uq_au_inp_async:1;
244	uint8_t	sc_uq_au_no_xu:1;
245	uint8_t	sc_uq_bad_adc:1;
246};
247
248struct uaudio_search_result {
249	uint8_t	bit_input[(256 + 7) / 8];
250	uint8_t	bit_output[(256 + 7) / 8];
251	uint8_t	bit_visited[(256 + 7) / 8];
252	uint8_t	recurse_level;
253	uint8_t	id_max;
254};
255
256struct uaudio_terminal_node {
257	union {
258		const struct usb_descriptor *desc;
259		const struct usb2_audio_input_terminal *it;
260		const struct usb2_audio_output_terminal *ot;
261		const struct usb2_audio_mixer_unit_0 *mu;
262		const struct usb2_audio_selector_unit *su;
263		const struct usb2_audio_feature_unit *fu;
264		const struct usb2_audio_processing_unit_0 *pu;
265		const struct usb2_audio_extension_unit_0 *eu;
266	}	u;
267	struct uaudio_search_result usr;
268	struct uaudio_terminal_node *root;
269};
270
271struct uaudio_format {
272	uint16_t wFormat;
273	uint8_t	bPrecision;
274	uint32_t freebsd_fmt;
275	const char *description;
276};
277
278static const struct uaudio_format uaudio_formats[] = {
279
280	{UA_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
281	{UA_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
282	{UA_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
283	{UA_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
284
285	{UA_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
286	{UA_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
287	{UA_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
288	{UA_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
289
290	{UA_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
291	{UA_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
292
293	{0, 0, 0, NULL}
294};
295
296#define	UAC_OUTPUT	0
297#define	UAC_INPUT	1
298#define	UAC_EQUAL	2
299#define	UAC_RECORD	3
300#define	UAC_NCLASSES	4
301
302#if USB_DEBUG
303static const char *uac_names[] = {
304	"outputs", "inputs", "equalization", "record"
305};
306
307#endif
308
309/* prototypes */
310
311static device_probe_t uaudio_probe;
312static device_attach_t uaudio_attach;
313static device_detach_t uaudio_detach;
314
315static usb_callback_t uaudio_chan_play_callback;
316static usb_callback_t uaudio_chan_record_callback;
317static usb_callback_t uaudio_mixer_write_cfg_callback;
318static usb_callback_t umidi_read_clear_stall_callback;
319static usb_callback_t umidi_bulk_read_callback;
320static usb_callback_t umidi_write_clear_stall_callback;
321static usb_callback_t umidi_bulk_write_callback;
322
323static void	uaudio_chan_fill_info_sub(struct uaudio_softc *,
324		    struct usb_device *, uint32_t, uint16_t, uint8_t, uint8_t);
325static void	uaudio_chan_fill_info(struct uaudio_softc *,
326		    struct usb_device *);
327static void	uaudio_mixer_add_ctl_sub(struct uaudio_softc *,
328		    struct uaudio_mixer_node *);
329static void	uaudio_mixer_add_ctl(struct uaudio_softc *,
330		    struct uaudio_mixer_node *);
331static void	uaudio_mixer_add_input(struct uaudio_softc *,
332		    const struct uaudio_terminal_node *, int);
333static void	uaudio_mixer_add_output(struct uaudio_softc *,
334		    const struct uaudio_terminal_node *, int);
335static void	uaudio_mixer_add_mixer(struct uaudio_softc *,
336		    const struct uaudio_terminal_node *, int);
337static void	uaudio_mixer_add_selector(struct uaudio_softc *,
338		    const struct uaudio_terminal_node *, int);
339static uint32_t	uaudio_mixer_feature_get_bmaControls(
340		    const struct usb2_audio_feature_unit *, uint8_t);
341static void	uaudio_mixer_add_feature(struct uaudio_softc *,
342		    const struct uaudio_terminal_node *, int);
343static void	uaudio_mixer_add_processing_updown(struct uaudio_softc *,
344		    const struct uaudio_terminal_node *, int);
345static void	uaudio_mixer_add_processing(struct uaudio_softc *,
346		    const struct uaudio_terminal_node *, int);
347static void	uaudio_mixer_add_extension(struct uaudio_softc *,
348		    const struct uaudio_terminal_node *, int);
349static struct	usb2_audio_cluster uaudio_mixer_get_cluster(uint8_t,
350		    const struct uaudio_terminal_node *);
351static uint16_t	uaudio_mixer_determine_class(const struct uaudio_terminal_node *,
352		    struct uaudio_mixer_node *);
353static uint16_t	uaudio_mixer_feature_name(const struct uaudio_terminal_node *,
354		    struct uaudio_mixer_node *);
355static const struct uaudio_terminal_node *uaudio_mixer_get_input(
356		    const struct uaudio_terminal_node *, uint8_t);
357static const struct uaudio_terminal_node *uaudio_mixer_get_output(
358		    const struct uaudio_terminal_node *, uint8_t);
359static void	uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *,
360		    const uint8_t *, uint8_t, struct uaudio_search_result *);
361static void	uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *,
362		    uint8_t, uint8_t, struct uaudio_search_result *);
363static void	uaudio_mixer_fill_info(struct uaudio_softc *,
364		    struct usb_device *, void *);
365static uint16_t	uaudio_mixer_get(struct usb_device *, uint8_t,
366		    struct uaudio_mixer_node *);
367static void	uaudio_mixer_ctl_set(struct uaudio_softc *,
368		    struct uaudio_mixer_node *, uint8_t, int32_t val);
369static usb_error_t uaudio_set_speed(struct usb_device *, uint8_t, uint32_t);
370static int	uaudio_mixer_signext(uint8_t, int);
371static int	uaudio_mixer_bsd2value(struct uaudio_mixer_node *, int32_t val);
372static const void *uaudio_mixer_verify_desc(const void *, uint32_t);
373static void	uaudio_mixer_init(struct uaudio_softc *);
374static uint8_t	umidi_convert_to_usb(struct umidi_sub_chan *, uint8_t, uint8_t);
375static struct	umidi_sub_chan *umidi_sub_by_fifo(struct usb_fifo *);
376static void	umidi_start_read(struct usb_fifo *);
377static void	umidi_stop_read(struct usb_fifo *);
378static void	umidi_start_write(struct usb_fifo *);
379static void	umidi_stop_write(struct usb_fifo *);
380static int	umidi_open(struct usb_fifo *, int);
381static int	umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int);
382static void	umidi_close(struct usb_fifo *, int);
383static void	umidi_init(device_t dev);
384static int32_t	umidi_probe(device_t dev);
385static int32_t	umidi_detach(device_t dev);
386
387#if USB_DEBUG
388static void	uaudio_chan_dump_ep_desc(
389		    const usb2_endpoint_descriptor_audio_t *);
390static void	uaudio_mixer_dump_cluster(uint8_t,
391		    const struct uaudio_terminal_node *);
392static const char *uaudio_mixer_get_terminal_name(uint16_t);
393#endif
394
395static const struct usb_config
396	uaudio_cfg_record[UAUDIO_NCHANBUFS] = {
397	[0] = {
398		.type = UE_ISOCHRONOUS,
399		.endpoint = UE_ADDR_ANY,
400		.direction = UE_DIR_IN,
401		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
402		.frames = UAUDIO_MINFRAMES,
403		.flags = {.short_xfer_ok = 1,},
404		.callback = &uaudio_chan_record_callback,
405	},
406
407	[1] = {
408		.type = UE_ISOCHRONOUS,
409		.endpoint = UE_ADDR_ANY,
410		.direction = UE_DIR_IN,
411		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
412		.frames = UAUDIO_MINFRAMES,
413		.flags = {.short_xfer_ok = 1,},
414		.callback = &uaudio_chan_record_callback,
415	},
416};
417
418static const struct usb_config
419	uaudio_cfg_play[UAUDIO_NCHANBUFS] = {
420	[0] = {
421		.type = UE_ISOCHRONOUS,
422		.endpoint = UE_ADDR_ANY,
423		.direction = UE_DIR_OUT,
424		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
425		.frames = UAUDIO_MINFRAMES,
426		.flags = {.short_xfer_ok = 1,},
427		.callback = &uaudio_chan_play_callback,
428	},
429
430	[1] = {
431		.type = UE_ISOCHRONOUS,
432		.endpoint = UE_ADDR_ANY,
433		.direction = UE_DIR_OUT,
434		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
435		.frames = UAUDIO_MINFRAMES,
436		.flags = {.short_xfer_ok = 1,},
437		.callback = &uaudio_chan_play_callback,
438	},
439};
440
441static const struct usb_config
442	uaudio_mixer_config[1] = {
443	[0] = {
444		.type = UE_CONTROL,
445		.endpoint = 0x00,	/* Control pipe */
446		.direction = UE_DIR_ANY,
447		.bufsize = (sizeof(struct usb_device_request) + 4),
448		.callback = &uaudio_mixer_write_cfg_callback,
449		.timeout = 1000,	/* 1 second */
450	},
451};
452
453static const
454uint8_t	umidi_cmd_to_len[16] = {
455	[0x0] = 0,			/* reserved */
456	[0x1] = 0,			/* reserved */
457	[0x2] = 2,			/* bytes */
458	[0x3] = 3,			/* bytes */
459	[0x4] = 3,			/* bytes */
460	[0x5] = 1,			/* bytes */
461	[0x6] = 2,			/* bytes */
462	[0x7] = 3,			/* bytes */
463	[0x8] = 3,			/* bytes */
464	[0x9] = 3,			/* bytes */
465	[0xA] = 3,			/* bytes */
466	[0xB] = 3,			/* bytes */
467	[0xC] = 2,			/* bytes */
468	[0xD] = 2,			/* bytes */
469	[0xE] = 3,			/* bytes */
470	[0xF] = 1,			/* bytes */
471};
472
473static const struct usb_config
474	umidi_config[UMIDI_N_TRANSFER] = {
475	[0] = {
476		.type = UE_BULK,
477		.endpoint = UE_ADDR_ANY,
478		.direction = UE_DIR_OUT,
479		.bufsize = UMIDI_BULK_SIZE,
480		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
481		.callback = &umidi_bulk_write_callback,
482	},
483
484	[1] = {
485		.type = UE_BULK,
486		.endpoint = UE_ADDR_ANY,
487		.direction = UE_DIR_IN,
488		.bufsize = UMIDI_BULK_SIZE,
489		.flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
490		.callback = &umidi_bulk_read_callback,
491	},
492
493	[2] = {
494		.type = UE_CONTROL,
495		.endpoint = 0x00,	/* Control pipe */
496		.direction = UE_DIR_ANY,
497		.bufsize = sizeof(struct usb_device_request),
498		.flags = {},
499		.callback = &umidi_write_clear_stall_callback,
500		.timeout = 1000,	/* 1 second */
501		.interval = 50,	/* 50ms */
502	},
503
504	[3] = {
505		.type = UE_CONTROL,
506		.endpoint = 0x00,	/* Control pipe */
507		.direction = UE_DIR_ANY,
508		.bufsize = sizeof(struct usb_device_request),
509		.flags = {},
510		.callback = &umidi_read_clear_stall_callback,
511		.timeout = 1000,	/* 1 second */
512		.interval = 50,	/* 50ms */
513	},
514};
515
516static devclass_t uaudio_devclass;
517
518static device_method_t uaudio_methods[] = {
519	DEVMETHOD(device_probe, uaudio_probe),
520	DEVMETHOD(device_attach, uaudio_attach),
521	DEVMETHOD(device_detach, uaudio_detach),
522	DEVMETHOD(device_suspend, bus_generic_suspend),
523	DEVMETHOD(device_resume, bus_generic_resume),
524	DEVMETHOD(device_shutdown, bus_generic_shutdown),
525	DEVMETHOD(bus_print_child, bus_generic_print_child),
526	{0, 0}
527};
528
529static driver_t uaudio_driver = {
530	.name = "uaudio",
531	.methods = uaudio_methods,
532	.size = sizeof(struct uaudio_softc),
533};
534
535static int
536uaudio_probe(device_t dev)
537{
538	struct usb_attach_arg *uaa = device_get_ivars(dev);
539
540	if (uaa->usb_mode != USB_MODE_HOST)
541		return (ENXIO);
542
543	if (uaa->use_generic == 0)
544		return (ENXIO);
545
546	/* trigger on the control interface */
547
548	if ((uaa->info.bInterfaceClass == UICLASS_AUDIO) &&
549	    (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL)) {
550		if (usb2_test_quirk(uaa, UQ_BAD_AUDIO))
551			return (ENXIO);
552		else
553			return (0);
554	}
555	return (ENXIO);
556}
557
558static int
559uaudio_attach(device_t dev)
560{
561	struct usb_attach_arg *uaa = device_get_ivars(dev);
562	struct uaudio_softc *sc = device_get_softc(dev);
563	struct usb_interface_descriptor *id;
564	device_t child;
565
566	sc->sc_play_chan.priv_sc = sc;
567	sc->sc_rec_chan.priv_sc = sc;
568	sc->sc_udev = uaa->device;
569
570	if (usb2_test_quirk(uaa, UQ_AUDIO_SWAP_LR))
571		sc->sc_uq_audio_swap_lr = 1;
572
573	if (usb2_test_quirk(uaa, UQ_AU_INP_ASYNC))
574		sc->sc_uq_au_inp_async = 1;
575
576	if (usb2_test_quirk(uaa, UQ_AU_NO_XU))
577		sc->sc_uq_au_no_xu = 1;
578
579	if (usb2_test_quirk(uaa, UQ_BAD_ADC))
580		sc->sc_uq_bad_adc = 1;
581
582	umidi_init(dev);
583
584	device_set_usb2_desc(dev);
585
586	id = usb2_get_interface_descriptor(uaa->iface);
587
588	uaudio_chan_fill_info(sc, uaa->device);
589
590	uaudio_mixer_fill_info(sc, uaa->device, id);
591
592	sc->sc_mixer_iface_index = uaa->info.bIfaceIndex;
593	sc->sc_mixer_iface_no = uaa->info.bIfaceNum;
594
595	DPRINTF("audio rev %d.%02x\n",
596	    sc->sc_audio_rev >> 8,
597	    sc->sc_audio_rev & 0xff);
598
599	DPRINTF("%d mixer controls\n",
600	    sc->sc_mixer_count);
601
602	if (sc->sc_play_chan.valid) {
603		device_printf(dev, "Play: %d Hz, %d ch, %s format\n",
604		    sc->sc_play_chan.sample_rate,
605		    sc->sc_play_chan.p_asf1d->bNrChannels,
606		    sc->sc_play_chan.p_fmt->description);
607	} else {
608		device_printf(dev, "No playback!\n");
609	}
610
611	if (sc->sc_rec_chan.valid) {
612		device_printf(dev, "Record: %d Hz, %d ch, %s format\n",
613		    sc->sc_rec_chan.sample_rate,
614		    sc->sc_rec_chan.p_asf1d->bNrChannels,
615		    sc->sc_rec_chan.p_fmt->description);
616	} else {
617		device_printf(dev, "No recording!\n");
618	}
619
620	if (sc->sc_midi_chan.valid) {
621
622		if (umidi_probe(dev)) {
623			goto detach;
624		}
625		device_printf(dev, "MIDI sequencer\n");
626	} else {
627		device_printf(dev, "No midi sequencer\n");
628	}
629
630	DPRINTF("doing child attach\n");
631
632	/* attach the children */
633
634	sc->sc_sndcard_func.func = SCF_PCM;
635
636	child = device_add_child(dev, "pcm", -1);
637
638	if (child == NULL) {
639		DPRINTF("out of memory\n");
640		goto detach;
641	}
642	device_set_ivars(child, &sc->sc_sndcard_func);
643
644	if (bus_generic_attach(dev)) {
645		DPRINTF("child attach failed\n");
646		goto detach;
647	}
648	return (0);			/* success */
649
650detach:
651	uaudio_detach(dev);
652	return (ENXIO);
653}
654
655static void
656uaudio_pcm_setflags(device_t dev, uint32_t flags)
657{
658	pcm_setflags(dev, pcm_getflags(dev) | flags);
659}
660
661int
662uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_class)
663{
664	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
665	char status[SND_STATUSLEN];
666
667	uaudio_mixer_init(sc);
668
669	if (sc->sc_uq_audio_swap_lr) {
670		DPRINTF("hardware has swapped left and right\n");
671		/* uaudio_pcm_setflags(dev, SD_F_PSWAPLR); */
672	}
673	if (!(sc->sc_mix_info & SOUND_MASK_PCM)) {
674
675		DPRINTF("emulating master volume\n");
676
677		/*
678		 * Emulate missing pcm mixer controller
679		 * through FEEDER_VOLUME
680		 */
681		uaudio_pcm_setflags(dev, SD_F_SOFTPCMVOL);
682	}
683	if (mixer_init(dev, mixer_class, sc)) {
684		goto detach;
685	}
686	sc->sc_mixer_init = 1;
687
688	snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio));
689
690	if (pcm_register(dev, sc,
691	    sc->sc_play_chan.valid ? 1 : 0,
692	    sc->sc_rec_chan.valid ? 1 : 0)) {
693		goto detach;
694	}
695
696	uaudio_pcm_setflags(dev, SD_F_MPSAFE);
697	sc->sc_pcm_registered = 1;
698
699	if (sc->sc_play_chan.valid) {
700		pcm_addchan(dev, PCMDIR_PLAY, chan_class, sc);
701	}
702	if (sc->sc_rec_chan.valid) {
703		pcm_addchan(dev, PCMDIR_REC, chan_class, sc);
704	}
705	pcm_setstatus(dev, status);
706
707	return (0);			/* success */
708
709detach:
710	uaudio_detach_sub(dev);
711	return (ENXIO);
712}
713
714int
715uaudio_detach_sub(device_t dev)
716{
717	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
718	int error = 0;
719
720repeat:
721	if (sc->sc_pcm_registered) {
722		error = pcm_unregister(dev);
723	} else {
724		if (sc->sc_mixer_init) {
725			error = mixer_uninit(dev);
726		}
727	}
728
729	if (error) {
730		device_printf(dev, "Waiting for sound application to exit!\n");
731		usb2_pause_mtx(NULL, 2 * hz);
732		goto repeat;		/* try again */
733	}
734	return (0);			/* success */
735}
736
737static int
738uaudio_detach(device_t dev)
739{
740	struct uaudio_softc *sc = device_get_softc(dev);
741
742	if (bus_generic_detach(dev)) {
743		DPRINTF("detach failed!\n");
744	}
745	sbuf_delete(&sc->sc_sndstat);
746	sc->sc_sndstat_valid = 0;
747
748	umidi_detach(dev);
749
750	return (0);
751}
752
753/*========================================================================*
754 * AS - Audio Stream - routines
755 *========================================================================*/
756
757#if USB_DEBUG
758static void
759uaudio_chan_dump_ep_desc(const usb2_endpoint_descriptor_audio_t *ed)
760{
761	if (ed) {
762		DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n"
763		    "bEndpointAddress=%d bmAttributes=0x%x \n"
764		    "wMaxPacketSize=%d bInterval=%d \n"
765		    "bRefresh=%d bSynchAddress=%d\n",
766		    ed, ed->bLength, ed->bDescriptorType,
767		    ed->bEndpointAddress, ed->bmAttributes,
768		    UGETW(ed->wMaxPacketSize), ed->bInterval,
769		    ed->bRefresh, ed->bSynchAddress);
770	}
771}
772
773#endif
774
775static void
776uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
777    uint32_t rate, uint16_t fps, uint8_t channels,
778    uint8_t bit_resolution)
779{
780	struct usb_descriptor *desc = NULL;
781	const struct usb2_audio_streaming_interface_descriptor *asid = NULL;
782	const struct usb2_audio_streaming_type1_descriptor *asf1d = NULL;
783	const struct usb2_audio_streaming_endpoint_descriptor *sed = NULL;
784	const usb2_endpoint_descriptor_audio_t *ed1 = NULL;
785	const usb2_endpoint_descriptor_audio_t *ed2 = NULL;
786	struct usb_config_descriptor *cd = usb2_get_config_descriptor(udev);
787	struct usb_interface_descriptor *id;
788	const struct uaudio_format *p_fmt;
789	struct uaudio_chan *chan;
790	uint16_t curidx = 0xFFFF;
791	uint16_t lastidx = 0xFFFF;
792	uint16_t alt_index = 0;
793	uint16_t wFormat;
794	uint8_t ep_dir;
795	uint8_t ep_type;
796	uint8_t ep_sync;
797	uint8_t bChannels;
798	uint8_t bBitResolution;
799	uint8_t x;
800	uint8_t audio_if = 0;
801	uint8_t sample_size;
802
803	while ((desc = usb2_desc_foreach(cd, desc))) {
804
805		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
806		    (desc->bLength >= sizeof(*id))) {
807
808			id = (void *)desc;
809
810			if (id->bInterfaceNumber != lastidx) {
811				lastidx = id->bInterfaceNumber;
812				curidx++;
813				alt_index = 0;
814
815			} else {
816				alt_index++;
817			}
818
819			if ((id->bInterfaceClass == UICLASS_AUDIO) &&
820			    (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
821				audio_if = 1;
822			} else {
823				audio_if = 0;
824			}
825
826			if ((id->bInterfaceClass == UICLASS_AUDIO) &&
827			    (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
828
829				/*
830				 * XXX could allow multiple MIDI interfaces
831				 * XXX
832				 */
833
834				if ((sc->sc_midi_chan.valid == 0) &&
835				    usb2_get_iface(udev, curidx)) {
836					sc->sc_midi_chan.iface_index = curidx;
837					sc->sc_midi_chan.iface_alt_index = alt_index;
838					sc->sc_midi_chan.valid = 1;
839				}
840			}
841			asid = NULL;
842			asf1d = NULL;
843			ed1 = NULL;
844			ed2 = NULL;
845			sed = NULL;
846		}
847		if ((desc->bDescriptorType == UDESC_CS_INTERFACE) &&
848		    (desc->bDescriptorSubtype == AS_GENERAL) &&
849		    (desc->bLength >= sizeof(*asid))) {
850			if (asid == NULL) {
851				asid = (void *)desc;
852			}
853		}
854		if ((desc->bDescriptorType == UDESC_CS_INTERFACE) &&
855		    (desc->bDescriptorSubtype == FORMAT_TYPE) &&
856		    (desc->bLength >= sizeof(*asf1d))) {
857			if (asf1d == NULL) {
858				asf1d = (void *)desc;
859				if (asf1d->bFormatType != FORMAT_TYPE_I) {
860					DPRINTFN(11, "ignored bFormatType = %d\n",
861					    asf1d->bFormatType);
862					asf1d = NULL;
863					continue;
864				}
865				if (asf1d->bLength < (sizeof(*asf1d) +
866				    (asf1d->bSamFreqType == 0) ? 6 :
867				    (asf1d->bSamFreqType * 3))) {
868					DPRINTFN(11, "'asf1d' descriptor is too short\n");
869					asf1d = NULL;
870					continue;
871				}
872			}
873		}
874		if ((desc->bDescriptorType == UDESC_ENDPOINT) &&
875		    (desc->bLength >= sizeof(*ed1))) {
876			if (ed1 == NULL) {
877				ed1 = (void *)desc;
878				if (UE_GET_XFERTYPE(ed1->bmAttributes) != UE_ISOCHRONOUS) {
879					ed1 = NULL;
880				}
881			} else {
882				if (ed2 == NULL) {
883					ed2 = (void *)desc;
884					if (UE_GET_XFERTYPE(ed2->bmAttributes) != UE_ISOCHRONOUS) {
885						ed2 = NULL;
886						continue;
887					}
888					if (ed2->bSynchAddress != 0) {
889						DPRINTFN(11, "invalid endpoint: bSynchAddress != 0\n");
890						ed2 = NULL;
891						continue;
892					}
893					if (ed2->bEndpointAddress != ed1->bSynchAddress) {
894						DPRINTFN(11, "invalid endpoint addresses: "
895						    "ep[0]->bSynchAddress=0x%x "
896						    "ep[1]->bEndpointAddress=0x%x\n",
897						    ed1->bSynchAddress,
898						    ed2->bEndpointAddress);
899						ed2 = NULL;
900						continue;
901					}
902				}
903			}
904		}
905		if ((desc->bDescriptorType == UDESC_CS_ENDPOINT) &&
906		    (desc->bDescriptorSubtype == AS_GENERAL) &&
907		    (desc->bLength >= sizeof(*sed))) {
908			if (sed == NULL) {
909				sed = (void *)desc;
910			}
911		}
912		if (audio_if && asid && asf1d && ed1 && sed) {
913
914			ep_dir = UE_GET_DIR(ed1->bEndpointAddress);
915			ep_type = UE_GET_ISO_TYPE(ed1->bmAttributes);
916			ep_sync = 0;
917
918			if ((sc->sc_uq_au_inp_async) &&
919			    (ep_dir == UE_DIR_IN) && (ep_type == UE_ISO_ADAPT)) {
920				ep_type = UE_ISO_ASYNC;
921			}
922			if ((ep_dir == UE_DIR_IN) && (ep_type == UE_ISO_ADAPT)) {
923				ep_sync = 1;
924			}
925			if ((ep_dir != UE_DIR_IN) && (ep_type == UE_ISO_ASYNC)) {
926				ep_sync = 1;
927			}
928			/* Ignore sync endpoint information until further. */
929#if 0
930			if (ep_sync && (!ed2)) {
931				continue;
932			}
933			/*
934			 * we can't handle endpoints that need a sync pipe
935			 * yet
936			 */
937
938			if (ep_sync) {
939				DPRINTF("skipped sync interface\n");
940				audio_if = 0;
941				continue;
942			}
943#endif
944
945			wFormat = UGETW(asid->wFormatTag);
946			bChannels = UAUDIO_MAX_CHAN(asf1d->bNrChannels);
947			bBitResolution = asf1d->bBitResolution;
948
949			DPRINTFN(9, "bChannels=%u\n", bChannels);
950
951			if (asf1d->bSamFreqType == 0) {
952				DPRINTFN(16, "Sample rate: %d-%dHz\n",
953				    UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d));
954
955				if ((rate >= UA_SAMP_LO(asf1d)) &&
956				    (rate <= UA_SAMP_HI(asf1d))) {
957					goto found_rate;
958				}
959			} else {
960
961				for (x = 0; x < asf1d->bSamFreqType; x++) {
962					DPRINTFN(16, "Sample rate = %dHz\n",
963					    UA_GETSAMP(asf1d, x));
964
965					if (rate == UA_GETSAMP(asf1d, x)) {
966						goto found_rate;
967					}
968				}
969			}
970
971			audio_if = 0;
972			continue;
973
974	found_rate:
975
976			for (p_fmt = uaudio_formats;
977			    p_fmt->wFormat;
978			    p_fmt++) {
979				if ((p_fmt->wFormat == wFormat) &&
980				    (p_fmt->bPrecision == bBitResolution)) {
981					goto found_format;
982				}
983			}
984
985			audio_if = 0;
986			continue;
987
988	found_format:
989
990			if ((bChannels == channels) &&
991			    (bBitResolution == bit_resolution)) {
992
993				chan = (ep_dir == UE_DIR_IN) ?
994				    &sc->sc_rec_chan :
995				    &sc->sc_play_chan;
996
997				if ((chan->valid == 0) && usb2_get_iface(udev, curidx)) {
998
999					chan->valid = 1;
1000#if USB_DEBUG
1001					uaudio_chan_dump_ep_desc(ed1);
1002					uaudio_chan_dump_ep_desc(ed2);
1003
1004					if (sed->bmAttributes & UA_SED_FREQ_CONTROL) {
1005						DPRINTFN(2, "FREQ_CONTROL\n");
1006					}
1007					if (sed->bmAttributes & UA_SED_PITCH_CONTROL) {
1008						DPRINTFN(2, "PITCH_CONTROL\n");
1009					}
1010#endif
1011					DPRINTF("Sample rate = %dHz, channels = %d, "
1012					    "bits = %d, format = %s\n", rate, channels,
1013					    bit_resolution, p_fmt->description);
1014
1015					chan->sample_rate = rate;
1016					chan->p_asid = asid;
1017					chan->p_asf1d = asf1d;
1018					chan->p_ed1 = ed1;
1019					chan->p_ed2 = ed2;
1020					chan->p_fmt = p_fmt;
1021					chan->p_sed = sed;
1022					chan->iface_index = curidx;
1023					chan->iface_alt_index = alt_index;
1024
1025					if (ep_dir == UE_DIR_IN)
1026						chan->usb2_cfg =
1027						    uaudio_cfg_record;
1028					else
1029						chan->usb2_cfg =
1030						    uaudio_cfg_play;
1031
1032					sample_size = ((
1033					    UAUDIO_MAX_CHAN(chan->p_asf1d->bNrChannels) *
1034					    chan->p_asf1d->bBitResolution) / 8);
1035
1036					/*
1037					 * NOTE: "chan->bytes_per_frame"
1038					 * should not be zero!
1039					 */
1040					chan->bytes_per_frame = ((rate / fps) * sample_size);
1041
1042					if (sc->sc_sndstat_valid) {
1043						sbuf_printf(&sc->sc_sndstat, "\n\t"
1044						    "mode %d.%d:(%s) %dch, %d/%dbit, %s, %dHz",
1045						    curidx, alt_index,
1046						    (ep_dir == UE_DIR_IN) ? "input" : "output",
1047						    asf1d->bNrChannels, asf1d->bBitResolution,
1048						    asf1d->bSubFrameSize * 8,
1049						    p_fmt->description, rate);
1050					}
1051				}
1052			}
1053			audio_if = 0;
1054			continue;
1055		}
1056	}
1057}
1058
1059static void
1060uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev)
1061{
1062	uint32_t rate = uaudio_default_rate;
1063	uint32_t z;
1064	uint16_t fps = usb2_get_isoc_fps(udev);
1065	uint8_t bits = uaudio_default_bits;
1066	uint8_t y;
1067	uint8_t channels = uaudio_default_channels;
1068	uint8_t x;
1069
1070	bits -= (bits % 8);
1071	if ((bits == 0) || (bits > 32)) {
1072		/* set a valid value */
1073		bits = 32;
1074	}
1075	rate -= (rate % fps);
1076	if ((rate == 0) || (rate > 192000)) {
1077		/* set a valid value */
1078		rate = 192000 - (192000 % fps);
1079	}
1080	if ((channels == 0) || (channels > 2)) {
1081		/* set a valid value */
1082		channels = 2;
1083	}
1084	if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND)) {
1085		sc->sc_sndstat_valid = 1;
1086	}
1087	/* try to search for a valid config */
1088
1089	for (x = channels; x; x--) {
1090		for (y = bits; y; y -= 8) {
1091			for (z = rate; z; z -= fps) {
1092				uaudio_chan_fill_info_sub(sc, udev, z, fps, x, y);
1093
1094				if (sc->sc_rec_chan.valid &&
1095				    sc->sc_play_chan.valid) {
1096					goto done;
1097				}
1098			}
1099		}
1100	}
1101
1102done:
1103	if (sc->sc_sndstat_valid) {
1104		sbuf_finish(&sc->sc_sndstat);
1105	}
1106}
1107
1108static void
1109uaudio_chan_play_callback(struct usb_xfer *xfer)
1110{
1111	struct uaudio_chan *ch = xfer->priv_sc;
1112	uint32_t *p_len = xfer->frlengths;
1113	uint32_t total;
1114	uint32_t blockcount;
1115	uint32_t n;
1116	uint32_t offset;
1117
1118	/* allow dynamic sizing of play buffer */
1119	total = ch->intr_size;
1120
1121	/* allow dynamic sizing of play buffer */
1122	blockcount = total / ch->bytes_per_frame;
1123
1124	/* align units */
1125	blockcount -= (blockcount % UAUDIO_MINFRAMES);
1126
1127	/* range check - min */
1128	if (blockcount == 0) {
1129		blockcount = UAUDIO_MINFRAMES;
1130	}
1131	/* range check - max */
1132	if (blockcount > xfer->max_frame_count) {
1133		blockcount = xfer->max_frame_count;
1134	}
1135	/* compute the total length */
1136	total = blockcount * ch->bytes_per_frame;
1137
1138	switch (USB_GET_STATE(xfer)) {
1139	case USB_ST_TRANSFERRED:
1140tr_transferred:
1141		if (xfer->actlen < xfer->sumlen) {
1142			DPRINTF("short transfer, "
1143			    "%d of %d bytes\n", xfer->actlen, total);
1144		}
1145		chn_intr(ch->pcm_ch);
1146
1147	case USB_ST_SETUP:
1148		if (ch->bytes_per_frame > xfer->max_frame_size) {
1149			DPRINTF("bytes per transfer, %d, "
1150			    "exceeds maximum, %d!\n",
1151			    ch->bytes_per_frame,
1152			    xfer->max_frame_size);
1153			break;
1154		}
1155		/* setup frame length */
1156		xfer->nframes = blockcount;
1157		for (n = 0; n != blockcount; n++) {
1158			p_len[n] = ch->bytes_per_frame;
1159		}
1160
1161		if (ch->end == ch->start) {
1162			DPRINTF("no buffer!\n");
1163			break;
1164		}
1165		DPRINTFN(6, "transfer %d bytes\n", total);
1166
1167		offset = 0;
1168
1169		while (total > 0) {
1170
1171			n = (ch->end - ch->cur);
1172			if (n > total) {
1173				n = total;
1174			}
1175			usb2_copy_in(xfer->frbuffers, offset, ch->cur, n);
1176
1177			total -= n;
1178			ch->cur += n;
1179			offset += n;
1180
1181			if (ch->cur >= ch->end) {
1182				ch->cur = ch->start;
1183			}
1184		}
1185
1186		usb2_start_hardware(xfer);
1187		break;
1188
1189	default:			/* Error */
1190		if (xfer->error == USB_ERR_CANCELLED) {
1191			break;
1192		}
1193		goto tr_transferred;
1194	}
1195}
1196
1197static void
1198uaudio_chan_record_callback(struct usb_xfer *xfer)
1199{
1200	struct uaudio_chan *ch = xfer->priv_sc;
1201	uint32_t *p_len = xfer->frlengths;
1202	uint32_t n;
1203	uint32_t m;
1204	uint32_t total;
1205	uint32_t blockcount;
1206	uint32_t offset0;
1207	uint32_t offset1;
1208
1209	/* allow dynamic sizing of play buffer */
1210	total = ch->intr_size;
1211
1212	/* allow dynamic sizing of play buffer */
1213	blockcount = total / ch->bytes_per_frame;
1214
1215	/* align units */
1216	blockcount -= (blockcount % UAUDIO_MINFRAMES);
1217
1218	/* range check - min */
1219	if (blockcount == 0) {
1220		blockcount = UAUDIO_MINFRAMES;
1221	}
1222	/* range check - max */
1223	if (blockcount > xfer->max_frame_count) {
1224		blockcount = xfer->max_frame_count;
1225	}
1226	/* compute the total length */
1227	total = blockcount * ch->bytes_per_frame;
1228
1229	switch (USB_GET_STATE(xfer)) {
1230	case USB_ST_TRANSFERRED:
1231tr_transferred:
1232		if (xfer->actlen < total) {
1233			DPRINTF("short transfer, "
1234			    "%d of %d bytes\n", xfer->actlen, total);
1235		} else {
1236			DPRINTFN(6, "transferred %d bytes\n", xfer->actlen);
1237		}
1238
1239		offset0 = 0;
1240
1241		for (n = 0; n != xfer->nframes; n++) {
1242
1243			offset1 = offset0;
1244
1245			while (p_len[n] > 0) {
1246
1247				m = (ch->end - ch->cur);
1248
1249				if (m > p_len[n]) {
1250					m = p_len[n];
1251				}
1252				usb2_copy_out(xfer->frbuffers, offset1, ch->cur, m);
1253
1254				p_len[n] -= m;
1255				offset1 += m;
1256				ch->cur += m;
1257
1258				if (ch->cur >= ch->end) {
1259					ch->cur = ch->start;
1260				}
1261			}
1262
1263			offset0 += ch->bytes_per_frame;
1264		}
1265
1266		chn_intr(ch->pcm_ch);
1267
1268	case USB_ST_SETUP:
1269		if (ch->bytes_per_frame > xfer->max_frame_size) {
1270			DPRINTF("bytes per transfer, %d, "
1271			    "exceeds maximum, %d!\n",
1272			    ch->bytes_per_frame,
1273			    xfer->max_frame_size);
1274			return;
1275		}
1276		xfer->nframes = blockcount;
1277		for (n = 0; n != xfer->nframes; n++) {
1278			p_len[n] = ch->bytes_per_frame;
1279		}
1280
1281		if (ch->end == ch->start) {
1282			DPRINTF("no buffer!\n");
1283			return;
1284		}
1285		usb2_start_hardware(xfer);
1286		return;
1287
1288	default:			/* Error */
1289		if (xfer->error == USB_ERR_CANCELLED) {
1290			return;
1291		}
1292		goto tr_transferred;
1293	}
1294}
1295
1296void   *
1297uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b,
1298    struct pcm_channel *c, int dir)
1299{
1300	struct uaudio_chan *ch = ((dir == PCMDIR_PLAY) ?
1301	    &sc->sc_play_chan : &sc->sc_rec_chan);
1302	uint32_t buf_size;
1303	uint8_t endpoint;
1304	uint8_t iface_index;
1305	uint8_t alt_index;
1306	usb_error_t err;
1307
1308	/* compute required buffer size */
1309	buf_size = (ch->bytes_per_frame * UAUDIO_MINFRAMES);
1310
1311	/* setup interrupt interval */
1312	ch->intr_size = buf_size;
1313
1314	/* double buffering */
1315	buf_size *= 2;
1316
1317	ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO);
1318	if (ch->buf == NULL) {
1319		goto error;
1320	}
1321	if (sndbuf_setup(b, ch->buf, buf_size) != 0) {
1322		goto error;
1323	}
1324	ch->start = ch->buf;
1325	ch->end = ch->buf + buf_size;
1326	ch->cur = ch->buf;
1327	ch->pcm_ch = c;
1328	ch->pcm_mtx = c->lock;
1329	ch->pcm_buf = b;
1330
1331	if (ch->pcm_mtx == NULL) {
1332		DPRINTF("ERROR: PCM channels does not have a mutex!\n");
1333		goto error;
1334	}
1335	/* setup play/record format */
1336
1337	ch->pcm_cap.fmtlist = ch->pcm_format;
1338
1339	ch->pcm_format[0] = 0;
1340	ch->pcm_format[1] = 0;
1341
1342	ch->pcm_cap.minspeed = ch->sample_rate;
1343	ch->pcm_cap.maxspeed = ch->sample_rate;
1344
1345	if (ch->p_asf1d->bNrChannels >= 2)
1346		ch->pcm_cap.fmtlist[0] =
1347		    SND_FORMAT(ch->p_fmt->freebsd_fmt, 2, 0);
1348	else
1349		ch->pcm_cap.fmtlist[0] =
1350		    SND_FORMAT(ch->p_fmt->freebsd_fmt, 1, 0);
1351
1352	ch->pcm_cap.fmtlist[1] = 0;
1353
1354
1355	/* set alternate interface corresponding to the mode */
1356
1357	endpoint = ch->p_ed1->bEndpointAddress;
1358	iface_index = ch->iface_index;
1359	alt_index = ch->iface_alt_index;
1360
1361	DPRINTF("endpoint=0x%02x, speed=%d, iface=%d alt=%d\n",
1362	    endpoint, ch->sample_rate, iface_index, alt_index);
1363
1364	err = usb2_set_alt_interface_index(sc->sc_udev, iface_index, alt_index);
1365	if (err) {
1366		DPRINTF("setting of alternate index failed: %s!\n",
1367		    usb2_errstr(err));
1368		goto error;
1369	}
1370	usb2_set_parent_iface(sc->sc_udev, iface_index, sc->sc_mixer_iface_index);
1371
1372	/*
1373	 * If just one sampling rate is supported,
1374	 * no need to call "uaudio_set_speed()".
1375	 * Roland SD-90 freezes by a SAMPLING_FREQ_CONTROL request.
1376	 */
1377	if (ch->p_asf1d->bSamFreqType != 1) {
1378		if (uaudio_set_speed(sc->sc_udev, endpoint, ch->sample_rate)) {
1379			/*
1380			 * If the endpoint is adaptive setting the speed may
1381			 * fail.
1382			 */
1383			DPRINTF("setting of sample rate failed! (continuing anyway)\n");
1384		}
1385	}
1386	if (usb2_transfer_setup(sc->sc_udev, &iface_index, ch->xfer,
1387	    ch->usb2_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) {
1388		DPRINTF("could not allocate USB transfers!\n");
1389		goto error;
1390	}
1391	return (ch);
1392
1393error:
1394	uaudio_chan_free(ch);
1395	return (NULL);
1396}
1397
1398int
1399uaudio_chan_free(struct uaudio_chan *ch)
1400{
1401	if (ch->buf != NULL) {
1402		free(ch->buf, M_DEVBUF);
1403		ch->buf = NULL;
1404	}
1405	usb2_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS);
1406
1407	ch->valid = 0;
1408
1409	return (0);
1410}
1411
1412int
1413uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize)
1414{
1415	uaudio_chan_set_param_fragments(ch, blocksize, 0 - 1);
1416
1417	return (ch->block_size);
1418}
1419
1420int
1421uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize,
1422    uint32_t blockcount)
1423{
1424	/* we only support one size */
1425	blocksize = ch->intr_size;
1426	blockcount = 2;
1427
1428	if ((sndbuf_getblksz(ch->pcm_buf) != blocksize) ||
1429	    (sndbuf_getblkcnt(ch->pcm_buf) != blockcount)) {
1430		DPRINTFN(1, "resizing to %u x "
1431		    "%u bytes\n", blockcount, blocksize);
1432		if (sndbuf_resize(ch->pcm_buf, blockcount, blocksize)) {
1433			DPRINTFN(0, "failed to resize sound buffer, count=%u, "
1434			    "size=%u\n", blockcount, blocksize);
1435		}
1436	}
1437	ch->block_size = sndbuf_getblksz(ch->pcm_buf);
1438
1439	return (1);
1440}
1441
1442int
1443uaudio_chan_set_param_speed(struct uaudio_chan *ch, uint32_t speed)
1444{
1445	if (speed != ch->sample_rate) {
1446		DPRINTF("rate conversion required\n");
1447	}
1448	return (ch->sample_rate);
1449}
1450
1451int
1452uaudio_chan_getptr(struct uaudio_chan *ch)
1453{
1454	return (ch->cur - ch->start);
1455}
1456
1457struct pcmchan_caps *
1458uaudio_chan_getcaps(struct uaudio_chan *ch)
1459{
1460	return (&ch->pcm_cap);
1461}
1462
1463static struct pcmchan_matrix uaudio_chan_matrix_swap_2_0 = {
1464	.id = SND_CHN_MATRIX_DRV,
1465	.channels = 2,
1466	.ext = 0,
1467	.map = {
1468		/* Right */
1469		[0] = {
1470			.type = SND_CHN_T_FR,
1471			.members =
1472			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |
1473			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |
1474			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR
1475		},
1476		/* Left */
1477		[1] = {
1478			.type = SND_CHN_T_FL,
1479			.members =
1480			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |
1481			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |
1482			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL
1483		},
1484		[2] = {
1485			.type = SND_CHN_T_MAX,
1486			.members = 0
1487		}
1488	},
1489	.mask = SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FL,
1490	.offset = {  1,  0, -1, -1, -1, -1, -1, -1, -1,
1491		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }
1492};
1493
1494struct pcmchan_matrix *
1495uaudio_chan_getmatrix(struct uaudio_chan *ch, uint32_t format)
1496{
1497	struct uaudio_softc *sc;
1498
1499	sc = ch->priv_sc;
1500
1501	if (sc != NULL && sc->sc_uq_audio_swap_lr != 0 &&
1502	    AFMT_CHANNEL(format) == 2)
1503		return (&uaudio_chan_matrix_swap_2_0);
1504
1505	return (feeder_matrix_format_map(format));
1506}
1507
1508int
1509uaudio_chan_set_param_format(struct uaudio_chan *ch, uint32_t format)
1510{
1511	ch->format = format;
1512	return (0);
1513}
1514
1515int
1516uaudio_chan_start(struct uaudio_chan *ch)
1517{
1518	ch->cur = ch->start;
1519
1520#if (UAUDIO_NCHANBUFS != 2)
1521#error "please update code"
1522#endif
1523	if (ch->xfer[0]) {
1524		usb2_transfer_start(ch->xfer[0]);
1525	}
1526	if (ch->xfer[1]) {
1527		usb2_transfer_start(ch->xfer[1]);
1528	}
1529	return (0);
1530}
1531
1532int
1533uaudio_chan_stop(struct uaudio_chan *ch)
1534{
1535#if (UAUDIO_NCHANBUFS != 2)
1536#error "please update code"
1537#endif
1538	usb2_transfer_stop(ch->xfer[0]);
1539	usb2_transfer_stop(ch->xfer[1]);
1540	return (0);
1541}
1542
1543/*========================================================================*
1544 * AC - Audio Controller - routines
1545 *========================================================================*/
1546
1547static void
1548uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
1549{
1550	struct uaudio_mixer_node *p_mc_new =
1551	malloc(sizeof(*p_mc_new), M_USBDEV, M_WAITOK);
1552
1553	if (p_mc_new) {
1554		bcopy(mc, p_mc_new, sizeof(*p_mc_new));
1555		p_mc_new->next = sc->sc_mixer_root;
1556		sc->sc_mixer_root = p_mc_new;
1557		sc->sc_mixer_count++;
1558	} else {
1559		DPRINTF("out of memory\n");
1560	}
1561}
1562
1563static void
1564uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
1565{
1566	int32_t res;
1567
1568	if (mc->class < UAC_NCLASSES) {
1569		DPRINTF("adding %s.%d\n",
1570		    uac_names[mc->class], mc->ctl);
1571	} else {
1572		DPRINTF("adding %d\n", mc->ctl);
1573	}
1574
1575	mc->delta = 0;
1576	if (mc->type == MIX_ON_OFF) {
1577		mc->minval = 0;
1578		mc->maxval = 1;
1579	} else if (mc->type == MIX_SELECTOR) {
1580
1581	} else {
1582
1583		/* determine min and max values */
1584
1585		mc->minval = uaudio_mixer_get(sc->sc_udev, GET_MIN, mc);
1586
1587		mc->minval = uaudio_mixer_signext(mc->type, mc->minval);
1588
1589		mc->maxval = uaudio_mixer_get(sc->sc_udev, GET_MAX, mc);
1590
1591		mc->maxval = 1 + uaudio_mixer_signext(mc->type, mc->maxval);
1592
1593		mc->mul = mc->maxval - mc->minval;
1594		if (mc->mul == 0) {
1595			mc->mul = 1;
1596		}
1597		res = uaudio_mixer_get(sc->sc_udev, GET_RES, mc);
1598		if (res > 0) {
1599			mc->delta = ((res * 255) + (mc->mul / 2)) / mc->mul;
1600		}
1601	}
1602
1603	if (mc->maxval < mc->minval) {
1604		mc->maxval = mc->minval;
1605	}
1606	uaudio_mixer_add_ctl_sub(sc, mc);
1607
1608#if USB_DEBUG
1609	if (uaudio_debug > 2) {
1610		uint8_t i;
1611
1612		for (i = 0; i < mc->nchan; i++) {
1613			DPRINTF("[mix] wValue=%04x\n", mc->wValue[0]);
1614		}
1615		DPRINTF("[mix] wIndex=%04x type=%d ctl='%d' "
1616		    "min=%d max=%d\n",
1617		    mc->wIndex, mc->type, mc->ctl,
1618		    mc->minval, mc->maxval);
1619	}
1620#endif
1621}
1622
1623static void
1624uaudio_mixer_add_input(struct uaudio_softc *sc,
1625    const struct uaudio_terminal_node *iot, int id)
1626{
1627#if USB_DEBUG
1628	const struct usb2_audio_input_terminal *d = iot[id].u.it;
1629
1630	DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x "
1631	    "bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d "
1632	    "iChannelNames=%d\n",
1633	    d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal,
1634	    d->bNrChannels, UGETW(d->wChannelConfig),
1635	    d->iChannelNames);
1636#endif
1637}
1638
1639static void
1640uaudio_mixer_add_output(struct uaudio_softc *sc,
1641    const struct uaudio_terminal_node *iot, int id)
1642{
1643#if USB_DEBUG
1644	const struct usb2_audio_output_terminal *d = iot[id].u.ot;
1645
1646	DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x "
1647	    "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n",
1648	    d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal,
1649	    d->bSourceId, d->iTerminal);
1650#endif
1651}
1652
1653static void
1654uaudio_mixer_add_mixer(struct uaudio_softc *sc,
1655    const struct uaudio_terminal_node *iot, int id)
1656{
1657	struct uaudio_mixer_node mix;
1658
1659	const struct usb2_audio_mixer_unit_0 *d0 = iot[id].u.mu;
1660	const struct usb2_audio_mixer_unit_1 *d1;
1661
1662	uint32_t bno;			/* bit number */
1663	uint32_t p;			/* bit number accumulator */
1664	uint32_t mo;			/* matching outputs */
1665	uint32_t mc;			/* matching channels */
1666	uint32_t ichs;			/* input channels */
1667	uint32_t ochs;			/* output channels */
1668	uint32_t c;
1669	uint32_t chs;			/* channels */
1670	uint32_t i;
1671	uint32_t o;
1672
1673	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
1674	    d0->bUnitId, d0->bNrInPins);
1675
1676	/* compute the number of input channels */
1677
1678	ichs = 0;
1679	for (i = 0; i < d0->bNrInPins; i++) {
1680		ichs += (uaudio_mixer_get_cluster(d0->baSourceId[i], iot)
1681		    .bNrChannels);
1682	}
1683
1684	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
1685
1686	/* and the number of output channels */
1687
1688	ochs = d1->bNrChannels;
1689
1690	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
1691
1692	bzero(&mix, sizeof(mix));
1693
1694	mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
1695	uaudio_mixer_determine_class(&iot[id], &mix);
1696	mix.type = MIX_SIGNED_16;
1697
1698	if (uaudio_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL) {
1699		return;
1700	}
1701	for (p = i = 0; i < d0->bNrInPins; i++) {
1702		chs = uaudio_mixer_get_cluster(d0->baSourceId[i], iot).bNrChannels;
1703		mc = 0;
1704		for (c = 0; c < chs; c++) {
1705			mo = 0;
1706			for (o = 0; o < ochs; o++) {
1707				bno = ((p + c) * ochs) + o;
1708				if (BIT_TEST(d1->bmControls, bno)) {
1709					mo++;
1710				}
1711			}
1712			if (mo == 1) {
1713				mc++;
1714			}
1715		}
1716		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
1717
1718			/* repeat bit-scan */
1719
1720			mc = 0;
1721			for (c = 0; c < chs; c++) {
1722				for (o = 0; o < ochs; o++) {
1723					bno = ((p + c) * ochs) + o;
1724					if (BIT_TEST(d1->bmControls, bno)) {
1725						mix.wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
1726					}
1727				}
1728			}
1729			mix.nchan = chs;
1730			uaudio_mixer_add_ctl(sc, &mix);
1731		} else {
1732			/* XXX */
1733		}
1734		p += chs;
1735	}
1736}
1737
1738static void
1739uaudio_mixer_add_selector(struct uaudio_softc *sc,
1740    const struct uaudio_terminal_node *iot, int id)
1741{
1742	const struct usb2_audio_selector_unit *d = iot[id].u.su;
1743	struct uaudio_mixer_node mix;
1744	uint16_t i;
1745
1746	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
1747	    d->bUnitId, d->bNrInPins);
1748
1749	if (d->bNrInPins == 0) {
1750		return;
1751	}
1752	bzero(&mix, sizeof(mix));
1753
1754	mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
1755	mix.wValue[0] = MAKE_WORD(0, 0);
1756	uaudio_mixer_determine_class(&iot[id], &mix);
1757	mix.nchan = 1;
1758	mix.type = MIX_SELECTOR;
1759
1760	mix.ctl = SOUND_MIXER_NRDEVICES;
1761	mix.minval = 1;
1762	mix.maxval = d->bNrInPins;
1763
1764	if (mix.maxval > MAX_SELECTOR_INPUT_PIN) {
1765		mix.maxval = MAX_SELECTOR_INPUT_PIN;
1766	}
1767	mix.mul = (mix.maxval - mix.minval);
1768	for (i = 0; i < MAX_SELECTOR_INPUT_PIN; i++) {
1769		mix.slctrtype[i] = SOUND_MIXER_NRDEVICES;
1770	}
1771
1772	for (i = 0; i < mix.maxval; i++) {
1773		mix.slctrtype[i] = uaudio_mixer_feature_name
1774		    (&iot[d->baSourceId[i]], &mix);
1775	}
1776
1777	mix.class = 0;			/* not used */
1778
1779	uaudio_mixer_add_ctl(sc, &mix);
1780}
1781
1782static uint32_t
1783uaudio_mixer_feature_get_bmaControls(const struct usb2_audio_feature_unit *d,
1784    uint8_t index)
1785{
1786	uint32_t temp = 0;
1787	uint32_t offset = (index * d->bControlSize);
1788
1789	if (d->bControlSize > 0) {
1790		temp |= d->bmaControls[offset];
1791		if (d->bControlSize > 1) {
1792			temp |= d->bmaControls[offset + 1] << 8;
1793			if (d->bControlSize > 2) {
1794				temp |= d->bmaControls[offset + 2] << 16;
1795				if (d->bControlSize > 3) {
1796					temp |= d->bmaControls[offset + 3] << 24;
1797				}
1798			}
1799		}
1800	}
1801	return (temp);
1802}
1803
1804static void
1805uaudio_mixer_add_feature(struct uaudio_softc *sc,
1806    const struct uaudio_terminal_node *iot, int id)
1807{
1808	const struct usb2_audio_feature_unit *d = iot[id].u.fu;
1809	struct uaudio_mixer_node mix;
1810	uint32_t fumask;
1811	uint32_t mmask;
1812	uint32_t cmask;
1813	uint16_t mixernumber;
1814	uint8_t nchan;
1815	uint8_t chan;
1816	uint8_t ctl;
1817	uint8_t i;
1818
1819	if (d->bControlSize == 0) {
1820		return;
1821	}
1822	bzero(&mix, sizeof(mix));
1823
1824	nchan = (d->bLength - 7) / d->bControlSize;
1825	mmask = uaudio_mixer_feature_get_bmaControls(d, 0);
1826	cmask = 0;
1827
1828	if (nchan == 0) {
1829		return;
1830	}
1831	/* figure out what we can control */
1832
1833	for (chan = 1; chan < nchan; chan++) {
1834		DPRINTFN(10, "chan=%d mask=%x\n",
1835		    chan, uaudio_mixer_feature_get_bmaControls(d, chan));
1836
1837		cmask |= uaudio_mixer_feature_get_bmaControls(d, chan);
1838	}
1839
1840	if (nchan > MIX_MAX_CHAN) {
1841		nchan = MIX_MAX_CHAN;
1842	}
1843	mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
1844
1845	for (ctl = 1; ctl <= LOUDNESS_CONTROL; ctl++) {
1846
1847		fumask = FU_MASK(ctl);
1848
1849		DPRINTFN(5, "ctl=%d fumask=0x%04x\n",
1850		    ctl, fumask);
1851
1852		if (mmask & fumask) {
1853			mix.nchan = 1;
1854			mix.wValue[0] = MAKE_WORD(ctl, 0);
1855		} else if (cmask & fumask) {
1856			mix.nchan = nchan - 1;
1857			for (i = 1; i < nchan; i++) {
1858				if (uaudio_mixer_feature_get_bmaControls(d, i) & fumask)
1859					mix.wValue[i - 1] = MAKE_WORD(ctl, i);
1860				else
1861					mix.wValue[i - 1] = -1;
1862			}
1863		} else {
1864			continue;
1865		}
1866
1867		mixernumber = uaudio_mixer_feature_name(&iot[id], &mix);
1868
1869		switch (ctl) {
1870		case MUTE_CONTROL:
1871			mix.type = MIX_ON_OFF;
1872			mix.ctl = SOUND_MIXER_NRDEVICES;
1873			break;
1874
1875		case VOLUME_CONTROL:
1876			mix.type = MIX_SIGNED_16;
1877			mix.ctl = mixernumber;
1878			break;
1879
1880		case BASS_CONTROL:
1881			mix.type = MIX_SIGNED_8;
1882			mix.ctl = SOUND_MIXER_BASS;
1883			break;
1884
1885		case MID_CONTROL:
1886			mix.type = MIX_SIGNED_8;
1887			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
1888			break;
1889
1890		case TREBLE_CONTROL:
1891			mix.type = MIX_SIGNED_8;
1892			mix.ctl = SOUND_MIXER_TREBLE;
1893			break;
1894
1895		case GRAPHIC_EQUALIZER_CONTROL:
1896			continue;	/* XXX don't add anything */
1897			break;
1898
1899		case AGC_CONTROL:
1900			mix.type = MIX_ON_OFF;
1901			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
1902			break;
1903
1904		case DELAY_CONTROL:
1905			mix.type = MIX_UNSIGNED_16;
1906			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
1907			break;
1908
1909		case BASS_BOOST_CONTROL:
1910			mix.type = MIX_ON_OFF;
1911			mix.ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
1912			break;
1913
1914		case LOUDNESS_CONTROL:
1915			mix.type = MIX_ON_OFF;
1916			mix.ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
1917			break;
1918
1919		default:
1920			mix.type = MIX_UNKNOWN;
1921			break;
1922		}
1923
1924		if (mix.type != MIX_UNKNOWN) {
1925			uaudio_mixer_add_ctl(sc, &mix);
1926		}
1927	}
1928}
1929
1930static void
1931uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
1932    const struct uaudio_terminal_node *iot, int id)
1933{
1934	const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu;
1935	const struct usb2_audio_processing_unit_1 *d1 =
1936	(const void *)(d0->baSourceId + d0->bNrInPins);
1937	const struct usb2_audio_processing_unit_updown *ud =
1938	(const void *)(d1->bmControls + d1->bControlSize);
1939	struct uaudio_mixer_node mix;
1940	uint8_t i;
1941
1942	if (uaudio_mixer_verify_desc(d0, sizeof(*ud)) == NULL) {
1943		return;
1944	}
1945	if (uaudio_mixer_verify_desc(d0, sizeof(*ud) + (2 * ud->bNrModes))
1946	    == NULL) {
1947		return;
1948	}
1949	DPRINTFN(3, "bUnitId=%d bNrModes=%d\n",
1950	    d0->bUnitId, ud->bNrModes);
1951
1952	if (!(d1->bmControls[0] & UA_PROC_MASK(UD_MODE_SELECT_CONTROL))) {
1953		DPRINTF("no mode select\n");
1954		return;
1955	}
1956	bzero(&mix, sizeof(mix));
1957
1958	mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
1959	mix.nchan = 1;
1960	mix.wValue[0] = MAKE_WORD(UD_MODE_SELECT_CONTROL, 0);
1961	uaudio_mixer_determine_class(&iot[id], &mix);
1962	mix.type = MIX_ON_OFF;		/* XXX */
1963
1964	for (i = 0; i < ud->bNrModes; i++) {
1965		DPRINTFN(3, "i=%d bm=0x%x\n", i, UGETW(ud->waModes[i]));
1966		/* XXX */
1967	}
1968
1969	uaudio_mixer_add_ctl(sc, &mix);
1970}
1971
1972static void
1973uaudio_mixer_add_processing(struct uaudio_softc *sc,
1974    const struct uaudio_terminal_node *iot, int id)
1975{
1976	const struct usb2_audio_processing_unit_0 *d0 = iot[id].u.pu;
1977	const struct usb2_audio_processing_unit_1 *d1 =
1978	(const void *)(d0->baSourceId + d0->bNrInPins);
1979	struct uaudio_mixer_node mix;
1980	uint16_t ptype;
1981
1982	bzero(&mix, sizeof(mix));
1983
1984	ptype = UGETW(d0->wProcessType);
1985
1986	DPRINTFN(3, "wProcessType=%d bUnitId=%d "
1987	    "bNrInPins=%d\n", ptype, d0->bUnitId, d0->bNrInPins);
1988
1989	if (d1->bControlSize == 0) {
1990		return;
1991	}
1992	if (d1->bmControls[0] & UA_PROC_ENABLE_MASK) {
1993		mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
1994		mix.nchan = 1;
1995		mix.wValue[0] = MAKE_WORD(XX_ENABLE_CONTROL, 0);
1996		uaudio_mixer_determine_class(&iot[id], &mix);
1997		mix.type = MIX_ON_OFF;
1998		uaudio_mixer_add_ctl(sc, &mix);
1999	}
2000	switch (ptype) {
2001	case UPDOWNMIX_PROCESS:
2002		uaudio_mixer_add_processing_updown(sc, iot, id);
2003		break;
2004
2005	case DOLBY_PROLOGIC_PROCESS:
2006	case P3D_STEREO_EXTENDER_PROCESS:
2007	case REVERBATION_PROCESS:
2008	case CHORUS_PROCESS:
2009	case DYN_RANGE_COMP_PROCESS:
2010	default:
2011		DPRINTF("unit %d, type=%d is not implemented\n",
2012		    d0->bUnitId, ptype);
2013		break;
2014	}
2015}
2016
2017static void
2018uaudio_mixer_add_extension(struct uaudio_softc *sc,
2019    const struct uaudio_terminal_node *iot, int id)
2020{
2021	const struct usb2_audio_extension_unit_0 *d0 = iot[id].u.eu;
2022	const struct usb2_audio_extension_unit_1 *d1 =
2023	(const void *)(d0->baSourceId + d0->bNrInPins);
2024	struct uaudio_mixer_node mix;
2025
2026	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
2027	    d0->bUnitId, d0->bNrInPins);
2028
2029	if (sc->sc_uq_au_no_xu) {
2030		return;
2031	}
2032	if (d1->bControlSize == 0) {
2033		return;
2034	}
2035	if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
2036
2037		bzero(&mix, sizeof(mix));
2038
2039		mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
2040		mix.nchan = 1;
2041		mix.wValue[0] = MAKE_WORD(UA_EXT_ENABLE, 0);
2042		uaudio_mixer_determine_class(&iot[id], &mix);
2043		mix.type = MIX_ON_OFF;
2044
2045		uaudio_mixer_add_ctl(sc, &mix);
2046	}
2047}
2048
2049static const void *
2050uaudio_mixer_verify_desc(const void *arg, uint32_t len)
2051{
2052	const struct usb2_audio_mixer_unit_1 *d1;
2053	const struct usb2_audio_extension_unit_1 *e1;
2054	const struct usb2_audio_processing_unit_1 *u1;
2055
2056	union {
2057		const struct usb_descriptor *desc;
2058		const struct usb2_audio_input_terminal *it;
2059		const struct usb2_audio_output_terminal *ot;
2060		const struct usb2_audio_mixer_unit_0 *mu;
2061		const struct usb2_audio_selector_unit *su;
2062		const struct usb2_audio_feature_unit *fu;
2063		const struct usb2_audio_processing_unit_0 *pu;
2064		const struct usb2_audio_extension_unit_0 *eu;
2065	}     u;
2066
2067	u.desc = arg;
2068
2069	if (u.desc == NULL) {
2070		goto error;
2071	}
2072	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE) {
2073		goto error;
2074	}
2075	switch (u.desc->bDescriptorSubtype) {
2076	case UDESCSUB_AC_INPUT:
2077		len += sizeof(*u.it);
2078		break;
2079
2080	case UDESCSUB_AC_OUTPUT:
2081		len += sizeof(*u.ot);
2082		break;
2083
2084	case UDESCSUB_AC_MIXER:
2085		len += sizeof(*u.mu);
2086
2087		if (u.desc->bLength < len) {
2088			goto error;
2089		}
2090		len += u.mu->bNrInPins;
2091
2092		if (u.desc->bLength < len) {
2093			goto error;
2094		}
2095		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
2096
2097		len += sizeof(*d1);
2098		break;
2099
2100	case UDESCSUB_AC_SELECTOR:
2101		len += sizeof(*u.su);
2102
2103		if (u.desc->bLength < len) {
2104			goto error;
2105		}
2106		len += u.su->bNrInPins;
2107		break;
2108
2109	case UDESCSUB_AC_FEATURE:
2110		len += (sizeof(*u.fu) + 1);
2111		break;
2112
2113	case UDESCSUB_AC_PROCESSING:
2114		len += sizeof(*u.pu);
2115
2116		if (u.desc->bLength < len) {
2117			goto error;
2118		}
2119		len += u.pu->bNrInPins;
2120
2121		if (u.desc->bLength < len) {
2122			goto error;
2123		}
2124		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
2125
2126		len += sizeof(*u1);
2127
2128		if (u.desc->bLength < len) {
2129			goto error;
2130		}
2131		len += u1->bControlSize;
2132
2133		break;
2134
2135	case UDESCSUB_AC_EXTENSION:
2136		len += sizeof(*u.eu);
2137
2138		if (u.desc->bLength < len) {
2139			goto error;
2140		}
2141		len += u.eu->bNrInPins;
2142
2143		if (u.desc->bLength < len) {
2144			goto error;
2145		}
2146		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
2147
2148		len += sizeof(*e1);
2149
2150		if (u.desc->bLength < len) {
2151			goto error;
2152		}
2153		len += e1->bControlSize;
2154		break;
2155
2156	default:
2157		goto error;
2158	}
2159
2160	if (u.desc->bLength < len) {
2161		goto error;
2162	}
2163	return (u.desc);
2164
2165error:
2166	if (u.desc) {
2167		DPRINTF("invalid descriptor, type=%d, "
2168		    "sub_type=%d, len=%d of %d bytes\n",
2169		    u.desc->bDescriptorType,
2170		    u.desc->bDescriptorSubtype,
2171		    u.desc->bLength, len);
2172	}
2173	return (NULL);
2174}
2175
2176#if USB_DEBUG
2177static void
2178uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
2179{
2180	static const char *channel_names[16] = {
2181		"LEFT", "RIGHT", "CENTER", "LFE",
2182		"LEFT_SURROUND", "RIGHT_SURROUND", "LEFT_CENTER", "RIGHT_CENTER",
2183		"SURROUND", "LEFT_SIDE", "RIGHT_SIDE", "TOP",
2184		"RESERVED12", "RESERVED13", "RESERVED14", "RESERVED15",
2185	};
2186	uint16_t cc;
2187	uint8_t i;
2188	const struct usb2_audio_cluster cl = uaudio_mixer_get_cluster(id, iot);
2189
2190	cc = UGETW(cl.wChannelConfig);
2191
2192	DPRINTF("cluster: bNrChannels=%u iChannelNames=%u wChannelConfig="
2193	    "0x%04x:\n", cl.iChannelNames, cl.bNrChannels, cc);
2194
2195	for (i = 0; cc; i++) {
2196		if (cc & 1) {
2197			DPRINTF(" - %s\n", channel_names[i]);
2198		}
2199		cc >>= 1;
2200	}
2201}
2202
2203#endif
2204
2205static struct usb2_audio_cluster
2206uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
2207{
2208	struct usb2_audio_cluster r;
2209	const struct usb_descriptor *dp;
2210	uint8_t i;
2211
2212	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
2213		dp = iot[id].u.desc;
2214		if (dp == NULL) {
2215			goto error;
2216		}
2217		switch (dp->bDescriptorSubtype) {
2218		case UDESCSUB_AC_INPUT:
2219			r.bNrChannels = iot[id].u.it->bNrChannels;
2220			r.wChannelConfig[0] = iot[id].u.it->wChannelConfig[0];
2221			r.wChannelConfig[1] = iot[id].u.it->wChannelConfig[1];
2222			r.iChannelNames = iot[id].u.it->iChannelNames;
2223			goto done;
2224
2225		case UDESCSUB_AC_OUTPUT:
2226			id = iot[id].u.ot->bSourceId;
2227			break;
2228
2229		case UDESCSUB_AC_MIXER:
2230			r = *(const struct usb2_audio_cluster *)
2231			    &iot[id].u.mu->baSourceId[iot[id].u.mu->
2232			    bNrInPins];
2233			goto done;
2234
2235		case UDESCSUB_AC_SELECTOR:
2236			if (iot[id].u.su->bNrInPins > 0) {
2237				/* XXX This is not really right */
2238				id = iot[id].u.su->baSourceId[0];
2239			}
2240			break;
2241
2242		case UDESCSUB_AC_FEATURE:
2243			id = iot[id].u.fu->bSourceId;
2244			break;
2245
2246		case UDESCSUB_AC_PROCESSING:
2247			r = *((const struct usb2_audio_cluster *)
2248			    &iot[id].u.pu->baSourceId[iot[id].u.pu->
2249			    bNrInPins]);
2250			goto done;
2251
2252		case UDESCSUB_AC_EXTENSION:
2253			r = *((const struct usb2_audio_cluster *)
2254			    &iot[id].u.eu->baSourceId[iot[id].u.eu->
2255			    bNrInPins]);
2256			goto done;
2257
2258		default:
2259			goto error;
2260		}
2261	}
2262error:
2263	DPRINTF("bad data\n");
2264	bzero(&r, sizeof(r));
2265done:
2266	return (r);
2267}
2268
2269#if USB_DEBUG
2270
2271struct uaudio_tt_to_string {
2272	uint16_t terminal_type;
2273	const char *desc;
2274};
2275
2276static const struct uaudio_tt_to_string uaudio_tt_to_string[] = {
2277
2278	/* USB terminal types */
2279	{UAT_UNDEFINED, "UAT_UNDEFINED"},
2280	{UAT_STREAM, "UAT_STREAM"},
2281	{UAT_VENDOR, "UAT_VENDOR"},
2282
2283	/* input terminal types */
2284	{UATI_UNDEFINED, "UATI_UNDEFINED"},
2285	{UATI_MICROPHONE, "UATI_MICROPHONE"},
2286	{UATI_DESKMICROPHONE, "UATI_DESKMICROPHONE"},
2287	{UATI_PERSONALMICROPHONE, "UATI_PERSONALMICROPHONE"},
2288	{UATI_OMNIMICROPHONE, "UATI_OMNIMICROPHONE"},
2289	{UATI_MICROPHONEARRAY, "UATI_MICROPHONEARRAY"},
2290	{UATI_PROCMICROPHONEARR, "UATI_PROCMICROPHONEARR"},
2291
2292	/* output terminal types */
2293	{UATO_UNDEFINED, "UATO_UNDEFINED"},
2294	{UATO_SPEAKER, "UATO_SPEAKER"},
2295	{UATO_HEADPHONES, "UATO_HEADPHONES"},
2296	{UATO_DISPLAYAUDIO, "UATO_DISPLAYAUDIO"},
2297	{UATO_DESKTOPSPEAKER, "UATO_DESKTOPSPEAKER"},
2298	{UATO_ROOMSPEAKER, "UATO_ROOMSPEAKER"},
2299	{UATO_COMMSPEAKER, "UATO_COMMSPEAKER"},
2300	{UATO_SUBWOOFER, "UATO_SUBWOOFER"},
2301
2302	/* bidir terminal types */
2303	{UATB_UNDEFINED, "UATB_UNDEFINED"},
2304	{UATB_HANDSET, "UATB_HANDSET"},
2305	{UATB_HEADSET, "UATB_HEADSET"},
2306	{UATB_SPEAKERPHONE, "UATB_SPEAKERPHONE"},
2307	{UATB_SPEAKERPHONEESUP, "UATB_SPEAKERPHONEESUP"},
2308	{UATB_SPEAKERPHONEECANC, "UATB_SPEAKERPHONEECANC"},
2309
2310	/* telephony terminal types */
2311	{UATT_UNDEFINED, "UATT_UNDEFINED"},
2312	{UATT_PHONELINE, "UATT_PHONELINE"},
2313	{UATT_TELEPHONE, "UATT_TELEPHONE"},
2314	{UATT_DOWNLINEPHONE, "UATT_DOWNLINEPHONE"},
2315
2316	/* external terminal types */
2317	{UATE_UNDEFINED, "UATE_UNDEFINED"},
2318	{UATE_ANALOGCONN, "UATE_ANALOGCONN"},
2319	{UATE_LINECONN, "UATE_LINECONN"},
2320	{UATE_LEGACYCONN, "UATE_LEGACYCONN"},
2321	{UATE_DIGITALAUIFC, "UATE_DIGITALAUIFC"},
2322	{UATE_SPDIF, "UATE_SPDIF"},
2323	{UATE_1394DA, "UATE_1394DA"},
2324	{UATE_1394DV, "UATE_1394DV"},
2325
2326	/* embedded function terminal types */
2327	{UATF_UNDEFINED, "UATF_UNDEFINED"},
2328	{UATF_CALIBNOISE, "UATF_CALIBNOISE"},
2329	{UATF_EQUNOISE, "UATF_EQUNOISE"},
2330	{UATF_CDPLAYER, "UATF_CDPLAYER"},
2331	{UATF_DAT, "UATF_DAT"},
2332	{UATF_DCC, "UATF_DCC"},
2333	{UATF_MINIDISK, "UATF_MINIDISK"},
2334	{UATF_ANALOGTAPE, "UATF_ANALOGTAPE"},
2335	{UATF_PHONOGRAPH, "UATF_PHONOGRAPH"},
2336	{UATF_VCRAUDIO, "UATF_VCRAUDIO"},
2337	{UATF_VIDEODISCAUDIO, "UATF_VIDEODISCAUDIO"},
2338	{UATF_DVDAUDIO, "UATF_DVDAUDIO"},
2339	{UATF_TVTUNERAUDIO, "UATF_TVTUNERAUDIO"},
2340	{UATF_SATELLITE, "UATF_SATELLITE"},
2341	{UATF_CABLETUNER, "UATF_CABLETUNER"},
2342	{UATF_DSS, "UATF_DSS"},
2343	{UATF_RADIORECV, "UATF_RADIORECV"},
2344	{UATF_RADIOXMIT, "UATF_RADIOXMIT"},
2345	{UATF_MULTITRACK, "UATF_MULTITRACK"},
2346	{UATF_SYNTHESIZER, "UATF_SYNTHESIZER"},
2347
2348	/* unknown */
2349	{0x0000, "UNKNOWN"},
2350};
2351
2352static const char *
2353uaudio_mixer_get_terminal_name(uint16_t terminal_type)
2354{
2355	const struct uaudio_tt_to_string *uat = uaudio_tt_to_string;
2356
2357	while (uat->terminal_type) {
2358		if (uat->terminal_type == terminal_type) {
2359			break;
2360		}
2361		uat++;
2362	}
2363	if (uat->terminal_type == 0) {
2364		DPRINTF("unknown terminal type (0x%04x)", terminal_type);
2365	}
2366	return (uat->desc);
2367}
2368
2369#endif
2370
2371static uint16_t
2372uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot,
2373    struct uaudio_mixer_node *mix)
2374{
2375	uint16_t terminal_type = 0x0000;
2376	const struct uaudio_terminal_node *input[2];
2377	const struct uaudio_terminal_node *output[2];
2378
2379	input[0] = uaudio_mixer_get_input(iot, 0);
2380	input[1] = uaudio_mixer_get_input(iot, 1);
2381
2382	output[0] = uaudio_mixer_get_output(iot, 0);
2383	output[1] = uaudio_mixer_get_output(iot, 1);
2384
2385	/*
2386	 * check if there is only
2387	 * one output terminal:
2388	 */
2389	if (output[0] && (!output[1])) {
2390		terminal_type = UGETW(output[0]->u.ot->wTerminalType);
2391	}
2392	/*
2393	 * If the only output terminal is USB,
2394	 * the class is UAC_RECORD.
2395	 */
2396	if ((terminal_type & 0xff00) == (UAT_UNDEFINED & 0xff00)) {
2397
2398		mix->class = UAC_RECORD;
2399		if (input[0] && (!input[1])) {
2400			terminal_type = UGETW(input[0]->u.it->wTerminalType);
2401		} else {
2402			terminal_type = 0;
2403		}
2404		goto done;
2405	}
2406	/*
2407	 * if the unit is connected to just
2408	 * one input terminal, the
2409	 * class is UAC_INPUT:
2410	 */
2411	if (input[0] && (!input[1])) {
2412		mix->class = UAC_INPUT;
2413		terminal_type = UGETW(input[0]->u.it->wTerminalType);
2414		goto done;
2415	}
2416	/*
2417	 * Otherwise, the class is UAC_OUTPUT.
2418	 */
2419	mix->class = UAC_OUTPUT;
2420done:
2421	return (terminal_type);
2422}
2423
2424struct uaudio_tt_to_feature {
2425	uint16_t terminal_type;
2426	uint16_t feature;
2427};
2428
2429static const struct uaudio_tt_to_feature uaudio_tt_to_feature[] = {
2430
2431	{UAT_STREAM, SOUND_MIXER_PCM},
2432
2433	{UATI_MICROPHONE, SOUND_MIXER_MIC},
2434	{UATI_DESKMICROPHONE, SOUND_MIXER_MIC},
2435	{UATI_PERSONALMICROPHONE, SOUND_MIXER_MIC},
2436	{UATI_OMNIMICROPHONE, SOUND_MIXER_MIC},
2437	{UATI_MICROPHONEARRAY, SOUND_MIXER_MIC},
2438	{UATI_PROCMICROPHONEARR, SOUND_MIXER_MIC},
2439
2440	{UATO_SPEAKER, SOUND_MIXER_SPEAKER},
2441	{UATO_DESKTOPSPEAKER, SOUND_MIXER_SPEAKER},
2442	{UATO_ROOMSPEAKER, SOUND_MIXER_SPEAKER},
2443	{UATO_COMMSPEAKER, SOUND_MIXER_SPEAKER},
2444
2445	{UATE_ANALOGCONN, SOUND_MIXER_LINE},
2446	{UATE_LINECONN, SOUND_MIXER_LINE},
2447	{UATE_LEGACYCONN, SOUND_MIXER_LINE},
2448
2449	{UATE_DIGITALAUIFC, SOUND_MIXER_ALTPCM},
2450	{UATE_SPDIF, SOUND_MIXER_ALTPCM},
2451	{UATE_1394DA, SOUND_MIXER_ALTPCM},
2452	{UATE_1394DV, SOUND_MIXER_ALTPCM},
2453
2454	{UATF_CDPLAYER, SOUND_MIXER_CD},
2455
2456	{UATF_SYNTHESIZER, SOUND_MIXER_SYNTH},
2457
2458	{UATF_VIDEODISCAUDIO, SOUND_MIXER_VIDEO},
2459	{UATF_DVDAUDIO, SOUND_MIXER_VIDEO},
2460	{UATF_TVTUNERAUDIO, SOUND_MIXER_VIDEO},
2461
2462	/* telephony terminal types */
2463	{UATT_UNDEFINED, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2464	{UATT_PHONELINE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2465	{UATT_TELEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2466	{UATT_DOWNLINEPHONE, SOUND_MIXER_PHONEIN},	/* SOUND_MIXER_PHONEOUT */
2467
2468	{UATF_RADIORECV, SOUND_MIXER_RADIO},
2469	{UATF_RADIOXMIT, SOUND_MIXER_RADIO},
2470
2471	{UAT_UNDEFINED, SOUND_MIXER_VOLUME},
2472	{UAT_VENDOR, SOUND_MIXER_VOLUME},
2473	{UATI_UNDEFINED, SOUND_MIXER_VOLUME},
2474
2475	/* output terminal types */
2476	{UATO_UNDEFINED, SOUND_MIXER_VOLUME},
2477	{UATO_DISPLAYAUDIO, SOUND_MIXER_VOLUME},
2478	{UATO_SUBWOOFER, SOUND_MIXER_VOLUME},
2479	{UATO_HEADPHONES, SOUND_MIXER_VOLUME},
2480
2481	/* bidir terminal types */
2482	{UATB_UNDEFINED, SOUND_MIXER_VOLUME},
2483	{UATB_HANDSET, SOUND_MIXER_VOLUME},
2484	{UATB_HEADSET, SOUND_MIXER_VOLUME},
2485	{UATB_SPEAKERPHONE, SOUND_MIXER_VOLUME},
2486	{UATB_SPEAKERPHONEESUP, SOUND_MIXER_VOLUME},
2487	{UATB_SPEAKERPHONEECANC, SOUND_MIXER_VOLUME},
2488
2489	/* external terminal types */
2490	{UATE_UNDEFINED, SOUND_MIXER_VOLUME},
2491
2492	/* embedded function terminal types */
2493	{UATF_UNDEFINED, SOUND_MIXER_VOLUME},
2494	{UATF_CALIBNOISE, SOUND_MIXER_VOLUME},
2495	{UATF_EQUNOISE, SOUND_MIXER_VOLUME},
2496	{UATF_DAT, SOUND_MIXER_VOLUME},
2497	{UATF_DCC, SOUND_MIXER_VOLUME},
2498	{UATF_MINIDISK, SOUND_MIXER_VOLUME},
2499	{UATF_ANALOGTAPE, SOUND_MIXER_VOLUME},
2500	{UATF_PHONOGRAPH, SOUND_MIXER_VOLUME},
2501	{UATF_VCRAUDIO, SOUND_MIXER_VOLUME},
2502	{UATF_SATELLITE, SOUND_MIXER_VOLUME},
2503	{UATF_CABLETUNER, SOUND_MIXER_VOLUME},
2504	{UATF_DSS, SOUND_MIXER_VOLUME},
2505	{UATF_MULTITRACK, SOUND_MIXER_VOLUME},
2506	{0xffff, SOUND_MIXER_VOLUME},
2507
2508	/* default */
2509	{0x0000, SOUND_MIXER_VOLUME},
2510};
2511
2512static uint16_t
2513uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
2514    struct uaudio_mixer_node *mix)
2515{
2516	const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature;
2517	uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix);
2518
2519	if ((mix->class == UAC_RECORD) && (terminal_type == 0)) {
2520		return (SOUND_MIXER_IMIX);
2521	}
2522	while (uat->terminal_type) {
2523		if (uat->terminal_type == terminal_type) {
2524			break;
2525		}
2526		uat++;
2527	}
2528
2529	DPRINTF("terminal_type=%s (0x%04x) -> %d\n",
2530	    uaudio_mixer_get_terminal_name(terminal_type),
2531	    terminal_type, uat->feature);
2532
2533	return (uat->feature);
2534}
2535
2536const static struct uaudio_terminal_node *
2537uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t index)
2538{
2539	struct uaudio_terminal_node *root = iot->root;
2540	uint8_t n;
2541
2542	n = iot->usr.id_max;
2543	do {
2544		if (iot->usr.bit_input[n / 8] & (1 << (n % 8))) {
2545			if (!index--) {
2546				return (root + n);
2547			}
2548		}
2549	} while (n--);
2550
2551	return (NULL);
2552}
2553
2554const static struct uaudio_terminal_node *
2555uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t index)
2556{
2557	struct uaudio_terminal_node *root = iot->root;
2558	uint8_t n;
2559
2560	n = iot->usr.id_max;
2561	do {
2562		if (iot->usr.bit_output[n / 8] & (1 << (n % 8))) {
2563			if (!index--) {
2564				return (root + n);
2565			}
2566		}
2567	} while (n--);
2568
2569	return (NULL);
2570}
2571
2572static void
2573uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
2574    const uint8_t *p_id, uint8_t n_id,
2575    struct uaudio_search_result *info)
2576{
2577	struct uaudio_terminal_node *iot;
2578	uint8_t n;
2579	uint8_t i;
2580
2581	if (info->recurse_level >= UAUDIO_RECURSE_LIMIT) {
2582		return;
2583	}
2584	info->recurse_level++;
2585
2586	for (n = 0; n < n_id; n++) {
2587
2588		i = p_id[n];
2589
2590		if (info->bit_visited[i / 8] & (1 << (i % 8))) {
2591			/* don't go into a circle */
2592			DPRINTF("avoided going into a circle at id=%d!\n", i);
2593			continue;
2594		} else {
2595			info->bit_visited[i / 8] |= (1 << (i % 8));
2596		}
2597
2598		iot = (root + i);
2599
2600		if (iot->u.desc == NULL) {
2601			continue;
2602		}
2603		switch (iot->u.desc->bDescriptorSubtype) {
2604		case UDESCSUB_AC_INPUT:
2605			info->bit_input[i / 8] |= (1 << (i % 8));
2606			break;
2607
2608		case UDESCSUB_AC_FEATURE:
2609			uaudio_mixer_find_inputs_sub
2610			    (root, &iot->u.fu->bSourceId, 1, info);
2611			break;
2612
2613		case UDESCSUB_AC_OUTPUT:
2614			uaudio_mixer_find_inputs_sub
2615			    (root, &iot->u.ot->bSourceId, 1, info);
2616			break;
2617
2618		case UDESCSUB_AC_MIXER:
2619			uaudio_mixer_find_inputs_sub
2620			    (root, iot->u.mu->baSourceId,
2621			    iot->u.mu->bNrInPins, info);
2622			break;
2623
2624		case UDESCSUB_AC_SELECTOR:
2625			uaudio_mixer_find_inputs_sub
2626			    (root, iot->u.su->baSourceId,
2627			    iot->u.su->bNrInPins, info);
2628			break;
2629
2630		case UDESCSUB_AC_PROCESSING:
2631			uaudio_mixer_find_inputs_sub
2632			    (root, iot->u.pu->baSourceId,
2633			    iot->u.pu->bNrInPins, info);
2634			break;
2635
2636		case UDESCSUB_AC_EXTENSION:
2637			uaudio_mixer_find_inputs_sub
2638			    (root, iot->u.eu->baSourceId,
2639			    iot->u.eu->bNrInPins, info);
2640			break;
2641
2642		case UDESCSUB_AC_HEADER:
2643		default:
2644			break;
2645		}
2646	}
2647	info->recurse_level--;
2648}
2649
2650static void
2651uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id,
2652    uint8_t n_id, struct uaudio_search_result *info)
2653{
2654	struct uaudio_terminal_node *iot = (root + id);
2655	uint8_t j;
2656
2657	j = n_id;
2658	do {
2659		if ((j != id) && ((root + j)->u.desc) &&
2660		    ((root + j)->u.desc->bDescriptorSubtype == UDESCSUB_AC_OUTPUT)) {
2661
2662			/*
2663			 * "j" (output) <--- virtual wire <--- "id" (input)
2664			 *
2665			 * if "j" has "id" on the input, then "id" have "j" on
2666			 * the output, because they are connected:
2667			 */
2668			if ((root + j)->usr.bit_input[id / 8] & (1 << (id % 8))) {
2669				iot->usr.bit_output[j / 8] |= (1 << (j % 8));
2670			}
2671		}
2672	} while (j--);
2673}
2674
2675static void
2676uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb_device *udev,
2677    void *desc)
2678{
2679	const struct usb2_audio_control_descriptor *acdp;
2680	struct usb_config_descriptor *cd = usb2_get_config_descriptor(udev);
2681	const struct usb_descriptor *dp;
2682	const struct usb2_audio_unit *au;
2683	struct uaudio_terminal_node *iot = NULL;
2684	uint16_t wTotalLen;
2685	uint8_t ID_max = 0;		/* inclusive */
2686	uint8_t i;
2687
2688	desc = usb2_desc_foreach(cd, desc);
2689
2690	if (desc == NULL) {
2691		DPRINTF("no Audio Control header\n");
2692		goto done;
2693	}
2694	acdp = desc;
2695
2696	if ((acdp->bLength < sizeof(*acdp)) ||
2697	    (acdp->bDescriptorType != UDESC_CS_INTERFACE) ||
2698	    (acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER)) {
2699		DPRINTF("invalid Audio Control header\n");
2700		goto done;
2701	}
2702	/* "wTotalLen" is allowed to be corrupt */
2703	wTotalLen = UGETW(acdp->wTotalLength) - acdp->bLength;
2704
2705	/* get USB audio revision */
2706	sc->sc_audio_rev = UGETW(acdp->bcdADC);
2707
2708	DPRINTFN(3, "found AC header, vers=%03x, len=%d\n",
2709	    sc->sc_audio_rev, wTotalLen);
2710
2711	if (sc->sc_audio_rev != UAUDIO_VERSION) {
2712
2713		if (sc->sc_uq_bad_adc) {
2714
2715		} else {
2716			DPRINTF("invalid audio version\n");
2717			goto done;
2718		}
2719	}
2720	iot = malloc(sizeof(struct uaudio_terminal_node) * 256, M_TEMP,
2721	    M_WAITOK | M_ZERO);
2722
2723	if (iot == NULL) {
2724		DPRINTF("no memory!\n");
2725		goto done;
2726	}
2727	while ((desc = usb2_desc_foreach(cd, desc))) {
2728
2729		dp = desc;
2730
2731		if (dp->bLength > wTotalLen) {
2732			break;
2733		} else {
2734			wTotalLen -= dp->bLength;
2735		}
2736
2737		au = uaudio_mixer_verify_desc(dp, 0);
2738
2739		if (au) {
2740			iot[au->bUnitId].u.desc = (const void *)au;
2741			if (au->bUnitId > ID_max) {
2742				ID_max = au->bUnitId;
2743			}
2744		}
2745	}
2746
2747	DPRINTF("Maximum ID=%d\n", ID_max);
2748
2749	/*
2750	 * determine sourcing inputs for
2751	 * all nodes in the tree:
2752	 */
2753	i = ID_max;
2754	do {
2755		uaudio_mixer_find_inputs_sub(iot, &i, 1, &((iot + i)->usr));
2756	} while (i--);
2757
2758	/*
2759	 * determine outputs for
2760	 * all nodes in the tree:
2761	 */
2762	i = ID_max;
2763	do {
2764		uaudio_mixer_find_outputs_sub(iot, i, ID_max, &((iot + i)->usr));
2765	} while (i--);
2766
2767	/* set "id_max" and "root" */
2768
2769	i = ID_max;
2770	do {
2771		(iot + i)->usr.id_max = ID_max;
2772		(iot + i)->root = iot;
2773	} while (i--);
2774
2775#if USB_DEBUG
2776	i = ID_max;
2777	do {
2778		uint8_t j;
2779
2780		if (iot[i].u.desc == NULL) {
2781			continue;
2782		}
2783		DPRINTF("id %d:\n", i);
2784
2785		switch (iot[i].u.desc->bDescriptorSubtype) {
2786		case UDESCSUB_AC_INPUT:
2787			DPRINTF(" - AC_INPUT type=%s\n",
2788			    uaudio_mixer_get_terminal_name
2789			    (UGETW(iot[i].u.it->wTerminalType)));
2790			uaudio_mixer_dump_cluster(i, iot);
2791			break;
2792
2793		case UDESCSUB_AC_OUTPUT:
2794			DPRINTF(" - AC_OUTPUT type=%s "
2795			    "src=%d\n", uaudio_mixer_get_terminal_name
2796			    (UGETW(iot[i].u.ot->wTerminalType)),
2797			    iot[i].u.ot->bSourceId);
2798			break;
2799
2800		case UDESCSUB_AC_MIXER:
2801			DPRINTF(" - AC_MIXER src:\n");
2802			for (j = 0; j < iot[i].u.mu->bNrInPins; j++) {
2803				DPRINTF("   - %d\n", iot[i].u.mu->baSourceId[j]);
2804			}
2805			uaudio_mixer_dump_cluster(i, iot);
2806			break;
2807
2808		case UDESCSUB_AC_SELECTOR:
2809			DPRINTF(" - AC_SELECTOR src:\n");
2810			for (j = 0; j < iot[i].u.su->bNrInPins; j++) {
2811				DPRINTF("   - %d\n", iot[i].u.su->baSourceId[j]);
2812			}
2813			break;
2814
2815		case UDESCSUB_AC_FEATURE:
2816			DPRINTF(" - AC_FEATURE src=%d\n", iot[i].u.fu->bSourceId);
2817			break;
2818
2819		case UDESCSUB_AC_PROCESSING:
2820			DPRINTF(" - AC_PROCESSING src:\n");
2821			for (j = 0; j < iot[i].u.pu->bNrInPins; j++) {
2822				DPRINTF("   - %d\n", iot[i].u.pu->baSourceId[j]);
2823			}
2824			uaudio_mixer_dump_cluster(i, iot);
2825			break;
2826
2827		case UDESCSUB_AC_EXTENSION:
2828			DPRINTF(" - AC_EXTENSION src:\n");
2829			for (j = 0; j < iot[i].u.eu->bNrInPins; j++) {
2830				DPRINTF("%d ", iot[i].u.eu->baSourceId[j]);
2831			}
2832			uaudio_mixer_dump_cluster(i, iot);
2833			break;
2834
2835		default:
2836			DPRINTF("unknown audio control (subtype=%d)\n",
2837			    iot[i].u.desc->bDescriptorSubtype);
2838		}
2839
2840		DPRINTF("Inputs to this ID are:\n");
2841
2842		j = ID_max;
2843		do {
2844			if (iot[i].usr.bit_input[j / 8] & (1 << (j % 8))) {
2845				DPRINTF("  -- ID=%d\n", j);
2846			}
2847		} while (j--);
2848
2849		DPRINTF("Outputs from this ID are:\n");
2850
2851		j = ID_max;
2852		do {
2853			if (iot[i].usr.bit_output[j / 8] & (1 << (j % 8))) {
2854				DPRINTF("  -- ID=%d\n", j);
2855			}
2856		} while (j--);
2857
2858	} while (i--);
2859#endif
2860
2861	/*
2862	 * scan the config to create a linked
2863	 * list of "mixer" nodes:
2864	 */
2865
2866	i = ID_max;
2867	do {
2868		dp = iot[i].u.desc;
2869
2870		if (dp == NULL) {
2871			continue;
2872		}
2873		DPRINTFN(11, "id=%d subtype=%d\n",
2874		    i, dp->bDescriptorSubtype);
2875
2876		switch (dp->bDescriptorSubtype) {
2877		case UDESCSUB_AC_HEADER:
2878			DPRINTF("unexpected AC header\n");
2879			break;
2880
2881		case UDESCSUB_AC_INPUT:
2882			uaudio_mixer_add_input(sc, iot, i);
2883			break;
2884
2885		case UDESCSUB_AC_OUTPUT:
2886			uaudio_mixer_add_output(sc, iot, i);
2887			break;
2888
2889		case UDESCSUB_AC_MIXER:
2890			uaudio_mixer_add_mixer(sc, iot, i);
2891			break;
2892
2893		case UDESCSUB_AC_SELECTOR:
2894			uaudio_mixer_add_selector(sc, iot, i);
2895			break;
2896
2897		case UDESCSUB_AC_FEATURE:
2898			uaudio_mixer_add_feature(sc, iot, i);
2899			break;
2900
2901		case UDESCSUB_AC_PROCESSING:
2902			uaudio_mixer_add_processing(sc, iot, i);
2903			break;
2904
2905		case UDESCSUB_AC_EXTENSION:
2906			uaudio_mixer_add_extension(sc, iot, i);
2907			break;
2908
2909		default:
2910			DPRINTF("bad AC desc subtype=0x%02x\n",
2911			    dp->bDescriptorSubtype);
2912			break;
2913		}
2914
2915	} while (i--);
2916
2917done:
2918	if (iot) {
2919		free(iot, M_TEMP);
2920	}
2921}
2922
2923static uint16_t
2924uaudio_mixer_get(struct usb_device *udev, uint8_t what,
2925    struct uaudio_mixer_node *mc)
2926{
2927	struct usb_device_request req;
2928	uint16_t val;
2929	uint16_t len = MIX_SIZE(mc->type);
2930	uint8_t data[4];
2931	usb_error_t err;
2932
2933	if (mc->wValue[0] == -1) {
2934		return (0);
2935	}
2936	req.bmRequestType = UT_READ_CLASS_INTERFACE;
2937	req.bRequest = what;
2938	USETW(req.wValue, mc->wValue[0]);
2939	USETW(req.wIndex, mc->wIndex);
2940	USETW(req.wLength, len);
2941
2942	err = usb2_do_request(udev, &Giant, &req, data);
2943	if (err) {
2944		DPRINTF("err=%s\n", usb2_errstr(err));
2945		return (0);
2946	}
2947	if (len < 1) {
2948		data[0] = 0;
2949	}
2950	if (len < 2) {
2951		data[1] = 0;
2952	}
2953	val = (data[0] | (data[1] << 8));
2954
2955	DPRINTFN(3, "val=%d\n", val);
2956
2957	return (val);
2958}
2959
2960static void
2961uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer)
2962{
2963	struct usb_device_request req;
2964	struct uaudio_softc *sc = xfer->priv_sc;
2965	struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
2966	uint16_t len;
2967	uint8_t repeat = 1;
2968	uint8_t update;
2969	uint8_t chan;
2970	uint8_t buf[2];
2971
2972	DPRINTF("\n");
2973
2974	switch (USB_GET_STATE(xfer)) {
2975	case USB_ST_TRANSFERRED:
2976tr_transferred:
2977	case USB_ST_SETUP:
2978tr_setup:
2979
2980		if (mc == NULL) {
2981			mc = sc->sc_mixer_root;
2982			sc->sc_mixer_curr = mc;
2983			sc->sc_mixer_chan = 0;
2984			repeat = 0;
2985		}
2986		while (mc) {
2987			while (sc->sc_mixer_chan < mc->nchan) {
2988
2989				len = MIX_SIZE(mc->type);
2990
2991				chan = sc->sc_mixer_chan;
2992
2993				sc->sc_mixer_chan++;
2994
2995				update = ((mc->update[chan / 8] & (1 << (chan % 8))) &&
2996				    (mc->wValue[chan] != -1));
2997
2998				mc->update[chan / 8] &= ~(1 << (chan % 8));
2999
3000				if (update) {
3001
3002					req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
3003					req.bRequest = SET_CUR;
3004					USETW(req.wValue, mc->wValue[chan]);
3005					USETW(req.wIndex, mc->wIndex);
3006					USETW(req.wLength, len);
3007
3008					if (len > 0) {
3009						buf[0] = (mc->wData[chan] & 0xFF);
3010					}
3011					if (len > 1) {
3012						buf[1] = (mc->wData[chan] >> 8) & 0xFF;
3013					}
3014					usb2_copy_in(xfer->frbuffers, 0, &req, sizeof(req));
3015					usb2_copy_in(xfer->frbuffers + 1, 0, buf, len);
3016
3017					xfer->frlengths[0] = sizeof(req);
3018					xfer->frlengths[1] = len;
3019					xfer->nframes = xfer->frlengths[1] ? 2 : 1;
3020					usb2_start_hardware(xfer);
3021					return;
3022				}
3023			}
3024
3025			mc = mc->next;
3026			sc->sc_mixer_curr = mc;
3027			sc->sc_mixer_chan = 0;
3028		}
3029
3030		if (repeat) {
3031			goto tr_setup;
3032		}
3033		break;
3034
3035	default:			/* Error */
3036		DPRINTF("error=%s\n", usb2_errstr(xfer->error));
3037		if (xfer->error == USB_ERR_CANCELLED) {
3038			/* do nothing - we are detaching */
3039			break;
3040		}
3041		goto tr_transferred;
3042	}
3043}
3044
3045static usb_error_t
3046uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed)
3047{
3048	struct usb_device_request req;
3049	uint8_t data[3];
3050
3051	DPRINTFN(6, "endpt=%d speed=%u\n", endpt, speed);
3052
3053	req.bmRequestType = UT_WRITE_CLASS_ENDPOINT;
3054	req.bRequest = SET_CUR;
3055	USETW2(req.wValue, SAMPLING_FREQ_CONTROL, 0);
3056	USETW(req.wIndex, endpt);
3057	USETW(req.wLength, 3);
3058	data[0] = speed;
3059	data[1] = speed >> 8;
3060	data[2] = speed >> 16;
3061
3062	return (usb2_do_request(udev, &Giant, &req, data));
3063}
3064
3065static int
3066uaudio_mixer_signext(uint8_t type, int val)
3067{
3068	if (!MIX_UNSIGNED(type)) {
3069		if (MIX_SIZE(type) == 2) {
3070			val = (int16_t)val;
3071		} else {
3072			val = (int8_t)val;
3073		}
3074	}
3075	return (val);
3076}
3077
3078static int
3079uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val)
3080{
3081	if (mc->type == MIX_ON_OFF) {
3082		val = (val != 0);
3083	} else if (mc->type == MIX_SELECTOR) {
3084		if ((val < mc->minval) ||
3085		    (val > mc->maxval)) {
3086			val = mc->minval;
3087		}
3088	} else {
3089		val = (((val + (mc->delta / 2)) * mc->mul) / 255) + mc->minval;
3090	}
3091
3092	DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n",
3093	    mc->type, val, mc->minval, mc->maxval, val);
3094	return (val);
3095}
3096
3097static void
3098uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
3099    uint8_t chan, int32_t val)
3100{
3101	val = uaudio_mixer_bsd2value(mc, val);
3102
3103	mc->update[chan / 8] |= (1 << (chan % 8));
3104	mc->wData[chan] = val;
3105
3106	/* start the transfer, if not already started */
3107
3108	usb2_transfer_start(sc->sc_mixer_xfer[0]);
3109}
3110
3111static void
3112uaudio_mixer_init(struct uaudio_softc *sc)
3113{
3114	struct uaudio_mixer_node *mc;
3115	int32_t i;
3116
3117	for (mc = sc->sc_mixer_root; mc;
3118	    mc = mc->next) {
3119
3120		if (mc->ctl != SOUND_MIXER_NRDEVICES) {
3121			/*
3122			 * Set device mask bits. See
3123			 * /usr/include/machine/soundcard.h
3124			 */
3125			sc->sc_mix_info |= (1 << mc->ctl);
3126		}
3127		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
3128		    (mc->type == MIX_SELECTOR)) {
3129
3130			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3131				if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES) {
3132					continue;
3133				}
3134				sc->sc_recsrc_info |= 1 << mc->slctrtype[i - 1];
3135			}
3136		}
3137	}
3138}
3139
3140int
3141uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
3142{
3143	DPRINTF("\n");
3144
3145	if (usb2_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index,
3146	    sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc,
3147	    mixer_get_lock(m))) {
3148		DPRINTFN(0, "could not allocate USB "
3149		    "transfer for audio mixer!\n");
3150		return (ENOMEM);
3151	}
3152	if (!(sc->sc_mix_info & SOUND_MASK_VOLUME)) {
3153		mix_setparentchild(m, SOUND_MIXER_VOLUME, SOUND_MASK_PCM);
3154		mix_setrealdev(m, SOUND_MIXER_VOLUME, SOUND_MIXER_NONE);
3155	}
3156	mix_setdevs(m, sc->sc_mix_info);
3157	mix_setrecdevs(m, sc->sc_recsrc_info);
3158	return (0);
3159}
3160
3161int
3162uaudio_mixer_uninit_sub(struct uaudio_softc *sc)
3163{
3164	DPRINTF("\n");
3165
3166	usb2_transfer_unsetup(sc->sc_mixer_xfer, 1);
3167
3168	return (0);
3169}
3170
3171void
3172uaudio_mixer_set(struct uaudio_softc *sc, unsigned type,
3173    unsigned left, unsigned right)
3174{
3175	struct uaudio_mixer_node *mc;
3176
3177	for (mc = sc->sc_mixer_root; mc;
3178	    mc = mc->next) {
3179
3180		if (mc->ctl == type) {
3181			if (mc->nchan == 2) {
3182				/* set Right */
3183				uaudio_mixer_ctl_set(sc, mc, 1, (int)(right * 255) / 100);
3184			}
3185			/* set Left or Mono */
3186			uaudio_mixer_ctl_set(sc, mc, 0, (int)(left * 255) / 100);
3187		}
3188	}
3189}
3190
3191uint32_t
3192uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src)
3193{
3194	struct uaudio_mixer_node *mc;
3195	uint32_t mask;
3196	uint32_t temp;
3197	int32_t i;
3198
3199	for (mc = sc->sc_mixer_root; mc;
3200	    mc = mc->next) {
3201
3202		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
3203		    (mc->type == MIX_SELECTOR)) {
3204
3205			/* compute selector mask */
3206
3207			mask = 0;
3208			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3209				mask |= (1 << mc->slctrtype[i - 1]);
3210			}
3211
3212			temp = mask & src;
3213			if (temp == 0) {
3214				continue;
3215			}
3216			/* find the first set bit */
3217			temp = (-temp) & temp;
3218
3219			/* update "src" */
3220			src &= ~mask;
3221			src |= temp;
3222
3223			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
3224				if (temp != (1 << mc->slctrtype[i - 1])) {
3225					continue;
3226				}
3227				uaudio_mixer_ctl_set(sc, mc, 0, i);
3228				break;
3229			}
3230		}
3231	}
3232	return (src);
3233}
3234
3235/*========================================================================*
3236 * MIDI support routines
3237 *========================================================================*/
3238
3239static void
3240umidi_read_clear_stall_callback(struct usb_xfer *xfer)
3241{
3242	struct umidi_chan *chan = xfer->priv_sc;
3243	struct usb_xfer *xfer_other = chan->xfer[1];
3244
3245	if (usb2_clear_stall_callback(xfer, xfer_other)) {
3246		DPRINTF("stall cleared\n");
3247		chan->flags &= ~UMIDI_FLAG_READ_STALL;
3248		usb2_transfer_start(xfer_other);
3249	}
3250}
3251
3252static void
3253umidi_bulk_read_callback(struct usb_xfer *xfer)
3254{
3255	struct umidi_chan *chan = xfer->priv_sc;
3256	struct umidi_sub_chan *sub;
3257	uint8_t buf[1];
3258	uint8_t cmd_len;
3259	uint8_t cn;
3260	uint16_t pos;
3261
3262	switch (USB_GET_STATE(xfer)) {
3263	case USB_ST_TRANSFERRED:
3264
3265		DPRINTF("actlen=%d bytes\n", xfer->actlen);
3266
3267		if (xfer->actlen == 0) {
3268			/* should not happen */
3269			goto tr_error;
3270		}
3271		pos = 0;
3272
3273		while (xfer->actlen >= 4) {
3274
3275			usb2_copy_out(xfer->frbuffers, pos, buf, 1);
3276
3277			cmd_len = umidi_cmd_to_len[buf[0] & 0xF];	/* command length */
3278			cn = buf[0] >> 4;	/* cable number */
3279			sub = &chan->sub[cn];
3280
3281			if (cmd_len && (cn < chan->max_cable) && sub->read_open) {
3282				usb2_fifo_put_data(sub->fifo.fp[USB_FIFO_RX], xfer->frbuffers,
3283				    pos + 1, cmd_len, 1);
3284			} else {
3285				/* ignore the command */
3286			}
3287
3288			xfer->actlen -= 4;
3289			pos += 4;
3290		}
3291
3292	case USB_ST_SETUP:
3293		DPRINTF("start\n");
3294
3295		if (chan->flags & UMIDI_FLAG_READ_STALL) {
3296			usb2_transfer_start(chan->xfer[3]);
3297			return;
3298		}
3299		xfer->frlengths[0] = xfer->max_data_length;
3300		usb2_start_hardware(xfer);
3301		return;
3302
3303	default:
3304tr_error:
3305
3306		DPRINTF("error=%s\n", usb2_errstr(xfer->error));
3307
3308		if (xfer->error != USB_ERR_CANCELLED) {
3309			/* try to clear stall first */
3310			chan->flags |= UMIDI_FLAG_READ_STALL;
3311			usb2_transfer_start(chan->xfer[3]);
3312		}
3313		return;
3314
3315	}
3316}
3317
3318static void
3319umidi_write_clear_stall_callback(struct usb_xfer *xfer)
3320{
3321	struct umidi_chan *chan = xfer->priv_sc;
3322	struct usb_xfer *xfer_other = chan->xfer[0];
3323
3324	if (usb2_clear_stall_callback(xfer, xfer_other)) {
3325		DPRINTF("stall cleared\n");
3326		chan->flags &= ~UMIDI_FLAG_WRITE_STALL;
3327		usb2_transfer_start(xfer_other);
3328	}
3329}
3330
3331/*
3332 * The following statemachine, that converts MIDI commands to
3333 * USB MIDI packets, derives from Linux's usbmidi.c, which
3334 * was written by "Clemens Ladisch":
3335 *
3336 * Returns:
3337 *    0: No command
3338 * Else: Command is complete
3339 */
3340static uint8_t
3341umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b)
3342{
3343	uint8_t p0 = (cn << 4);
3344
3345	if (b >= 0xf8) {
3346		sub->temp_0[0] = p0 | 0x0f;
3347		sub->temp_0[1] = b;
3348		sub->temp_0[2] = 0;
3349		sub->temp_0[3] = 0;
3350		sub->temp_cmd = sub->temp_0;
3351		return (1);
3352
3353	} else if (b >= 0xf0) {
3354		switch (b) {
3355		case 0xf0:		/* system exclusive begin */
3356			sub->temp_1[1] = b;
3357			sub->state = UMIDI_ST_SYSEX_1;
3358			break;
3359		case 0xf1:		/* MIDI time code */
3360		case 0xf3:		/* song select */
3361			sub->temp_1[1] = b;
3362			sub->state = UMIDI_ST_1PARAM;
3363			break;
3364		case 0xf2:		/* song position pointer */
3365			sub->temp_1[1] = b;
3366			sub->state = UMIDI_ST_2PARAM_1;
3367			break;
3368		case 0xf4:		/* unknown */
3369		case 0xf5:		/* unknown */
3370			sub->state = UMIDI_ST_UNKNOWN;
3371			break;
3372		case 0xf6:		/* tune request */
3373			sub->temp_1[0] = p0 | 0x05;
3374			sub->temp_1[1] = 0xf6;
3375			sub->temp_1[2] = 0;
3376			sub->temp_1[3] = 0;
3377			sub->temp_cmd = sub->temp_1;
3378			sub->state = UMIDI_ST_UNKNOWN;
3379			return (1);
3380
3381		case 0xf7:		/* system exclusive end */
3382			switch (sub->state) {
3383			case UMIDI_ST_SYSEX_0:
3384				sub->temp_1[0] = p0 | 0x05;
3385				sub->temp_1[1] = 0xf7;
3386				sub->temp_1[2] = 0;
3387				sub->temp_1[3] = 0;
3388				sub->temp_cmd = sub->temp_1;
3389				sub->state = UMIDI_ST_UNKNOWN;
3390				return (1);
3391			case UMIDI_ST_SYSEX_1:
3392				sub->temp_1[0] = p0 | 0x06;
3393				sub->temp_1[2] = 0xf7;
3394				sub->temp_1[3] = 0;
3395				sub->temp_cmd = sub->temp_1;
3396				sub->state = UMIDI_ST_UNKNOWN;
3397				return (1);
3398			case UMIDI_ST_SYSEX_2:
3399				sub->temp_1[0] = p0 | 0x07;
3400				sub->temp_1[3] = 0xf7;
3401				sub->temp_cmd = sub->temp_1;
3402				sub->state = UMIDI_ST_UNKNOWN;
3403				return (1);
3404			}
3405			sub->state = UMIDI_ST_UNKNOWN;
3406			break;
3407		}
3408	} else if (b >= 0x80) {
3409		sub->temp_1[1] = b;
3410		if ((b >= 0xc0) && (b <= 0xdf)) {
3411			sub->state = UMIDI_ST_1PARAM;
3412		} else {
3413			sub->state = UMIDI_ST_2PARAM_1;
3414		}
3415	} else {			/* b < 0x80 */
3416		switch (sub->state) {
3417		case UMIDI_ST_1PARAM:
3418			if (sub->temp_1[1] < 0xf0) {
3419				p0 |= sub->temp_1[1] >> 4;
3420			} else {
3421				p0 |= 0x02;
3422				sub->state = UMIDI_ST_UNKNOWN;
3423			}
3424			sub->temp_1[0] = p0;
3425			sub->temp_1[2] = b;
3426			sub->temp_1[3] = 0;
3427			sub->temp_cmd = sub->temp_1;
3428			return (1);
3429		case UMIDI_ST_2PARAM_1:
3430			sub->temp_1[2] = b;
3431			sub->state = UMIDI_ST_2PARAM_2;
3432			break;
3433		case UMIDI_ST_2PARAM_2:
3434			if (sub->temp_1[1] < 0xf0) {
3435				p0 |= sub->temp_1[1] >> 4;
3436				sub->state = UMIDI_ST_2PARAM_1;
3437			} else {
3438				p0 |= 0x03;
3439				sub->state = UMIDI_ST_UNKNOWN;
3440			}
3441			sub->temp_1[0] = p0;
3442			sub->temp_1[3] = b;
3443			sub->temp_cmd = sub->temp_1;
3444			return (1);
3445		case UMIDI_ST_SYSEX_0:
3446			sub->temp_1[1] = b;
3447			sub->state = UMIDI_ST_SYSEX_1;
3448			break;
3449		case UMIDI_ST_SYSEX_1:
3450			sub->temp_1[2] = b;
3451			sub->state = UMIDI_ST_SYSEX_2;
3452			break;
3453		case UMIDI_ST_SYSEX_2:
3454			sub->temp_1[0] = p0 | 0x04;
3455			sub->temp_1[3] = b;
3456			sub->temp_cmd = sub->temp_1;
3457			sub->state = UMIDI_ST_SYSEX_0;
3458			return (1);
3459		}
3460	}
3461	return (0);
3462}
3463
3464static void
3465umidi_bulk_write_callback(struct usb_xfer *xfer)
3466{
3467	struct umidi_chan *chan = xfer->priv_sc;
3468	struct umidi_sub_chan *sub;
3469	uint32_t actlen;
3470	uint16_t total_length;
3471	uint8_t buf;
3472	uint8_t start_cable;
3473	uint8_t tr_any;
3474
3475	switch (USB_GET_STATE(xfer)) {
3476	case USB_ST_TRANSFERRED:
3477		DPRINTF("actlen=%d bytes\n", xfer->actlen);
3478
3479	case USB_ST_SETUP:
3480
3481		DPRINTF("start\n");
3482
3483		if (chan->flags & UMIDI_FLAG_WRITE_STALL) {
3484			usb2_transfer_start(chan->xfer[2]);
3485			return;
3486		}
3487		total_length = 0;	/* reset */
3488
3489		start_cable = chan->curr_cable;
3490
3491		tr_any = 0;
3492
3493		while (1) {
3494
3495			/* round robin de-queueing */
3496
3497			sub = &chan->sub[chan->curr_cable];
3498
3499			if (sub->write_open) {
3500				usb2_fifo_get_data(sub->fifo.fp[USB_FIFO_TX],
3501				    xfer->frbuffers, total_length,
3502				    1, &actlen, 0);
3503			} else {
3504				actlen = 0;
3505			}
3506
3507			if (actlen) {
3508				usb2_copy_out(xfer->frbuffers, total_length, &buf, 1);
3509
3510				tr_any = 1;
3511
3512				DPRINTF("byte=0x%02x\n", buf);
3513
3514				if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
3515
3516					DPRINTF("sub= %02x %02x %02x %02x\n",
3517					    sub->temp_cmd[0], sub->temp_cmd[1],
3518					    sub->temp_cmd[2], sub->temp_cmd[3]);
3519
3520					usb2_copy_in(xfer->frbuffers, total_length,
3521					    sub->temp_cmd, 4);
3522
3523					total_length += 4;
3524
3525					if (total_length >= UMIDI_BULK_SIZE) {
3526						break;
3527					}
3528				} else {
3529					continue;
3530				}
3531			}
3532			chan->curr_cable++;
3533			if (chan->curr_cable >= chan->max_cable) {
3534				chan->curr_cable = 0;
3535			}
3536			if (chan->curr_cable == start_cable) {
3537				if (tr_any == 0) {
3538					break;
3539				}
3540				tr_any = 0;
3541			}
3542		}
3543
3544		if (total_length) {
3545			xfer->frlengths[0] = total_length;
3546			usb2_start_hardware(xfer);
3547		}
3548		return;
3549
3550	default:			/* Error */
3551
3552		DPRINTF("error=%s\n", usb2_errstr(xfer->error));
3553
3554		if (xfer->error != USB_ERR_CANCELLED) {
3555			/* try to clear stall first */
3556			chan->flags |= UMIDI_FLAG_WRITE_STALL;
3557			usb2_transfer_start(chan->xfer[2]);
3558		}
3559		return;
3560
3561	}
3562}
3563
3564static struct umidi_sub_chan *
3565umidi_sub_by_fifo(struct usb_fifo *fifo)
3566{
3567	struct umidi_chan *chan = fifo->priv_sc0;
3568	struct umidi_sub_chan *sub;
3569	uint32_t n;
3570
3571	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
3572		sub = &chan->sub[n];
3573		if ((sub->fifo.fp[USB_FIFO_RX] == fifo) ||
3574		    (sub->fifo.fp[USB_FIFO_TX] == fifo)) {
3575			return (sub);
3576		}
3577	}
3578
3579	panic("%s:%d cannot find usb_fifo!\n",
3580	    __FILE__, __LINE__);
3581
3582	return (NULL);
3583}
3584
3585static void
3586umidi_start_read(struct usb_fifo *fifo)
3587{
3588	struct umidi_chan *chan = fifo->priv_sc0;
3589
3590	usb2_transfer_start(chan->xfer[1]);
3591}
3592
3593static void
3594umidi_stop_read(struct usb_fifo *fifo)
3595{
3596	struct umidi_chan *chan = fifo->priv_sc0;
3597	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3598
3599	DPRINTF("\n");
3600
3601	sub->read_open = 0;
3602
3603	if (--(chan->read_open_refcount) == 0) {
3604		/*
3605		 * XXX don't stop the read transfer here, hence that causes
3606		 * problems with some MIDI adapters
3607		 */
3608		DPRINTF("(stopping read transfer)\n");
3609	}
3610}
3611
3612static void
3613umidi_start_write(struct usb_fifo *fifo)
3614{
3615	struct umidi_chan *chan = fifo->priv_sc0;
3616
3617	usb2_transfer_start(chan->xfer[0]);
3618}
3619
3620static void
3621umidi_stop_write(struct usb_fifo *fifo)
3622{
3623	struct umidi_chan *chan = fifo->priv_sc0;
3624	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3625
3626	DPRINTF("\n");
3627
3628	sub->write_open = 0;
3629
3630	if (--(chan->write_open_refcount) == 0) {
3631		DPRINTF("(stopping write transfer)\n");
3632		usb2_transfer_stop(chan->xfer[2]);
3633		usb2_transfer_stop(chan->xfer[0]);
3634	}
3635}
3636
3637static int
3638umidi_open(struct usb_fifo *fifo, int fflags)
3639{
3640	struct umidi_chan *chan = fifo->priv_sc0;
3641	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
3642
3643	if (fflags & FREAD) {
3644		if (usb2_fifo_alloc_buffer(fifo, 4, (1024 / 4))) {
3645			return (ENOMEM);
3646		}
3647		mtx_lock(fifo->priv_mtx);
3648		chan->read_open_refcount++;
3649		sub->read_open = 1;
3650		mtx_unlock(fifo->priv_mtx);
3651	}
3652	if (fflags & FWRITE) {
3653		if (usb2_fifo_alloc_buffer(fifo, 32, (1024 / 32))) {
3654			return (ENOMEM);
3655		}
3656		/* clear stall first */
3657		mtx_lock(fifo->priv_mtx);
3658		chan->flags |= UMIDI_FLAG_WRITE_STALL;
3659		chan->write_open_refcount++;
3660		sub->write_open = 1;
3661
3662		/* reset */
3663		sub->state = UMIDI_ST_UNKNOWN;
3664		mtx_unlock(fifo->priv_mtx);
3665	}
3666	return (0);			/* success */
3667}
3668
3669static void
3670umidi_close(struct usb_fifo *fifo, int fflags)
3671{
3672	if (fflags & FREAD) {
3673		usb2_fifo_free_buffer(fifo);
3674	}
3675	if (fflags & FWRITE) {
3676		usb2_fifo_free_buffer(fifo);
3677	}
3678}
3679
3680
3681static int
3682umidi_ioctl(struct usb_fifo *fifo, u_long cmd, void *data,
3683    int fflags)
3684{
3685	return (ENODEV);
3686}
3687
3688static void
3689umidi_init(device_t dev)
3690{
3691	struct uaudio_softc *sc = device_get_softc(dev);
3692	struct umidi_chan *chan = &sc->sc_midi_chan;
3693
3694	mtx_init(&chan->mtx, "umidi lock", NULL, MTX_DEF | MTX_RECURSE);
3695}
3696
3697static struct usb_fifo_methods umidi_fifo_methods = {
3698	.f_start_read = &umidi_start_read,
3699	.f_start_write = &umidi_start_write,
3700	.f_stop_read = &umidi_stop_read,
3701	.f_stop_write = &umidi_stop_write,
3702	.f_open = &umidi_open,
3703	.f_close = &umidi_close,
3704	.f_ioctl = &umidi_ioctl,
3705	.basename[0] = "umidi",
3706};
3707
3708static int32_t
3709umidi_probe(device_t dev)
3710{
3711	struct uaudio_softc *sc = device_get_softc(dev);
3712	struct usb_attach_arg *uaa = device_get_ivars(dev);
3713	struct umidi_chan *chan = &sc->sc_midi_chan;
3714	struct umidi_sub_chan *sub;
3715	int unit = device_get_unit(dev);
3716	int error;
3717	uint32_t n;
3718
3719	if (usb2_set_alt_interface_index(sc->sc_udev, chan->iface_index,
3720	    chan->iface_alt_index)) {
3721		DPRINTF("setting of alternate index failed!\n");
3722		goto detach;
3723	}
3724	usb2_set_parent_iface(sc->sc_udev, chan->iface_index, sc->sc_mixer_iface_index);
3725
3726	error = usb2_transfer_setup(uaa->device, &chan->iface_index,
3727	    chan->xfer, umidi_config, UMIDI_N_TRANSFER,
3728	    chan, &chan->mtx);
3729	if (error) {
3730		DPRINTF("error=%s\n", usb2_errstr(error));
3731		goto detach;
3732	}
3733	if ((chan->max_cable > UMIDI_CABLES_MAX) ||
3734	    (chan->max_cable == 0)) {
3735		chan->max_cable = UMIDI_CABLES_MAX;
3736	}
3737
3738	for (n = 0; n < chan->max_cable; n++) {
3739
3740		sub = &chan->sub[n];
3741
3742		error = usb2_fifo_attach(sc->sc_udev, chan, &chan->mtx,
3743		    &umidi_fifo_methods, &sub->fifo, unit, n,
3744		    chan->iface_index,
3745		    UID_ROOT, GID_OPERATOR, 0644);
3746		if (error) {
3747			goto detach;
3748		}
3749	}
3750
3751	mtx_lock(&chan->mtx);
3752
3753	/* clear stall first */
3754	chan->flags |= UMIDI_FLAG_READ_STALL;
3755
3756	/*
3757	 * NOTE: at least one device will not work properly unless
3758	 * the BULK pipe is open all the time.
3759	 */
3760	usb2_transfer_start(chan->xfer[1]);
3761
3762	mtx_unlock(&chan->mtx);
3763
3764	return (0);			/* success */
3765
3766detach:
3767	return (ENXIO);			/* failure */
3768}
3769
3770static int32_t
3771umidi_detach(device_t dev)
3772{
3773	struct uaudio_softc *sc = device_get_softc(dev);
3774	struct umidi_chan *chan = &sc->sc_midi_chan;
3775	uint32_t n;
3776
3777	for (n = 0; n < UMIDI_CABLES_MAX; n++) {
3778		usb2_fifo_detach(&chan->sub[n].fifo);
3779	}
3780
3781	mtx_lock(&chan->mtx);
3782
3783	usb2_transfer_stop(chan->xfer[3]);
3784	usb2_transfer_stop(chan->xfer[1]);
3785
3786	mtx_unlock(&chan->mtx);
3787
3788	usb2_transfer_unsetup(chan->xfer, UMIDI_N_TRANSFER);
3789
3790	mtx_destroy(&chan->mtx);
3791
3792	return (0);
3793}
3794
3795DRIVER_MODULE(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0);
3796MODULE_DEPEND(uaudio, usb, 1, 1, 1);
3797MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
3798MODULE_VERSION(uaudio, 1);
3799