1/*	$NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $	*/
2/*	$FreeBSD$ */
3
4/*-
5 * SPDX-License-Identifier: BSD-2-Clause-NetBSD
6 *
7 * Copyright (c) 1999 The NetBSD Foundation, Inc.
8 * All rights reserved.
9 *
10 * This code is derived from software contributed to The NetBSD Foundation
11 * by Lennart Augustsson (lennart@augustsson.net) at
12 * Carlstedt Research & Technology.
13 *
14 * Redistribution and use in source and binary forms, with or without
15 * modification, are permitted provided that the following conditions
16 * are met:
17 * 1. Redistributions of source code must retain the above copyright
18 *    notice, this list of conditions and the following disclaimer.
19 * 2. Redistributions in binary form must reproduce the above copyright
20 *    notice, this list of conditions and the following disclaimer in the
21 *    documentation and/or other materials provided with the distribution.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
24 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
25 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
26 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
27 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
33 * POSSIBILITY OF SUCH DAMAGE.
34 */
35
36#include <sys/cdefs.h>
37__FBSDID("$FreeBSD$");
38
39/*
40 * USB audio specs: http://www.usb.org/developers/devclass_docs/audio10.pdf
41 *                  http://www.usb.org/developers/devclass_docs/frmts10.pdf
42 *                  http://www.usb.org/developers/devclass_docs/termt10.pdf
43 */
44
45/*
46 * Also merged:
47 *  $NetBSD: uaudio.c,v 1.94 2005/01/15 15:19:53 kent Exp $
48 *  $NetBSD: uaudio.c,v 1.95 2005/01/16 06:02:19 dsainty Exp $
49 *  $NetBSD: uaudio.c,v 1.96 2005/01/16 12:46:00 kent Exp $
50 *  $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $
51 */
52
53#include <sys/stdint.h>
54#include <sys/stddef.h>
55#include <sys/param.h>
56#include <sys/queue.h>
57#include <sys/types.h>
58#include <sys/systm.h>
59#include <sys/kernel.h>
60#include <sys/bus.h>
61#include <sys/module.h>
62#include <sys/lock.h>
63#include <sys/mutex.h>
64#include <sys/condvar.h>
65#include <sys/sysctl.h>
66#include <sys/sx.h>
67#include <sys/unistd.h>
68#include <sys/callout.h>
69#include <sys/malloc.h>
70#include <sys/priv.h>
71
72#include "usbdevs.h"
73#include <dev/usb/usb.h>
74#include <dev/usb/usbdi.h>
75#include <dev/usb/usbdi_util.h>
76#include <dev/usb/usbhid.h>
77#include <dev/usb/usb_request.h>
78#include <dev/usb/usb_process.h>
79
80#define	USB_DEBUG_VAR uaudio_debug
81#include <dev/usb/usb_debug.h>
82
83#include <dev/usb/quirk/usb_quirk.h>
84
85#include <sys/reboot.h>			/* for bootverbose */
86
87#ifdef HAVE_KERNEL_OPTION_HEADERS
88#include "opt_snd.h"
89#endif
90
91#include <dev/sound/pcm/sound.h>
92#include <dev/sound/usb/uaudioreg.h>
93#include <dev/sound/usb/uaudio.h>
94#include <dev/sound/chip.h>
95#include "feeder_if.h"
96
97static int uaudio_default_rate = 0;		/* use rate list */
98static int uaudio_default_bits = 32;
99static int uaudio_default_channels = 0;		/* use default */
100static int uaudio_buffer_ms = 8;
101static bool uaudio_handle_hid = true;
102
103static SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio");
104SYSCTL_BOOL(_hw_usb_uaudio, OID_AUTO, handle_hid, CTLFLAG_RWTUN,
105    &uaudio_handle_hid, 0, "uaudio handles any HID volume/mute keys, if set");
106SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RWTUN,
107    &uaudio_default_rate, 0, "uaudio default sample rate");
108SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RWTUN,
109    &uaudio_default_bits, 0, "uaudio default sample bits");
110SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RWTUN,
111    &uaudio_default_channels, 0, "uaudio default sample channels");
112
113static int
114uaudio_buffer_ms_sysctl(SYSCTL_HANDLER_ARGS)
115{
116	int err, val;
117
118	val = uaudio_buffer_ms;
119	err = sysctl_handle_int(oidp, &val, 0, req);
120
121	if (err != 0 || req->newptr == NULL || val == uaudio_buffer_ms)
122		return (err);
123
124	if (val > 8)
125		val = 8;
126	else if (val < 2)
127		val = 2;
128
129	uaudio_buffer_ms = val;
130
131	return (0);
132}
133SYSCTL_PROC(_hw_usb_uaudio, OID_AUTO, buffer_ms, CTLTYPE_INT | CTLFLAG_RWTUN,
134    0, sizeof(int), uaudio_buffer_ms_sysctl, "I",
135    "uaudio buffering delay from 2ms to 8ms");
136
137#ifdef USB_DEBUG
138static int uaudio_debug;
139
140SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RWTUN,
141    &uaudio_debug, 0, "uaudio debug level");
142#else
143#define	uaudio_debug 0
144#endif
145
146#define	UAUDIO_NFRAMES		64	/* must be factor of 8 due HS-USB */
147#define	UAUDIO_NCHANBUFS	2	/* number of outstanding request */
148#define	UAUDIO_RECURSE_LIMIT	255	/* rounds */
149#define	UAUDIO_CHANNELS_MAX	MIN(64, AFMT_CHANNEL_MAX)
150#define	UAUDIO_MATRIX_MAX	8	/* channels */
151
152#define	MAKE_WORD(h,l) (((h) << 8) | (l))
153#define	BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1)
154#define	UAUDIO_MAX_CHAN(x) (x)
155#define	MIX(sc) ((sc)->sc_mixer_node)
156
157union uaudio_asid {
158	const struct usb_audio_streaming_interface_descriptor *v1;
159	const struct usb_audio20_streaming_interface_descriptor *v2;
160};
161
162union uaudio_asf1d {
163	const struct usb_audio_streaming_type1_descriptor *v1;
164	const struct usb_audio20_streaming_type1_descriptor *v2;
165};
166
167union uaudio_sed {
168	const struct usb_audio_streaming_endpoint_descriptor *v1;
169	const struct usb_audio20_streaming_endpoint_descriptor *v2;
170};
171
172struct uaudio_mixer_node {
173	const char *name;
174
175	int32_t	minval;
176	int32_t	maxval;
177#define	MIX_MAX_CHAN 16
178	int32_t	wValue[MIX_MAX_CHAN];	/* using nchan */
179	uint32_t mul;
180	uint32_t ctl;
181
182	int wData[MIX_MAX_CHAN];	/* using nchan */
183	uint16_t wIndex;
184
185	uint8_t	update[(MIX_MAX_CHAN + 7) / 8];
186	uint8_t	nchan;
187	uint8_t	type;
188#define	MIX_ON_OFF	1
189#define	MIX_SIGNED_16	2
190#define	MIX_UNSIGNED_16	3
191#define	MIX_SIGNED_8	4
192#define	MIX_SELECTOR	5
193#define	MIX_UNKNOWN     6
194#define	MIX_SIZE(n) ((((n) == MIX_SIGNED_16) || \
195		      ((n) == MIX_UNSIGNED_16)) ? 2 : 1)
196#define	MIX_UNSIGNED(n) ((n) == MIX_UNSIGNED_16)
197
198#define	MAX_SELECTOR_INPUT_PIN 256
199	uint8_t	slctrtype[MAX_SELECTOR_INPUT_PIN];
200	uint8_t val_default;
201
202	uint8_t desc[64];
203
204	struct uaudio_mixer_node *next;
205};
206
207struct uaudio_configure_msg {
208	struct usb_proc_msg hdr;
209	struct uaudio_softc *sc;
210};
211
212#define	CHAN_MAX_ALT 24
213
214struct uaudio_chan_alt {
215	union uaudio_asf1d p_asf1d;
216	union uaudio_sed p_sed;
217	const usb_endpoint_descriptor_audio_t *p_ed1;
218	const struct uaudio_format *p_fmt;
219	const struct usb_config *usb_cfg;
220	uint32_t sample_rate;	/* in Hz */
221	uint16_t sample_size;
222	uint8_t	iface_index;
223	uint8_t	iface_alt_index;
224	uint8_t channels;
225};
226
227struct uaudio_chan {
228	struct pcmchan_caps pcm_cap;	/* capabilities */
229	struct uaudio_chan_alt usb_alt[CHAN_MAX_ALT];
230	struct snd_dbuf *pcm_buf;
231	struct mtx *pcm_mtx;		/* lock protecting this structure */
232	struct uaudio_softc *priv_sc;
233	struct pcm_channel *pcm_ch;
234	struct usb_xfer *xfer[UAUDIO_NCHANBUFS + 1];
235
236	uint8_t *buf;			/* pointer to buffer */
237	uint8_t *start;			/* upper layer buffer start */
238	uint8_t *end;			/* upper layer buffer end */
239	uint8_t *cur;			/* current position in upper layer
240					 * buffer */
241
242	uint32_t intr_frames;		/* in units */
243	uint32_t frames_per_second;
244	uint32_t sample_rem;
245	uint32_t sample_curr;
246	uint32_t max_buf;
247	int32_t jitter_rem;
248	int32_t jitter_curr;
249
250	int feedback_rate;
251
252	uint32_t pcm_format[2];
253
254	uint16_t bytes_per_frame[2];
255
256	uint32_t intr_counter;
257	uint32_t running;
258	uint32_t num_alt;
259	uint32_t cur_alt;
260	uint32_t set_alt;
261	uint32_t operation;
262#define	CHAN_OP_NONE 0
263#define	CHAN_OP_START 1
264#define	CHAN_OP_STOP 2
265#define	CHAN_OP_DRAIN 3
266
267	uint8_t iface_index;
268};
269
270#define	UMIDI_EMB_JACK_MAX   16		/* units */
271#define	UMIDI_TX_FRAMES	   256		/* units */
272#define	UMIDI_TX_BUFFER    (UMIDI_TX_FRAMES * 4)	/* bytes */
273
274enum {
275	UMIDI_TX_TRANSFER,
276	UMIDI_RX_TRANSFER,
277	UMIDI_N_TRANSFER,
278};
279
280struct umidi_sub_chan {
281	struct usb_fifo_sc fifo;
282	uint8_t *temp_cmd;
283	uint8_t	temp_0[4];
284	uint8_t	temp_1[4];
285	uint8_t	state;
286#define	UMIDI_ST_UNKNOWN   0		/* scan for command */
287#define	UMIDI_ST_1PARAM    1
288#define	UMIDI_ST_2PARAM_1  2
289#define	UMIDI_ST_2PARAM_2  3
290#define	UMIDI_ST_SYSEX_0   4
291#define	UMIDI_ST_SYSEX_1   5
292#define	UMIDI_ST_SYSEX_2   6
293
294	uint8_t	read_open:1;
295	uint8_t	write_open:1;
296	uint8_t	unused:6;
297};
298
299struct umidi_chan {
300
301	struct umidi_sub_chan sub[UMIDI_EMB_JACK_MAX];
302	struct mtx mtx;
303
304	struct usb_xfer *xfer[UMIDI_N_TRANSFER];
305
306	uint8_t	iface_index;
307	uint8_t	iface_alt_index;
308
309	uint8_t	read_open_refcount;
310	uint8_t	write_open_refcount;
311
312	uint8_t	curr_cable;
313	uint8_t	max_emb_jack;
314	uint8_t	valid;
315	uint8_t single_command;
316};
317
318struct uaudio_search_result {
319	uint8_t	bit_input[(256 + 7) / 8];
320	uint8_t	bit_output[(256 + 7) / 8];
321	uint8_t	recurse_level;
322	uint8_t	id_max;
323	uint8_t is_input;
324};
325
326enum {
327	UAUDIO_HID_RX_TRANSFER,
328	UAUDIO_HID_N_TRANSFER,
329};
330
331struct uaudio_hid {
332	struct usb_xfer *xfer[UAUDIO_HID_N_TRANSFER];
333	struct hid_location volume_up_loc;
334	struct hid_location volume_down_loc;
335	struct hid_location mute_loc;
336	uint32_t flags;
337#define	UAUDIO_HID_VALID		0x0001
338#define	UAUDIO_HID_HAS_ID		0x0002
339#define	UAUDIO_HID_HAS_VOLUME_UP	0x0004
340#define	UAUDIO_HID_HAS_VOLUME_DOWN	0x0008
341#define	UAUDIO_HID_HAS_MUTE		0x0010
342	uint8_t iface_index;
343	uint8_t volume_up_id;
344	uint8_t volume_down_id;
345	uint8_t mute_id;
346};
347
348#define	UAUDIO_SPDIF_OUT	0x01	/* Enable S/PDIF output */
349#define	UAUDIO_SPDIF_OUT_48K	0x02	/* Out sample rate = 48K */
350#define	UAUDIO_SPDIF_OUT_96K	0x04	/* Out sample rate = 96K */
351#define	UAUDIO_SPDIF_IN_MIX	0x10	/* Input mix enable */
352
353#define	UAUDIO_MAX_CHILD 2
354
355struct uaudio_softc_child {
356	device_t pcm_device;
357	struct mtx *mixer_lock;
358	struct snd_mixer *mixer_dev;
359
360	uint32_t mix_info;
361	uint32_t recsrc_info;
362
363	uint8_t	pcm_registered:1;
364	uint8_t	mixer_init:1;
365};
366
367struct uaudio_softc {
368	struct sbuf sc_sndstat;
369	struct sndcard_func sc_sndcard_func;
370	struct uaudio_chan sc_rec_chan[UAUDIO_MAX_CHILD];
371	struct uaudio_chan sc_play_chan[UAUDIO_MAX_CHILD];
372	struct umidi_chan sc_midi_chan;
373	struct uaudio_hid sc_hid;
374	struct uaudio_search_result sc_mixer_clocks;
375	struct uaudio_mixer_node sc_mixer_node;
376	struct uaudio_configure_msg sc_config_msg[2];
377	struct uaudio_softc_child sc_child[UAUDIO_MAX_CHILD];
378
379	struct usb_device *sc_udev;
380	struct usb_xfer *sc_mixer_xfer[1];
381	struct uaudio_mixer_node *sc_mixer_root;
382	struct uaudio_mixer_node *sc_mixer_curr;
383	int     (*sc_set_spdif_fn) (struct uaudio_softc *, int);
384
385	uint16_t sc_audio_rev;
386	uint16_t sc_mixer_count;
387
388	uint8_t	sc_mixer_iface_index;
389	uint8_t	sc_mixer_iface_no;
390	uint8_t	sc_mixer_chan;
391	uint8_t	sc_sndstat_valid:1;
392	uint8_t	sc_uq_audio_swap_lr:1;
393	uint8_t	sc_uq_au_inp_async:1;
394	uint8_t	sc_uq_au_no_xu:1;
395	uint8_t	sc_uq_bad_adc:1;
396	uint8_t	sc_uq_au_vendor_class:1;
397	uint8_t	sc_pcm_bitperfect:1;
398};
399
400struct uaudio_terminal_node {
401	union {
402		const struct usb_descriptor *desc;
403		const struct usb_audio_input_terminal *it_v1;
404		const struct usb_audio_output_terminal *ot_v1;
405		const struct usb_audio_mixer_unit_0 *mu_v1;
406		const struct usb_audio_selector_unit *su_v1;
407		const struct usb_audio_feature_unit *fu_v1;
408		const struct usb_audio_processing_unit_0 *pu_v1;
409		const struct usb_audio_extension_unit_0 *eu_v1;
410		const struct usb_audio20_clock_source_unit *csrc_v2;
411		const struct usb_audio20_clock_selector_unit_0 *csel_v2;
412		const struct usb_audio20_clock_multiplier_unit *cmul_v2;
413		const struct usb_audio20_input_terminal *it_v2;
414		const struct usb_audio20_output_terminal *ot_v2;
415		const struct usb_audio20_mixer_unit_0 *mu_v2;
416		const struct usb_audio20_selector_unit *su_v2;
417		const struct usb_audio20_feature_unit *fu_v2;
418		const struct usb_audio20_sample_rate_unit *ru_v2;
419		const struct usb_audio20_processing_unit_0 *pu_v2;
420		const struct usb_audio20_extension_unit_0 *eu_v2;
421		const struct usb_audio20_effect_unit *ef_v2;
422	}	u;
423	struct uaudio_search_result usr;
424	struct uaudio_terminal_node *root;
425};
426
427struct uaudio_format {
428	uint16_t wFormat;
429	uint8_t	bPrecision;
430	uint32_t freebsd_fmt;
431	const char *description;
432};
433
434static const struct uaudio_format uaudio10_formats[] = {
435
436	{UA_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
437	{UA_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
438	{UA_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
439	{UA_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
440
441	{UA_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
442	{UA_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
443	{UA_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
444	{UA_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
445
446	{UA_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
447	{UA_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
448
449	{0, 0, 0, NULL}
450};
451
452static const struct uaudio_format uaudio20_formats[] = {
453
454	{UA20_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"},
455	{UA20_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"},
456	{UA20_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"},
457	{UA20_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"},
458
459	{UA20_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"},
460	{UA20_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"},
461	{UA20_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"},
462	{UA20_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"},
463
464	{UA20_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"},
465	{UA20_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"},
466
467	{0, 0, 0, NULL}
468};
469
470/* prototypes */
471
472static device_probe_t uaudio_probe;
473static device_attach_t uaudio_attach;
474static device_detach_t uaudio_detach;
475
476static usb_callback_t uaudio_chan_play_callback;
477static usb_callback_t uaudio_chan_play_sync_callback;
478static usb_callback_t uaudio_chan_record_callback;
479static usb_callback_t uaudio_chan_record_sync_callback;
480static usb_callback_t uaudio_mixer_write_cfg_callback;
481static usb_callback_t umidi_bulk_read_callback;
482static usb_callback_t umidi_bulk_write_callback;
483static usb_callback_t uaudio_hid_rx_callback;
484
485static usb_proc_callback_t uaudio_configure_msg;
486
487/* ==== USB mixer ==== */
488
489static int uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS);
490static void uaudio_mixer_ctl_free(struct uaudio_softc *);
491static void uaudio_mixer_register_sysctl(struct uaudio_softc *, device_t, unsigned);
492static void uaudio_mixer_reload_all(struct uaudio_softc *);
493static void uaudio_mixer_controls_create_ftu(struct uaudio_softc *);
494
495/* ==== USB audio v1.0 ==== */
496
497static void	uaudio_mixer_add_mixer(struct uaudio_softc *,
498		    const struct uaudio_terminal_node *, int);
499static void	uaudio_mixer_add_selector(struct uaudio_softc *,
500		    const struct uaudio_terminal_node *, int);
501static uint32_t	uaudio_mixer_feature_get_bmaControls(
502		    const struct usb_audio_feature_unit *, uint8_t);
503static void	uaudio_mixer_add_feature(struct uaudio_softc *,
504		    const struct uaudio_terminal_node *, int);
505static void	uaudio_mixer_add_processing_updown(struct uaudio_softc *,
506		    const struct uaudio_terminal_node *, int);
507static void	uaudio_mixer_add_processing(struct uaudio_softc *,
508		    const struct uaudio_terminal_node *, int);
509static void	uaudio_mixer_add_extension(struct uaudio_softc *,
510		    const struct uaudio_terminal_node *, int);
511static struct	usb_audio_cluster uaudio_mixer_get_cluster(uint8_t,
512		    const struct uaudio_terminal_node *);
513static uint16_t	uaudio_mixer_determine_class(const struct uaudio_terminal_node *);
514static void	uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *,
515		    const uint8_t *, uint8_t, struct uaudio_search_result *);
516static const void *uaudio_mixer_verify_desc(const void *, uint32_t);
517static usb_error_t uaudio_set_speed(struct usb_device *, uint8_t, uint32_t);
518static int	uaudio_mixer_get(struct usb_device *, uint16_t, uint8_t,
519		    struct uaudio_mixer_node *);
520
521/* ==== USB audio v2.0 ==== */
522
523static void	uaudio20_mixer_add_mixer(struct uaudio_softc *,
524		    const struct uaudio_terminal_node *, int);
525static void	uaudio20_mixer_add_selector(struct uaudio_softc *,
526		    const struct uaudio_terminal_node *, int);
527static void	uaudio20_mixer_add_feature(struct uaudio_softc *,
528		    const struct uaudio_terminal_node *, int);
529static struct	usb_audio20_cluster uaudio20_mixer_get_cluster(uint8_t,
530		    const struct uaudio_terminal_node *);
531static uint16_t	uaudio20_mixer_determine_class(const struct uaudio_terminal_node *);
532static void	uaudio20_mixer_find_inputs_sub(struct uaudio_terminal_node *,
533		    const uint8_t *, uint8_t, struct uaudio_search_result *);
534static const void *uaudio20_mixer_verify_desc(const void *, uint32_t);
535static usb_error_t uaudio20_set_speed(struct usb_device *, uint8_t,
536		    uint8_t, uint32_t);
537
538/* USB audio v1.0 and v2.0 */
539
540static void	uaudio_chan_fill_info_sub(struct uaudio_softc *,
541		    struct usb_device *, uint32_t, uint8_t, uint8_t);
542static void	uaudio_chan_fill_info(struct uaudio_softc *,
543		    struct usb_device *);
544static void	uaudio_mixer_add_ctl_sub(struct uaudio_softc *,
545		    struct uaudio_mixer_node *);
546static void	uaudio_mixer_add_ctl(struct uaudio_softc *,
547		    struct uaudio_mixer_node *);
548static void	uaudio_mixer_fill_info(struct uaudio_softc *,
549		    struct usb_device *, void *);
550static int	uaudio_mixer_signext(uint8_t, int);
551static void	uaudio_mixer_init(struct uaudio_softc *, unsigned);
552static uint8_t	umidi_convert_to_usb(struct umidi_sub_chan *, uint8_t, uint8_t);
553static struct	umidi_sub_chan *umidi_sub_by_fifo(struct usb_fifo *);
554static void	umidi_start_read(struct usb_fifo *);
555static void	umidi_stop_read(struct usb_fifo *);
556static void	umidi_start_write(struct usb_fifo *);
557static void	umidi_stop_write(struct usb_fifo *);
558static int	umidi_open(struct usb_fifo *, int);
559static int	umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int);
560static void	umidi_close(struct usb_fifo *, int);
561static void	umidi_init(device_t dev);
562static int	umidi_probe(device_t dev);
563static int	umidi_detach(device_t dev);
564static int	uaudio_hid_probe(struct uaudio_softc *sc,
565		    struct usb_attach_arg *uaa);
566static void	uaudio_hid_detach(struct uaudio_softc *sc);
567
568#ifdef USB_DEBUG
569static void	uaudio_chan_dump_ep_desc(
570		    const usb_endpoint_descriptor_audio_t *);
571#endif
572
573static const struct usb_config
574	uaudio_cfg_record[UAUDIO_NCHANBUFS + 1] = {
575	[0] = {
576		.type = UE_ISOCHRONOUS,
577		.endpoint = UE_ADDR_ANY,
578		.direction = UE_DIR_IN,
579		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
580		.frames = UAUDIO_NFRAMES,
581		.flags = {.short_xfer_ok = 1,},
582		.callback = &uaudio_chan_record_callback,
583	},
584
585	[1] = {
586		.type = UE_ISOCHRONOUS,
587		.endpoint = UE_ADDR_ANY,
588		.direction = UE_DIR_IN,
589		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
590		.frames = UAUDIO_NFRAMES,
591		.flags = {.short_xfer_ok = 1,},
592		.callback = &uaudio_chan_record_callback,
593	},
594
595	[2] = {
596		.type = UE_ISOCHRONOUS,
597		.endpoint = UE_ADDR_ANY,
598		.direction = UE_DIR_OUT,
599		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
600		.frames = 1,
601		.flags = {.no_pipe_ok = 1,.short_xfer_ok = 1,},
602		.callback = &uaudio_chan_record_sync_callback,
603	},
604};
605
606static const struct usb_config
607	uaudio_cfg_play[UAUDIO_NCHANBUFS + 1] = {
608	[0] = {
609		.type = UE_ISOCHRONOUS,
610		.endpoint = UE_ADDR_ANY,
611		.direction = UE_DIR_OUT,
612		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
613		.frames = UAUDIO_NFRAMES,
614		.flags = {.short_xfer_ok = 1,},
615		.callback = &uaudio_chan_play_callback,
616	},
617
618	[1] = {
619		.type = UE_ISOCHRONOUS,
620		.endpoint = UE_ADDR_ANY,
621		.direction = UE_DIR_OUT,
622		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
623		.frames = UAUDIO_NFRAMES,
624		.flags = {.short_xfer_ok = 1,},
625		.callback = &uaudio_chan_play_callback,
626	},
627
628	[2] = {
629		.type = UE_ISOCHRONOUS,
630		.endpoint = UE_ADDR_ANY,
631		.direction = UE_DIR_IN,
632		.bufsize = 0,	/* use "wMaxPacketSize * frames" */
633		.frames = 1,
634		.flags = {.no_pipe_ok = 1,.short_xfer_ok = 1,},
635		.callback = &uaudio_chan_play_sync_callback,
636	},
637};
638
639static const struct usb_config
640	uaudio_mixer_config[1] = {
641	[0] = {
642		.type = UE_CONTROL,
643		.endpoint = 0x00,	/* Control pipe */
644		.direction = UE_DIR_ANY,
645		.bufsize = (sizeof(struct usb_device_request) + 4),
646		.callback = &uaudio_mixer_write_cfg_callback,
647		.timeout = 1000,	/* 1 second */
648	},
649};
650
651static const
652uint8_t	umidi_cmd_to_len[16] = {
653	[0x0] = 0,			/* reserved */
654	[0x1] = 0,			/* reserved */
655	[0x2] = 2,			/* bytes */
656	[0x3] = 3,			/* bytes */
657	[0x4] = 3,			/* bytes */
658	[0x5] = 1,			/* bytes */
659	[0x6] = 2,			/* bytes */
660	[0x7] = 3,			/* bytes */
661	[0x8] = 3,			/* bytes */
662	[0x9] = 3,			/* bytes */
663	[0xA] = 3,			/* bytes */
664	[0xB] = 3,			/* bytes */
665	[0xC] = 2,			/* bytes */
666	[0xD] = 2,			/* bytes */
667	[0xE] = 3,			/* bytes */
668	[0xF] = 1,			/* bytes */
669};
670
671static const struct usb_config
672	umidi_config[UMIDI_N_TRANSFER] = {
673	[UMIDI_TX_TRANSFER] = {
674		.type = UE_BULK,
675		.endpoint = UE_ADDR_ANY,
676		.direction = UE_DIR_OUT,
677		.bufsize = UMIDI_TX_BUFFER,
678		.flags = {.no_pipe_ok = 1},
679		.callback = &umidi_bulk_write_callback,
680	},
681
682	[UMIDI_RX_TRANSFER] = {
683		.type = UE_BULK,
684		.endpoint = UE_ADDR_ANY,
685		.direction = UE_DIR_IN,
686		.bufsize = 4,	/* bytes */
687		.flags = {.short_xfer_ok = 1,.proxy_buffer = 1,.no_pipe_ok = 1},
688		.callback = &umidi_bulk_read_callback,
689	},
690};
691
692static const struct usb_config
693	uaudio_hid_config[UAUDIO_HID_N_TRANSFER] = {
694	[UAUDIO_HID_RX_TRANSFER] = {
695		.type = UE_INTERRUPT,
696		.endpoint = UE_ADDR_ANY,
697		.direction = UE_DIR_IN,
698		.bufsize = 0,	/* use wMaxPacketSize */
699		.flags = {.short_xfer_ok = 1,},
700		.callback = &uaudio_hid_rx_callback,
701	},
702};
703
704static devclass_t uaudio_devclass;
705
706static device_method_t uaudio_methods[] = {
707	DEVMETHOD(device_probe, uaudio_probe),
708	DEVMETHOD(device_attach, uaudio_attach),
709	DEVMETHOD(device_detach, uaudio_detach),
710	DEVMETHOD(device_suspend, bus_generic_suspend),
711	DEVMETHOD(device_resume, bus_generic_resume),
712	DEVMETHOD(device_shutdown, bus_generic_shutdown),
713
714	DEVMETHOD_END
715};
716
717static driver_t uaudio_driver = {
718	.name = "uaudio",
719	.methods = uaudio_methods,
720	.size = sizeof(struct uaudio_softc),
721};
722
723/* The following table is derived from Linux's quirks-table.h */
724static const STRUCT_USB_HOST_ID uaudio_vendor_midi[] = {
725	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1000, 0) }, /* UX256 */
726	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1001, 0) }, /* MU1000 */
727	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1002, 0) }, /* MU2000 */
728	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1003, 0) }, /* MU500 */
729	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1004, 3) }, /* UW500 */
730	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1005, 0) }, /* MOTIF6 */
731	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1006, 0) }, /* MOTIF7 */
732	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1007, 0) }, /* MOTIF8 */
733	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1008, 0) }, /* UX96 */
734	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1009, 0) }, /* UX16 */
735	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100a, 3) }, /* EOS BX */
736	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100c, 0) }, /* UC-MX */
737	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100d, 0) }, /* UC-KX */
738	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100e, 0) }, /* S08 */
739	{ USB_VPI(USB_VENDOR_YAMAHA, 0x100f, 0) }, /* CLP-150 */
740	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1010, 0) }, /* CLP-170 */
741	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1011, 0) }, /* P-250 */
742	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1012, 0) }, /* TYROS */
743	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1013, 0) }, /* PF-500 */
744	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1014, 0) }, /* S90 */
745	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1015, 0) }, /* MOTIF-R */
746	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1016, 0) }, /* MDP-5 */
747	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1017, 0) }, /* CVP-204 */
748	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1018, 0) }, /* CVP-206 */
749	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1019, 0) }, /* CVP-208 */
750	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101a, 0) }, /* CVP-210 */
751	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101b, 0) }, /* PSR-1100 */
752	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101c, 0) }, /* PSR-2100 */
753	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101d, 0) }, /* CLP-175 */
754	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101e, 0) }, /* PSR-K1 */
755	{ USB_VPI(USB_VENDOR_YAMAHA, 0x101f, 0) }, /* EZ-J24 */
756	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1020, 0) }, /* EZ-250i */
757	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1021, 0) }, /* MOTIF ES 6 */
758	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1022, 0) }, /* MOTIF ES 7 */
759	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1023, 0) }, /* MOTIF ES 8 */
760	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1024, 0) }, /* CVP-301 */
761	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1025, 0) }, /* CVP-303 */
762	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1026, 0) }, /* CVP-305 */
763	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1027, 0) }, /* CVP-307 */
764	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1028, 0) }, /* CVP-309 */
765	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1029, 0) }, /* CVP-309GP */
766	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102a, 0) }, /* PSR-1500 */
767	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102b, 0) }, /* PSR-3000 */
768	{ USB_VPI(USB_VENDOR_YAMAHA, 0x102e, 0) }, /* ELS-01/01C */
769	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1030, 0) }, /* PSR-295/293 */
770	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1031, 0) }, /* DGX-205/203 */
771	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1032, 0) }, /* DGX-305 */
772	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1033, 0) }, /* DGX-505 */
773	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1034, 0) }, /* NULL */
774	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1035, 0) }, /* NULL */
775	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1036, 0) }, /* NULL */
776	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1037, 0) }, /* NULL */
777	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1038, 0) }, /* NULL */
778	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1039, 0) }, /* NULL */
779	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103a, 0) }, /* NULL */
780	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103b, 0) }, /* NULL */
781	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103c, 0) }, /* NULL */
782	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103d, 0) }, /* NULL */
783	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103e, 0) }, /* NULL */
784	{ USB_VPI(USB_VENDOR_YAMAHA, 0x103f, 0) }, /* NULL */
785	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1040, 0) }, /* NULL */
786	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1041, 0) }, /* NULL */
787	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1042, 0) }, /* NULL */
788	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1043, 0) }, /* NULL */
789	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1044, 0) }, /* NULL */
790	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1045, 0) }, /* NULL */
791	{ USB_VPI(USB_VENDOR_YAMAHA, 0x104e, 0) }, /* NULL */
792	{ USB_VPI(USB_VENDOR_YAMAHA, 0x104f, 0) }, /* NULL */
793	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1050, 0) }, /* NULL */
794	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1051, 0) }, /* NULL */
795	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1052, 0) }, /* NULL */
796	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1053, 0) }, /* NULL */
797	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1054, 0) }, /* NULL */
798	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1055, 0) }, /* NULL */
799	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1056, 0) }, /* NULL */
800	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1057, 0) }, /* NULL */
801	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1058, 0) }, /* NULL */
802	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1059, 0) }, /* NULL */
803	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105a, 0) }, /* NULL */
804	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105b, 0) }, /* NULL */
805	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105c, 0) }, /* NULL */
806	{ USB_VPI(USB_VENDOR_YAMAHA, 0x105d, 0) }, /* NULL */
807	{ USB_VPI(USB_VENDOR_YAMAHA, 0x1503, 3) }, /* MOX6/MOX8 */
808	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2000, 0) }, /* DGP-7 */
809	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2001, 0) }, /* DGP-5 */
810	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2002, 0) }, /* NULL */
811	{ USB_VPI(USB_VENDOR_YAMAHA, 0x2003, 0) }, /* NULL */
812	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5000, 0) }, /* CS1D */
813	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5001, 0) }, /* DSP1D */
814	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5002, 0) }, /* DME32 */
815	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5003, 0) }, /* DM2000 */
816	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5004, 0) }, /* 02R96 */
817	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5005, 0) }, /* ACU16-C */
818	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5006, 0) }, /* NHB32-C */
819	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5007, 0) }, /* DM1000 */
820	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5008, 0) }, /* 01V96 */
821	{ USB_VPI(USB_VENDOR_YAMAHA, 0x5009, 0) }, /* SPX2000 */
822	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500a, 0) }, /* PM5D */
823	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500b, 0) }, /* DME64N */
824	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500c, 0) }, /* DME24N */
825	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500d, 0) }, /* NULL */
826	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500e, 0) }, /* NULL */
827	{ USB_VPI(USB_VENDOR_YAMAHA, 0x500f, 0) }, /* NULL */
828	{ USB_VPI(USB_VENDOR_YAMAHA, 0x7000, 0) }, /* DTX */
829	{ USB_VPI(USB_VENDOR_YAMAHA, 0x7010, 0) }, /* UB99 */
830};
831
832static const STRUCT_USB_HOST_ID __used uaudio_devs[] = {
833	/* Generic USB audio class match */
834	{USB_IFACE_CLASS(UICLASS_AUDIO),
835	 USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),},
836	/* Generic USB MIDI class match */
837	{USB_IFACE_CLASS(UICLASS_AUDIO),
838	 USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),},
839};
840
841static unsigned
842uaudio_get_child_index_by_dev(struct uaudio_softc *sc, device_t dev)
843{
844	unsigned i;
845
846	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
847		if (dev == sc->sc_child[i].pcm_device)
848			return (i);
849	}
850	panic("uaudio_get_child_index_dev: Invalid device: %p\n", dev);
851	return (0);
852}
853
854static unsigned
855uaudio_get_child_index_by_chan(struct uaudio_softc *sc, struct uaudio_chan *ch)
856{
857	unsigned i;
858
859	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
860		if ((sc->sc_play_chan + i) == ch ||
861		    (sc->sc_rec_chan + i) == ch)
862			return (i);
863	}
864	panic("uaudio_get_child_index_by_chan: Invalid chan: %p\n", ch);
865	return (0);
866}
867
868static int
869uaudio_probe(device_t dev)
870{
871	struct usb_attach_arg *uaa = device_get_ivars(dev);
872
873	if (uaa->usb_mode != USB_MODE_HOST)
874		return (ENXIO);
875
876	/* lookup non-standard device(s) */
877
878	if (usbd_lookup_id_by_uaa(uaudio_vendor_midi,
879	    sizeof(uaudio_vendor_midi), uaa) == 0) {
880		return (BUS_PROBE_SPECIFIC);
881	}
882
883	if (uaa->info.bInterfaceClass != UICLASS_AUDIO) {
884		if (uaa->info.bInterfaceClass != UICLASS_VENDOR ||
885		    usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0)
886			return (ENXIO);
887	}
888
889	/* check for AUDIO control interface */
890
891	if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) {
892		if (usb_test_quirk(uaa, UQ_BAD_AUDIO))
893			return (ENXIO);
894		else
895			return (BUS_PROBE_GENERIC);
896	}
897
898	/* check for MIDI stream */
899
900	if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) {
901		if (usb_test_quirk(uaa, UQ_BAD_MIDI))
902			return (ENXIO);
903		else
904			return (BUS_PROBE_GENERIC);
905	}
906	return (ENXIO);
907}
908
909/*
910 * Set Cmedia CM6206 S/PDIF settings
911 * Source: CM6206 Datasheet v2.3.
912 */
913static int
914uaudio_set_spdif_cm6206(struct uaudio_softc *sc, int flags)
915{
916	uint8_t cmd[2][4] = {
917		{0x20, 0x20, 0x00, 0},
918		{0x20, 0x30, 0x02, 1}
919	};
920	int i;
921
922	if (flags & UAUDIO_SPDIF_OUT)
923		cmd[1][1] = 0x00;
924	else
925		cmd[1][1] = 0x02;
926
927	if (flags & UAUDIO_SPDIF_OUT_96K)
928		cmd[0][1] = 0x60;	/* 96K: 3'b110 */
929
930	if (flags & UAUDIO_SPDIF_IN_MIX)
931		cmd[1][1] = 0x03;	/* SPDIFMIX */
932
933	for (i = 0; i < 2; i++) {
934		if (usbd_req_set_report(sc->sc_udev, NULL,
935		    cmd[i], sizeof(cmd[0]),
936		    sc->sc_mixer_iface_index, UHID_OUTPUT_REPORT, 0) != 0) {
937			return (ENXIO);
938		}
939	}
940	return (0);
941}
942
943static int
944uaudio_set_spdif_dummy(struct uaudio_softc *sc, int flags)
945{
946	return (0);
947}
948
949static usb_error_t
950uaudio_force_power_save(struct uaudio_softc *sc, uint8_t iface_index)
951{
952	struct usb_interface *iface;
953	usb_error_t err;
954
955	iface = usbd_get_iface(sc->sc_udev, iface_index);
956	if (iface == NULL || iface->idesc == NULL)
957		return (USB_ERR_INVAL);
958
959	/* check if correct alternate setting is already selected */
960	if (iface->alt_index == 0) {
961		/* force power save mode by selecting default alternate setting */
962		err = usbd_req_set_alt_interface_no(sc->sc_udev, NULL, iface_index,
963		    iface->idesc->bAlternateSetting);
964	} else {
965		err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, 0);
966	}
967	return (err);
968}
969
970static int
971uaudio_attach(device_t dev)
972{
973	struct usb_attach_arg *uaa = device_get_ivars(dev);
974	struct uaudio_softc *sc = device_get_softc(dev);
975	struct usb_interface_descriptor *id;
976	usb_error_t err;
977	unsigned i;
978
979	sc->sc_udev = uaa->device;
980	sc->sc_mixer_iface_index = uaa->info.bIfaceIndex;
981	sc->sc_mixer_iface_no = uaa->info.bIfaceNum;
982	sc->sc_config_msg[0].hdr.pm_callback = &uaudio_configure_msg;
983	sc->sc_config_msg[0].sc = sc;
984	sc->sc_config_msg[1].hdr.pm_callback = &uaudio_configure_msg;
985	sc->sc_config_msg[1].sc = sc;
986
987	if (usb_test_quirk(uaa, UQ_AUDIO_SWAP_LR))
988		sc->sc_uq_audio_swap_lr = 1;
989
990	if (usb_test_quirk(uaa, UQ_AU_INP_ASYNC))
991		sc->sc_uq_au_inp_async = 1;
992
993	if (usb_test_quirk(uaa, UQ_AU_NO_XU))
994		sc->sc_uq_au_no_xu = 1;
995
996	if (usb_test_quirk(uaa, UQ_BAD_ADC))
997		sc->sc_uq_bad_adc = 1;
998
999	if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS))
1000		sc->sc_uq_au_vendor_class = 1;
1001
1002	/* set S/PDIF function */
1003	if (usb_test_quirk(uaa, UQ_AU_SET_SPDIF_CM6206))
1004		sc->sc_set_spdif_fn = uaudio_set_spdif_cm6206;
1005	else
1006		sc->sc_set_spdif_fn = uaudio_set_spdif_dummy;
1007
1008	umidi_init(dev);
1009
1010	device_set_usb_desc(dev);
1011
1012	id = usbd_get_interface_descriptor(uaa->iface);
1013
1014	/* must fill mixer info before channel info */
1015	uaudio_mixer_fill_info(sc, uaa->device, id);
1016
1017	/* fill channel info */
1018	uaudio_chan_fill_info(sc, uaa->device);
1019
1020	DPRINTF("audio rev %d.%02x\n",
1021	    sc->sc_audio_rev >> 8,
1022	    sc->sc_audio_rev & 0xff);
1023
1024	if (sc->sc_mixer_count == 0) {
1025		if (uaa->info.idVendor == USB_VENDOR_MAUDIO &&
1026		    (uaa->info.idProduct == USB_PRODUCT_MAUDIO_FASTTRACKULTRA ||
1027		    uaa->info.idProduct == USB_PRODUCT_MAUDIO_FASTTRACKULTRA8R)) {
1028			DPRINTF("Generating mixer descriptors\n");
1029			uaudio_mixer_controls_create_ftu(sc);
1030		}
1031	}
1032
1033	DPRINTF("%d mixer controls\n",
1034	    sc->sc_mixer_count);
1035
1036	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1037		uint8_t x;
1038
1039		if (sc->sc_play_chan[i].num_alt <= 0)
1040			break;
1041
1042		/*
1043		 * Need to set a default alternate interface, else
1044		 * some USB audio devices might go into an infinite
1045		 * re-enumeration loop:
1046		 */
1047		err = uaudio_force_power_save(sc,
1048		    sc->sc_play_chan[i].usb_alt[0].iface_index);
1049		if (err) {
1050			DPRINTF("setting of alternate index failed: %s!\n",
1051			    usbd_errstr(err));
1052		}
1053
1054		for (x = 0; x != sc->sc_play_chan[i].num_alt; x++) {
1055			device_printf(dev, "Play[%u]: %d Hz, %d ch, %s format, "
1056			    "2x%dms buffer.\n", i,
1057			    sc->sc_play_chan[i].usb_alt[x].sample_rate,
1058			    sc->sc_play_chan[i].usb_alt[x].channels,
1059			    sc->sc_play_chan[i].usb_alt[x].p_fmt->description,
1060			    uaudio_buffer_ms);
1061		}
1062	}
1063	if (i == 0)
1064		device_printf(dev, "No playback.\n");
1065
1066	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1067		uint8_t x;
1068
1069		if (sc->sc_rec_chan[i].num_alt <= 0)
1070			break;
1071
1072		/*
1073		 * Need to set a default alternate interface, else
1074		 * some USB audio devices might go into an infinite
1075		 * re-enumeration loop:
1076		 */
1077		err = uaudio_force_power_save(sc,
1078		    sc->sc_rec_chan[i].usb_alt[0].iface_index);
1079		if (err) {
1080			DPRINTF("setting of alternate index failed: %s!\n",
1081			    usbd_errstr(err));
1082		}
1083
1084		for (x = 0; x != sc->sc_rec_chan[i].num_alt; x++) {
1085			device_printf(dev, "Record[%u]: %d Hz, %d ch, %s format, "
1086			    "2x%dms buffer.\n", i,
1087			    sc->sc_rec_chan[i].usb_alt[x].sample_rate,
1088			    sc->sc_rec_chan[i].usb_alt[x].channels,
1089			    sc->sc_rec_chan[i].usb_alt[x].p_fmt->description,
1090			    uaudio_buffer_ms);
1091		}
1092	}
1093	if (i == 0)
1094		device_printf(dev, "No recording.\n");
1095
1096	if (sc->sc_midi_chan.valid == 0) {
1097		if (usbd_lookup_id_by_uaa(uaudio_vendor_midi,
1098		    sizeof(uaudio_vendor_midi), uaa) == 0) {
1099			sc->sc_midi_chan.iface_index =
1100			    (uint8_t)uaa->driver_info;
1101			sc->sc_midi_chan.iface_alt_index = 0;
1102			sc->sc_midi_chan.valid = 1;
1103		}
1104	}
1105
1106	if (sc->sc_midi_chan.valid) {
1107
1108		if (umidi_probe(dev)) {
1109			goto detach;
1110		}
1111		device_printf(dev, "MIDI sequencer.\n");
1112	} else {
1113		device_printf(dev, "No MIDI sequencer.\n");
1114	}
1115
1116	DPRINTF("doing child attach\n");
1117
1118	/* attach the children */
1119
1120	sc->sc_sndcard_func.func = SCF_PCM;
1121
1122	/*
1123	 * Only attach a PCM device if we have a playback, recording
1124	 * or mixer device present:
1125	 */
1126	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1127		if (sc->sc_play_chan[i].num_alt <= 0 &&
1128		    sc->sc_rec_chan[i].num_alt <= 0 &&
1129		    sc->sc_child[i].mix_info == 0)
1130			continue;
1131		sc->sc_child[i].pcm_device =
1132		    device_add_child(dev, "pcm", -1);
1133
1134		if (sc->sc_child[i].pcm_device == NULL) {
1135			DPRINTF("out of memory\n");
1136			goto detach;
1137		}
1138		device_set_ivars(sc->sc_child[i].pcm_device,
1139		    &sc->sc_sndcard_func);
1140	}
1141
1142	if (bus_generic_attach(dev)) {
1143		DPRINTF("child attach failed\n");
1144		goto detach;
1145	}
1146
1147	if (uaudio_handle_hid) {
1148		if (uaudio_hid_probe(sc, uaa) == 0) {
1149			device_printf(dev, "HID volume keys found.\n");
1150		} else {
1151			device_printf(dev, "No HID volume keys found.\n");
1152		}
1153	}
1154
1155	/* reload all mixer settings */
1156	uaudio_mixer_reload_all(sc);
1157
1158	/* enable S/PDIF output, if any */
1159	if (sc->sc_set_spdif_fn(sc,
1160	    UAUDIO_SPDIF_OUT | UAUDIO_SPDIF_OUT_48K) != 0) {
1161		device_printf(dev, "Failed to enable S/PDIF at 48K\n");
1162	}
1163	return (0);			/* success */
1164
1165detach:
1166	uaudio_detach(dev);
1167	return (ENXIO);
1168}
1169
1170static void
1171uaudio_pcm_setflags(device_t dev, uint32_t flags)
1172{
1173	pcm_setflags(dev, pcm_getflags(dev) | flags);
1174}
1175
1176int
1177uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_class)
1178{
1179	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
1180	unsigned i = uaudio_get_child_index_by_dev(sc, dev);
1181	char status[SND_STATUSLEN];
1182
1183	uaudio_mixer_init(sc, i);
1184
1185	if (sc->sc_uq_audio_swap_lr) {
1186		DPRINTF("hardware has swapped left and right\n");
1187		/* uaudio_pcm_setflags(dev, SD_F_PSWAPLR); */
1188	}
1189	if (sc->sc_play_chan[i].num_alt > 0 &&
1190	    (sc->sc_child[i].mix_info & SOUND_MASK_PCM) == 0) {
1191
1192		DPRINTF("emulating master volume\n");
1193
1194		/*
1195		 * Emulate missing pcm mixer controller
1196		 * through FEEDER_VOLUME
1197		 */
1198		uaudio_pcm_setflags(dev, SD_F_SOFTPCMVOL);
1199	}
1200	if (sc->sc_pcm_bitperfect) {
1201		DPRINTF("device needs bitperfect by default\n");
1202		uaudio_pcm_setflags(dev, SD_F_BITPERFECT);
1203	}
1204	if (mixer_init(dev, mixer_class, sc))
1205		goto detach;
1206	sc->sc_child[i].mixer_init = 1;
1207
1208	mixer_hwvol_init(dev);
1209
1210	snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio));
1211
1212	if (pcm_register(dev, sc,
1213	    (sc->sc_play_chan[i].num_alt > 0) ? 1 : 0,
1214	    (sc->sc_rec_chan[i].num_alt > 0) ? 1 : 0)) {
1215		goto detach;
1216	}
1217
1218	uaudio_pcm_setflags(dev, SD_F_MPSAFE);
1219	sc->sc_child[i].pcm_registered = 1;
1220
1221	if (sc->sc_play_chan[i].num_alt > 0) {
1222		sc->sc_play_chan[i].priv_sc = sc;
1223		pcm_addchan(dev, PCMDIR_PLAY, chan_class,
1224		    &sc->sc_play_chan[i]);
1225	}
1226
1227	if (sc->sc_rec_chan[i].num_alt > 0) {
1228		sc->sc_rec_chan[i].priv_sc = sc;
1229		pcm_addchan(dev, PCMDIR_REC, chan_class,
1230		    &sc->sc_rec_chan[i]);
1231	}
1232	pcm_setstatus(dev, status);
1233
1234	uaudio_mixer_register_sysctl(sc, dev, i);
1235
1236	SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
1237	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
1238	    "feedback_rate", CTLFLAG_RD, &sc->sc_play_chan[i].feedback_rate,
1239	    0, "Feedback sample rate in Hz");
1240
1241	return (0);			/* success */
1242
1243detach:
1244	uaudio_detach_sub(dev);
1245	return (ENXIO);
1246}
1247
1248int
1249uaudio_detach_sub(device_t dev)
1250{
1251	struct uaudio_softc *sc = device_get_softc(device_get_parent(dev));
1252	unsigned i = uaudio_get_child_index_by_dev(sc, dev);
1253	int error = 0;
1254
1255repeat:
1256	if (sc->sc_child[i].pcm_registered) {
1257		error = pcm_unregister(dev);
1258	} else {
1259		if (sc->sc_child[i].mixer_init)
1260			error = mixer_uninit(dev);
1261	}
1262
1263	if (error) {
1264		device_printf(dev, "Waiting for sound application to exit!\n");
1265		usb_pause_mtx(NULL, 2 * hz);
1266		goto repeat;		/* try again */
1267	}
1268	return (0);			/* success */
1269}
1270
1271static int
1272uaudio_detach(device_t dev)
1273{
1274	struct uaudio_softc *sc = device_get_softc(dev);
1275	unsigned i;
1276
1277	/*
1278	 * Stop USB transfers early so that any audio applications
1279	 * will time out and close opened /dev/dspX.Y device(s), if
1280	 * any.
1281	 */
1282	usb_proc_explore_lock(sc->sc_udev);
1283	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1284		sc->sc_play_chan[i].operation = CHAN_OP_DRAIN;
1285		sc->sc_rec_chan[i].operation = CHAN_OP_DRAIN;
1286	}
1287	usb_proc_explore_mwait(sc->sc_udev,
1288	    &sc->sc_config_msg[0], &sc->sc_config_msg[1]);
1289	usb_proc_explore_unlock(sc->sc_udev);
1290
1291	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1292		usbd_transfer_unsetup(sc->sc_play_chan[i].xfer, UAUDIO_NCHANBUFS + 1);
1293		usbd_transfer_unsetup(sc->sc_rec_chan[i].xfer, UAUDIO_NCHANBUFS + 1);
1294	}
1295
1296	uaudio_hid_detach(sc);
1297
1298	if (bus_generic_detach(dev) != 0) {
1299		DPRINTF("detach failed!\n");
1300	}
1301	sbuf_delete(&sc->sc_sndstat);
1302	sc->sc_sndstat_valid = 0;
1303
1304	umidi_detach(dev);
1305
1306	/* free mixer data */
1307
1308	uaudio_mixer_ctl_free(sc);
1309
1310	/* disable S/PDIF output, if any */
1311	(void) sc->sc_set_spdif_fn(sc, 0);
1312
1313	return (0);
1314}
1315
1316static uint32_t
1317uaudio_get_buffer_size(struct uaudio_chan *ch, uint8_t alt)
1318{
1319	struct uaudio_chan_alt *chan_alt = &ch->usb_alt[alt];
1320	/* We use 2 times 8ms of buffer */
1321	uint32_t buf_size = chan_alt->sample_size *
1322	    howmany(chan_alt->sample_rate * (UAUDIO_NFRAMES / 8), 1000);
1323	return (buf_size);
1324}
1325
1326static void
1327uaudio_configure_msg_sub(struct uaudio_softc *sc,
1328    struct uaudio_chan *chan, int dir)
1329{
1330	struct uaudio_chan_alt *chan_alt;
1331	uint32_t frames;
1332	uint32_t buf_size;
1333	uint16_t fps;
1334	uint8_t next_alt;
1335	uint8_t fps_shift;
1336	uint8_t operation;
1337	usb_error_t err;
1338
1339	if (chan->num_alt <= 0)
1340		return;
1341
1342	DPRINTF("\n");
1343
1344	usb_proc_explore_lock(sc->sc_udev);
1345	operation = chan->operation;
1346	switch (operation) {
1347	case CHAN_OP_START:
1348	case CHAN_OP_STOP:
1349		chan->operation = CHAN_OP_NONE;
1350		break;
1351	default:
1352		break;
1353	}
1354	usb_proc_explore_unlock(sc->sc_udev);
1355
1356	switch (operation) {
1357	case CHAN_OP_STOP:
1358		/* Unsetup prior USB transfers, if any. */
1359		usbd_transfer_unsetup(chan->xfer, UAUDIO_NCHANBUFS + 1);
1360
1361		mtx_lock(chan->pcm_mtx);
1362		chan->cur_alt = CHAN_MAX_ALT;
1363		mtx_unlock(chan->pcm_mtx);
1364
1365		/*
1366		 * The first alternate setting is typically used for
1367		 * power saving mode. Set this alternate setting as
1368		 * part of entering stop.
1369		 */
1370		err = usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index, 0);
1371		if (err) {
1372			DPRINTF("setting of default alternate index failed: %s!\n",
1373			    usbd_errstr(err));
1374		}
1375		return;
1376
1377	case CHAN_OP_START:
1378		/* Unsetup prior USB transfers, if any. */
1379		usbd_transfer_unsetup(chan->xfer, UAUDIO_NCHANBUFS + 1);
1380		break;
1381
1382	default:
1383		return;
1384	}
1385
1386	mtx_lock(chan->pcm_mtx);
1387	next_alt = chan->set_alt;
1388	mtx_unlock(chan->pcm_mtx);
1389
1390	chan_alt = chan->usb_alt + next_alt;
1391
1392	err = usbd_set_alt_interface_index(sc->sc_udev,
1393	    chan_alt->iface_index, chan_alt->iface_alt_index);
1394	if (err) {
1395		DPRINTF("setting of alternate index failed: %s!\n",
1396		    usbd_errstr(err));
1397		goto error;
1398	}
1399
1400	/*
1401	 * Only set the sample rate if the channel reports that it
1402	 * supports the frequency control.
1403	 */
1404
1405	if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
1406		/* FALLTHROUGH */
1407	} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
1408		unsigned int x;
1409
1410		for (x = 0; x != 256; x++) {
1411			if (dir == PCMDIR_PLAY) {
1412				if (!(sc->sc_mixer_clocks.bit_output[x / 8] &
1413				    (1 << (x % 8)))) {
1414					continue;
1415				}
1416			} else {
1417				if (!(sc->sc_mixer_clocks.bit_input[x / 8] &
1418				    (1 << (x % 8)))) {
1419					continue;
1420				}
1421			}
1422
1423			if (uaudio20_set_speed(sc->sc_udev,
1424			    sc->sc_mixer_iface_no, x, chan_alt->sample_rate)) {
1425				/*
1426				 * If the endpoint is adaptive setting
1427				 * the speed may fail.
1428				 */
1429				DPRINTF("setting of sample rate failed! "
1430				    "(continuing anyway)\n");
1431			}
1432		}
1433	} else if (chan_alt->p_sed.v1->bmAttributes & UA_SED_FREQ_CONTROL) {
1434		if (uaudio_set_speed(sc->sc_udev,
1435		    chan_alt->p_ed1->bEndpointAddress, chan_alt->sample_rate)) {
1436			/*
1437			 * If the endpoint is adaptive setting the
1438			 * speed may fail.
1439			 */
1440			DPRINTF("setting of sample rate failed! "
1441			    "(continuing anyway)\n");
1442		}
1443	}
1444	if (usbd_transfer_setup(sc->sc_udev, &chan_alt->iface_index, chan->xfer,
1445	    chan_alt->usb_cfg, UAUDIO_NCHANBUFS + 1, chan, chan->pcm_mtx)) {
1446		DPRINTF("could not allocate USB transfers!\n");
1447		goto error;
1448	}
1449
1450	fps = usbd_get_isoc_fps(sc->sc_udev);
1451
1452	if (fps < 8000) {
1453		/* FULL speed USB */
1454		frames = uaudio_buffer_ms;
1455	} else {
1456		/* HIGH speed USB */
1457		frames = uaudio_buffer_ms * 8;
1458	}
1459
1460	fps_shift = usbd_xfer_get_fps_shift(chan->xfer[0]);
1461
1462	/* down shift number of frames per second, if any */
1463	fps >>= fps_shift;
1464	frames >>= fps_shift;
1465
1466	/* bytes per frame should not be zero */
1467	chan->bytes_per_frame[0] =
1468	    ((chan_alt->sample_rate / fps) * chan_alt->sample_size);
1469	chan->bytes_per_frame[1] = howmany(chan_alt->sample_rate, fps) *
1470	    chan_alt->sample_size;
1471
1472	/* setup data rate dithering, if any */
1473	chan->frames_per_second = fps;
1474	chan->sample_rem = chan_alt->sample_rate % fps;
1475	chan->sample_curr = 0;
1476
1477	/* compute required buffer size */
1478	buf_size = (chan->bytes_per_frame[1] * frames);
1479
1480	if (buf_size > (chan->end - chan->start)) {
1481		DPRINTF("buffer size is too big\n");
1482		goto error;
1483	}
1484
1485	chan->intr_frames = frames;
1486
1487	DPRINTF("fps=%d sample_rem=%d\n", (int)fps, (int)chan->sample_rem);
1488
1489	if (chan->intr_frames == 0) {
1490		DPRINTF("frame shift is too high!\n");
1491		goto error;
1492	}
1493
1494#if (UAUDIO_NCHANBUFS != 2)
1495#error "Please update code below!"
1496#endif
1497
1498	mtx_lock(chan->pcm_mtx);
1499	chan->cur_alt = next_alt;
1500	usbd_transfer_start(chan->xfer[0]);
1501	usbd_transfer_start(chan->xfer[1]);
1502	mtx_unlock(chan->pcm_mtx);
1503	return;
1504error:
1505	usbd_transfer_unsetup(chan->xfer, UAUDIO_NCHANBUFS + 1);
1506
1507	mtx_lock(chan->pcm_mtx);
1508	chan->cur_alt = CHAN_MAX_ALT;
1509	mtx_unlock(chan->pcm_mtx);
1510}
1511
1512static void
1513uaudio_configure_msg(struct usb_proc_msg *pm)
1514{
1515	struct uaudio_softc *sc = ((struct uaudio_configure_msg *)pm)->sc;
1516	unsigned i;
1517
1518	usb_proc_explore_unlock(sc->sc_udev);
1519	for (i = 0; i != UAUDIO_MAX_CHILD; i++) {
1520		uaudio_configure_msg_sub(sc, &sc->sc_play_chan[i], PCMDIR_PLAY);
1521		uaudio_configure_msg_sub(sc, &sc->sc_rec_chan[i], PCMDIR_REC);
1522	}
1523	usb_proc_explore_lock(sc->sc_udev);
1524}
1525
1526/*========================================================================*
1527 * AS - Audio Stream - routines
1528 *========================================================================*/
1529
1530#ifdef USB_DEBUG
1531static void
1532uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed)
1533{
1534	if (ed) {
1535		DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n"
1536		    "bEndpointAddress=%d bmAttributes=0x%x \n"
1537		    "wMaxPacketSize=%d bInterval=%d \n"
1538		    "bRefresh=%d bSynchAddress=%d\n",
1539		    ed, ed->bLength, ed->bDescriptorType,
1540		    ed->bEndpointAddress, ed->bmAttributes,
1541		    UGETW(ed->wMaxPacketSize), ed->bInterval,
1542		    UEP_HAS_REFRESH(ed) ? ed->bRefresh : 0,
1543		    UEP_HAS_SYNCADDR(ed) ? ed->bSynchAddress : 0);
1544	}
1545}
1546
1547#endif
1548
1549/*
1550 * The following is a workaround for broken no-name USB audio devices
1551 * sold by dealextreme called "3D sound". The problem is that the
1552 * manufacturer computed wMaxPacketSize is too small to hold the
1553 * actual data sent. In other words the device sometimes sends more
1554 * data than it actually reports it can send in a single isochronous
1555 * packet.
1556 */
1557static void
1558uaudio_record_fix_fs(usb_endpoint_descriptor_audio_t *ep,
1559    uint32_t xps, uint32_t add)
1560{
1561	uint32_t mps;
1562
1563	mps = UGETW(ep->wMaxPacketSize);
1564
1565	/*
1566	 * If the device indicates it can send more data than what the
1567	 * sample rate indicates, we apply the workaround.
1568	 */
1569	if (mps > xps) {
1570
1571		/* allow additional data */
1572		xps += add;
1573
1574		/* check against the maximum USB 1.x length */
1575		if (xps > 1023)
1576			xps = 1023;
1577
1578		/* check if we should do an update */
1579		if (mps < xps) {
1580			/* simply update the wMaxPacketSize field */
1581			USETW(ep->wMaxPacketSize, xps);
1582			DPRINTF("Workaround: Updated wMaxPacketSize "
1583			    "from %d to %d bytes.\n",
1584			    (int)mps, (int)xps);
1585		}
1586	}
1587}
1588
1589static usb_error_t
1590uaudio20_check_rate(struct usb_device *udev, uint8_t iface_no,
1591    uint8_t clockid, uint32_t rate)
1592{
1593	struct usb_device_request req;
1594	usb_error_t error;
1595#define	UAUDIO20_MAX_RATES 32	/* we support at maxium 32 rates */
1596	uint8_t data[2 + UAUDIO20_MAX_RATES * 12];
1597	uint16_t actlen;
1598	uint16_t rates;
1599	uint16_t x;
1600
1601	DPRINTFN(6, "ifaceno=%d clockid=%d rate=%u\n",
1602	    iface_no, clockid, rate);
1603
1604	req.bmRequestType = UT_READ_CLASS_INTERFACE;
1605	req.bRequest = UA20_CS_RANGE;
1606	USETW2(req.wValue, UA20_CS_SAM_FREQ_CONTROL, 0);
1607	USETW2(req.wIndex, clockid, iface_no);
1608	/*
1609	 * Assume there is at least one rate to begin with, else some
1610	 * devices might refuse to return the USB descriptor:
1611	 */
1612	USETW(req.wLength, (2 + 1 * 12));
1613
1614	error = usbd_do_request_flags(udev, NULL, &req, data,
1615	    USB_SHORT_XFER_OK, &actlen, USB_DEFAULT_TIMEOUT);
1616
1617	if (error != 0 || actlen < 2) {
1618		/*
1619		 * Likely the descriptor doesn't fit into the supplied
1620		 * buffer. Try using a larger buffer and see if that
1621		 * helps:
1622		 */
1623		rates = MIN(UAUDIO20_MAX_RATES, (255 - 2) / 12);
1624		error = USB_ERR_INVAL;
1625	} else {
1626		rates = UGETW(data);
1627
1628		if (rates > UAUDIO20_MAX_RATES) {
1629			DPRINTF("Too many rates truncating to %d\n", UAUDIO20_MAX_RATES);
1630			rates = UAUDIO20_MAX_RATES;
1631			error = USB_ERR_INVAL;
1632		} else if (rates > 1) {
1633			DPRINTF("Need to read full rate descriptor\n");
1634			error = USB_ERR_INVAL;
1635		}
1636	}
1637
1638	if (error != 0) {
1639		/*
1640		 * Try to read full rate descriptor.
1641		 */
1642		actlen = (2 + rates * 12);
1643
1644		USETW(req.wLength, actlen);
1645
1646	        error = usbd_do_request_flags(udev, NULL, &req, data,
1647		    USB_SHORT_XFER_OK, &actlen, USB_DEFAULT_TIMEOUT);
1648
1649		if (error != 0 || actlen < 2)
1650			return (USB_ERR_INVAL);
1651
1652		rates = UGETW(data);
1653	}
1654
1655	actlen = (actlen - 2) / 12;
1656
1657	if (rates > actlen) {
1658		DPRINTF("Too many rates truncating to %d\n", actlen);
1659		rates = actlen;
1660	}
1661
1662	for (x = 0; x != rates; x++) {
1663		uint32_t min = UGETDW(data + 2 + (12 * x));
1664		uint32_t max = UGETDW(data + 6 + (12 * x));
1665		uint32_t res = UGETDW(data + 10 + (12 * x));
1666
1667		if (res == 0) {
1668			DPRINTF("Zero residue\n");
1669			res = 1;
1670		}
1671
1672		if (min > max) {
1673			DPRINTF("Swapped max and min\n");
1674			uint32_t temp;
1675			temp = min;
1676			min = max;
1677			max = temp;
1678		}
1679
1680		if (rate >= min && rate <= max &&
1681		    (((rate - min) % res) == 0)) {
1682			return (0);
1683		}
1684	}
1685	return (USB_ERR_INVAL);
1686}
1687
1688static struct uaudio_chan *
1689uaudio_get_chan(struct uaudio_softc *sc, struct uaudio_chan *chan,
1690    uint8_t iface_index)
1691{
1692	unsigned i;
1693
1694	for (i = 0; i != UAUDIO_MAX_CHILD; i++, chan++) {
1695		if (chan->num_alt == 0) {
1696			chan->iface_index = iface_index;
1697			return (chan);
1698		} else if (chan->iface_index == iface_index)
1699			return (chan);
1700	}
1701	return (NULL);
1702}
1703
1704static void
1705uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev,
1706    uint32_t rate, uint8_t channels, uint8_t bit_resolution)
1707{
1708	struct usb_descriptor *desc = NULL;
1709	union uaudio_asid asid = { NULL };
1710	union uaudio_asf1d asf1d = { NULL };
1711	union uaudio_sed sed = { NULL };
1712	struct usb_midi_streaming_endpoint_descriptor *msid = NULL;
1713	usb_endpoint_descriptor_audio_t *ed1 = NULL;
1714	const struct usb_audio_control_descriptor *acdp = NULL;
1715	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
1716	struct usb_interface_descriptor *id;
1717	const struct uaudio_format *p_fmt = NULL;
1718	struct uaudio_chan *chan;
1719	struct uaudio_chan_alt *chan_alt;
1720	uint32_t format;
1721	uint16_t curidx = 0xFFFF;
1722	uint16_t lastidx = 0xFFFF;
1723	uint16_t alt_index = 0;
1724	uint16_t audio_rev = 0;
1725	uint16_t x;
1726	uint8_t ep_dir;
1727	uint8_t bChannels;
1728	uint8_t bBitResolution;
1729	uint8_t audio_if = 0;
1730	uint8_t midi_if = 0;
1731	uint8_t uma_if_class;
1732
1733	while ((desc = usb_desc_foreach(cd, desc))) {
1734
1735		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
1736		    (desc->bLength >= sizeof(*id))) {
1737
1738			id = (void *)desc;
1739
1740			if (id->bInterfaceNumber != lastidx) {
1741				lastidx = id->bInterfaceNumber;
1742				curidx++;
1743				alt_index = 0;
1744
1745			} else {
1746				alt_index++;
1747			}
1748
1749			if ((!(sc->sc_hid.flags & UAUDIO_HID_VALID)) &&
1750			    (id->bInterfaceClass == UICLASS_HID) &&
1751			    (id->bInterfaceSubClass == 0) &&
1752			    (id->bInterfaceProtocol == 0) &&
1753			    (alt_index == 0) &&
1754			    usbd_get_iface(udev, curidx) != NULL) {
1755				DPRINTF("Found HID interface at %d\n",
1756				    curidx);
1757				sc->sc_hid.flags |= UAUDIO_HID_VALID;
1758				sc->sc_hid.iface_index = curidx;
1759			}
1760
1761			uma_if_class =
1762			    ((id->bInterfaceClass == UICLASS_AUDIO) ||
1763			    ((id->bInterfaceClass == UICLASS_VENDOR) &&
1764			    (sc->sc_uq_au_vendor_class != 0)));
1765
1766			if ((uma_if_class != 0) &&
1767			    (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) {
1768				audio_if = 1;
1769			} else {
1770				audio_if = 0;
1771			}
1772
1773			if ((uma_if_class != 0) &&
1774			    (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) {
1775
1776				/*
1777				 * XXX could allow multiple MIDI interfaces
1778				 */
1779				midi_if = 1;
1780
1781				if ((sc->sc_midi_chan.valid == 0) &&
1782				    (usbd_get_iface(udev, curidx) != NULL)) {
1783					sc->sc_midi_chan.iface_index = curidx;
1784					sc->sc_midi_chan.iface_alt_index = alt_index;
1785					sc->sc_midi_chan.valid = 1;
1786				}
1787			} else {
1788				midi_if = 0;
1789			}
1790			asid.v1 = NULL;
1791			asf1d.v1 = NULL;
1792			ed1 = NULL;
1793			sed.v1 = NULL;
1794
1795			/*
1796			 * There can only be one USB audio instance
1797			 * per USB device. Grab all USB audio
1798			 * interfaces on this USB device so that we
1799			 * don't attach USB audio twice:
1800			 */
1801			if (alt_index == 0 && curidx != sc->sc_mixer_iface_index &&
1802			    (id->bInterfaceClass == UICLASS_AUDIO || audio_if != 0 ||
1803			    midi_if != 0)) {
1804				usbd_set_parent_iface(sc->sc_udev, curidx,
1805				    sc->sc_mixer_iface_index);
1806			}
1807		}
1808
1809		if (audio_if == 0) {
1810			if (midi_if == 0) {
1811				if ((acdp == NULL) &&
1812				    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1813				    (desc->bDescriptorSubtype == UDESCSUB_AC_HEADER) &&
1814				    (desc->bLength >= sizeof(*acdp))) {
1815					acdp = (void *)desc;
1816					audio_rev = UGETW(acdp->bcdADC);
1817				}
1818			} else {
1819				msid = (void *)desc;
1820
1821				/* get the maximum number of embedded jacks in use, if any */
1822				if (msid->bLength >= sizeof(*msid) &&
1823				    msid->bDescriptorType == UDESC_CS_ENDPOINT &&
1824				    msid->bDescriptorSubtype == MS_GENERAL &&
1825				    msid->bNumEmbMIDIJack > sc->sc_midi_chan.max_emb_jack) {
1826					sc->sc_midi_chan.max_emb_jack = msid->bNumEmbMIDIJack;
1827				}
1828			}
1829			/*
1830			 * Don't collect any USB audio descriptors if
1831			 * this is not an USB audio stream interface.
1832			 */
1833			continue;
1834		}
1835
1836		if ((acdp != NULL || sc->sc_uq_au_vendor_class != 0) &&
1837		    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1838		    (desc->bDescriptorSubtype == AS_GENERAL) &&
1839		    (asid.v1 == NULL)) {
1840			if (audio_rev >= UAUDIO_VERSION_30) {
1841				/* FALLTHROUGH */
1842			} else if (audio_rev >= UAUDIO_VERSION_20) {
1843				if (desc->bLength >= sizeof(*asid.v2)) {
1844					asid.v2 = (void *)desc;
1845				}
1846			} else {
1847				if (desc->bLength >= sizeof(*asid.v1)) {
1848					asid.v1 = (void *)desc;
1849				}
1850			}
1851		}
1852		if ((acdp != NULL || sc->sc_uq_au_vendor_class != 0) &&
1853		    (desc->bDescriptorType == UDESC_CS_INTERFACE) &&
1854		    (desc->bDescriptorSubtype == FORMAT_TYPE) &&
1855		    (asf1d.v1 == NULL)) {
1856			if (audio_rev >= UAUDIO_VERSION_30) {
1857				/* FALLTHROUGH */
1858			} else if (audio_rev >= UAUDIO_VERSION_20) {
1859				if (desc->bLength >= sizeof(*asf1d.v2))
1860					asf1d.v2 = (void *)desc;
1861			} else {
1862				if (desc->bLength >= sizeof(*asf1d.v1)) {
1863					asf1d.v1 = (void *)desc;
1864
1865					if (asf1d.v1->bFormatType != FORMAT_TYPE_I) {
1866						DPRINTFN(11, "ignored bFormatType = %d\n",
1867						    asf1d.v1->bFormatType);
1868						asf1d.v1 = NULL;
1869						continue;
1870					}
1871					if (desc->bLength < (sizeof(*asf1d.v1) +
1872					    ((asf1d.v1->bSamFreqType == 0) ? 6 :
1873					    (asf1d.v1->bSamFreqType * 3)))) {
1874						DPRINTFN(11, "invalid descriptor, "
1875						    "too short\n");
1876						asf1d.v1 = NULL;
1877						continue;
1878					}
1879				}
1880			}
1881		}
1882		if ((desc->bDescriptorType == UDESC_ENDPOINT) &&
1883		    (desc->bLength >= UEP_MINSIZE) &&
1884		    (ed1 == NULL)) {
1885			ed1 = (void *)desc;
1886			if (UE_GET_XFERTYPE(ed1->bmAttributes) != UE_ISOCHRONOUS) {
1887				ed1 = NULL;
1888				continue;
1889			}
1890		}
1891		if ((acdp != NULL || sc->sc_uq_au_vendor_class != 0) &&
1892		    (desc->bDescriptorType == UDESC_CS_ENDPOINT) &&
1893		    (desc->bDescriptorSubtype == AS_GENERAL) &&
1894		    (sed.v1 == NULL)) {
1895			if (audio_rev >= UAUDIO_VERSION_30) {
1896				/* FALLTHROUGH */
1897			} else if (audio_rev >= UAUDIO_VERSION_20) {
1898				if (desc->bLength >= sizeof(*sed.v2))
1899					sed.v2 = (void *)desc;
1900			} else {
1901				if (desc->bLength >= sizeof(*sed.v1))
1902					sed.v1 = (void *)desc;
1903			}
1904		}
1905		if (asid.v1 == NULL || asf1d.v1 == NULL ||
1906		    ed1 == NULL || sed.v1 == NULL) {
1907			/* need more descriptors */
1908			continue;
1909		}
1910
1911		ep_dir = UE_GET_DIR(ed1->bEndpointAddress);
1912
1913		/* We ignore sync endpoint information until further. */
1914
1915		if (audio_rev >= UAUDIO_VERSION_30) {
1916			goto next_ep;
1917		} else if (audio_rev >= UAUDIO_VERSION_20) {
1918
1919			uint32_t dwFormat;
1920
1921			dwFormat = UGETDW(asid.v2->bmFormats);
1922			bChannels = asid.v2->bNrChannels;
1923			bBitResolution = asf1d.v2->bSubslotSize * 8;
1924
1925			if ((bChannels != channels) ||
1926			    (bBitResolution != bit_resolution)) {
1927				DPRINTF("Wrong number of channels\n");
1928				goto next_ep;
1929			}
1930
1931			for (p_fmt = uaudio20_formats;
1932			    p_fmt->wFormat != 0; p_fmt++) {
1933				if ((p_fmt->wFormat & dwFormat) &&
1934				    (p_fmt->bPrecision == bBitResolution))
1935					break;
1936			}
1937
1938			if (p_fmt->wFormat == 0) {
1939				DPRINTF("Unsupported audio format\n");
1940				goto next_ep;
1941			}
1942
1943			for (x = 0; x != 256; x++) {
1944				if (ep_dir == UE_DIR_OUT) {
1945					if (!(sc->sc_mixer_clocks.bit_output[x / 8] &
1946					    (1 << (x % 8)))) {
1947						continue;
1948					}
1949				} else {
1950					if (!(sc->sc_mixer_clocks.bit_input[x / 8] &
1951					    (1 << (x % 8)))) {
1952						continue;
1953					}
1954				}
1955
1956				DPRINTF("Checking clock ID=%d\n", x);
1957
1958				if (uaudio20_check_rate(udev,
1959				    sc->sc_mixer_iface_no, x, rate)) {
1960					DPRINTF("Unsupported sampling "
1961					    "rate, id=%d\n", x);
1962					goto next_ep;
1963				}
1964			}
1965		} else {
1966			uint16_t wFormat;
1967
1968			wFormat = UGETW(asid.v1->wFormatTag);
1969			bChannels = UAUDIO_MAX_CHAN(asf1d.v1->bNrChannels);
1970			bBitResolution = asf1d.v1->bSubFrameSize * 8;
1971
1972			if (asf1d.v1->bSamFreqType == 0) {
1973				DPRINTFN(16, "Sample rate: %d-%dHz\n",
1974				    UA_SAMP_LO(asf1d.v1),
1975				    UA_SAMP_HI(asf1d.v1));
1976
1977				if ((rate >= UA_SAMP_LO(asf1d.v1)) &&
1978				    (rate <= UA_SAMP_HI(asf1d.v1)))
1979					goto found_rate;
1980			} else {
1981
1982				for (x = 0; x < asf1d.v1->bSamFreqType; x++) {
1983					DPRINTFN(16, "Sample rate = %dHz\n",
1984					    UA_GETSAMP(asf1d.v1, x));
1985
1986					if (rate == UA_GETSAMP(asf1d.v1, x))
1987						goto found_rate;
1988				}
1989			}
1990			goto next_ep;
1991
1992	found_rate:
1993			for (p_fmt = uaudio10_formats;
1994			    p_fmt->wFormat != 0; p_fmt++) {
1995				if ((p_fmt->wFormat == wFormat) &&
1996				    (p_fmt->bPrecision == bBitResolution))
1997					break;
1998			}
1999			if (p_fmt->wFormat == 0) {
2000				DPRINTF("Unsupported audio format\n");
2001				goto next_ep;
2002			}
2003
2004			if ((bChannels != channels) ||
2005			    (bBitResolution != bit_resolution)) {
2006				DPRINTF("Wrong number of channels\n");
2007				goto next_ep;
2008			}
2009		}
2010
2011		chan = uaudio_get_chan(sc, (ep_dir == UE_DIR_OUT) ? &sc->sc_play_chan[0] :
2012		    &sc->sc_rec_chan[0], curidx);
2013		if (chan == NULL) {
2014			DPRINTF("More than %d sub devices. (skipped)\n", UAUDIO_MAX_CHILD);
2015			goto next_ep;
2016		}
2017
2018		if (usbd_get_iface(udev, curidx) == NULL) {
2019			DPRINTF("Interface is not valid\n");
2020			goto next_ep;
2021		}
2022		if (chan->num_alt == CHAN_MAX_ALT) {
2023			DPRINTF("Too many alternate settings\n");
2024			goto next_ep;
2025		}
2026		chan->set_alt = 0;
2027		chan->cur_alt = CHAN_MAX_ALT;
2028
2029		chan_alt = &chan->usb_alt[chan->num_alt++];
2030
2031#ifdef USB_DEBUG
2032		uaudio_chan_dump_ep_desc(ed1);
2033#endif
2034		DPRINTF("Sample rate = %dHz, channels = %d, "
2035		    "bits = %d, format = %s, ep 0x%02x, chan %p\n", rate, channels,
2036		    bit_resolution, p_fmt->description, ed1->bEndpointAddress, chan);
2037
2038		chan_alt->sample_rate = rate;
2039		chan_alt->p_asf1d = asf1d;
2040		chan_alt->p_ed1 = ed1;
2041		chan_alt->p_fmt = p_fmt;
2042		chan_alt->p_sed = sed;
2043		chan_alt->iface_index = curidx;
2044		chan_alt->iface_alt_index = alt_index;
2045
2046		if (ep_dir == UE_DIR_IN)
2047			chan_alt->usb_cfg = uaudio_cfg_record;
2048		else
2049			chan_alt->usb_cfg = uaudio_cfg_play;
2050
2051		chan_alt->sample_size = (UAUDIO_MAX_CHAN(channels) *
2052		    p_fmt->bPrecision) / 8;
2053		chan_alt->channels = channels;
2054
2055		if (ep_dir == UE_DIR_IN &&
2056		    usbd_get_speed(udev) == USB_SPEED_FULL) {
2057			uaudio_record_fix_fs(ed1,
2058			    chan_alt->sample_size * (rate / 1000),
2059			    chan_alt->sample_size * (rate / 4000));
2060		}
2061
2062		/* setup play/record format */
2063
2064		format = chan_alt->p_fmt->freebsd_fmt;
2065
2066		/* get default SND_FORMAT() */
2067		format = SND_FORMAT(format, chan_alt->channels, 0);
2068
2069		switch (chan_alt->channels) {
2070		uint32_t temp_fmt;
2071		case 1:
2072		case 2:
2073			/* mono and stereo */
2074			break;
2075		default:
2076			/* surround and more */
2077			temp_fmt = feeder_matrix_default_format(format);
2078			/* if multichannel, then format can be zero */
2079			if (temp_fmt != 0)
2080				format = temp_fmt;
2081			break;
2082		}
2083
2084		/* check if format is not supported */
2085		if (format == 0) {
2086			DPRINTF("The selected audio format is not supported\n");
2087			chan->num_alt--;
2088			goto next_ep;
2089		}
2090		if (chan->num_alt > 1) {
2091			/* we only accumulate one format at different sample rates */
2092			if (chan->pcm_format[0] != format) {
2093				DPRINTF("Multiple formats is not supported\n");
2094				chan->num_alt--;
2095				goto next_ep;
2096			}
2097			/* ignore if duplicate sample rate entry */
2098			if (rate == chan->usb_alt[chan->num_alt - 2].sample_rate) {
2099				DPRINTF("Duplicate sample rate detected\n");
2100				chan->num_alt--;
2101				goto next_ep;
2102			}
2103		}
2104		chan->pcm_cap.fmtlist = chan->pcm_format;
2105		chan->pcm_cap.fmtlist[0] = format;
2106
2107		/* check if device needs bitperfect */
2108		if (chan_alt->channels > UAUDIO_MATRIX_MAX)
2109			sc->sc_pcm_bitperfect = 1;
2110
2111		if (rate < chan->pcm_cap.minspeed || chan->pcm_cap.minspeed == 0)
2112			chan->pcm_cap.minspeed = rate;
2113		if (rate > chan->pcm_cap.maxspeed || chan->pcm_cap.maxspeed == 0)
2114			chan->pcm_cap.maxspeed = rate;
2115
2116		if (sc->sc_sndstat_valid != 0) {
2117			sbuf_printf(&sc->sc_sndstat, "\n\t"
2118			    "mode %d.%d:(%s) %dch, %dbit, %s, %dHz",
2119			    curidx, alt_index,
2120			    (ep_dir == UE_DIR_IN) ? "input" : "output",
2121				    channels, p_fmt->bPrecision,
2122				    p_fmt->description, rate);
2123		}
2124
2125	next_ep:
2126		sed.v1 = NULL;
2127		ed1 = NULL;
2128	}
2129}
2130
2131/* This structure defines all the supported rates. */
2132
2133static const uint32_t uaudio_rate_list[CHAN_MAX_ALT] = {
2134	384000,
2135	352800,
2136	192000,
2137	176400,
2138	96000,
2139	88200,
2140	88000,
2141	80000,
2142	72000,
2143	64000,
2144	56000,
2145	48000,
2146	44100,
2147	40000,
2148	32000,
2149	24000,
2150	22050,
2151	16000,
2152	11025,
2153	8000,
2154	0
2155};
2156
2157static void
2158uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev)
2159{
2160	uint32_t rate = uaudio_default_rate;
2161	uint8_t z;
2162	uint8_t bits = uaudio_default_bits;
2163	uint8_t y;
2164	uint8_t channels = uaudio_default_channels;
2165	uint8_t x;
2166
2167	bits -= (bits % 8);
2168	if ((bits == 0) || (bits > 32)) {
2169		/* set a valid value */
2170		bits = 32;
2171	}
2172	if (channels == 0) {
2173		switch (usbd_get_speed(udev)) {
2174		case USB_SPEED_LOW:
2175		case USB_SPEED_FULL:
2176			/*
2177			 * Due to high bandwidth usage and problems
2178			 * with HIGH-speed split transactions we
2179			 * disable surround setups on FULL-speed USB
2180			 * by default
2181			 */
2182			channels = 4;
2183			break;
2184		default:
2185			channels = UAUDIO_CHANNELS_MAX;
2186			break;
2187		}
2188	} else if (channels > UAUDIO_CHANNELS_MAX)
2189		channels = UAUDIO_CHANNELS_MAX;
2190
2191	if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND))
2192		sc->sc_sndstat_valid = 1;
2193
2194	/* try to search for a valid config */
2195
2196	for (x = channels; x; x--) {
2197		for (y = bits; y; y -= 8) {
2198
2199			/* try user defined rate, if any */
2200			if (rate != 0)
2201				uaudio_chan_fill_info_sub(sc, udev, rate, x, y);
2202
2203			/* try find a matching rate, if any */
2204			for (z = 0; uaudio_rate_list[z]; z++)
2205				uaudio_chan_fill_info_sub(sc, udev, uaudio_rate_list[z], x, y);
2206		}
2207	}
2208	if (sc->sc_sndstat_valid)
2209		sbuf_finish(&sc->sc_sndstat);
2210}
2211
2212static void
2213uaudio_chan_play_sync_callback(struct usb_xfer *xfer, usb_error_t error)
2214{
2215	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
2216	struct usb_page_cache *pc;
2217	uint64_t sample_rate;
2218	uint8_t buf[4];
2219	uint64_t temp;
2220	unsigned i;
2221	int len;
2222	int actlen;
2223	int nframes;
2224
2225	usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
2226
2227	i = uaudio_get_child_index_by_chan(ch->priv_sc, ch);
2228
2229	switch (USB_GET_STATE(xfer)) {
2230	case USB_ST_TRANSFERRED:
2231
2232		DPRINTFN(6, "transferred %d bytes\n", actlen);
2233
2234		if (nframes == 0)
2235			break;
2236		len = usbd_xfer_frame_len(xfer, 0);
2237		if (len == 0)
2238			break;
2239		if (len > sizeof(buf))
2240			len = sizeof(buf);
2241
2242		memset(buf, 0, sizeof(buf));
2243
2244		pc = usbd_xfer_get_frame(xfer, 0);
2245		usbd_copy_out(pc, 0, buf, len);
2246
2247		temp = UGETDW(buf);
2248
2249		DPRINTF("Value = 0x%08x\n", (int)temp);
2250
2251		/* auto-detect SYNC format */
2252
2253		if (len == 4)
2254			temp &= 0x0fffffff;
2255
2256		/* check for no data */
2257
2258		if (temp == 0)
2259			break;
2260
2261		temp *= 125ULL;
2262
2263		sample_rate = ch->usb_alt[ch->cur_alt].sample_rate;
2264
2265		/* auto adjust */
2266		while (temp < (sample_rate - (sample_rate / 4)))
2267			temp *= 2;
2268
2269		while (temp > (sample_rate + (sample_rate / 2)))
2270			temp /= 2;
2271
2272		DPRINTF("Comparing %d Hz :: %d Hz\n",
2273		    (int)temp, (int)sample_rate);
2274
2275		/*
2276		 * Use feedback value as fallback when there is no
2277		 * recording channel:
2278		 */
2279		if (ch->priv_sc->sc_rec_chan[i].num_alt == 0) {
2280			int32_t jitter_max = howmany(sample_rate, 16000);
2281
2282			/*
2283			 * Range check the jitter values to avoid
2284			 * bogus sample rate adjustments. The expected
2285			 * deviation should not be more than 1Hz per
2286			 * second. The USB v2.0 specification also
2287			 * mandates this requirement. Refer to chapter
2288			 * 5.12.4.2 about feedback.
2289			 */
2290			ch->jitter_curr = temp - sample_rate;
2291			if (ch->jitter_curr > jitter_max)
2292				ch->jitter_curr = jitter_max;
2293			else if (ch->jitter_curr < -jitter_max)
2294				ch->jitter_curr = -jitter_max;
2295		}
2296		ch->feedback_rate = temp;
2297		break;
2298
2299	case USB_ST_SETUP:
2300		/*
2301		 * Check if the recording stream can be used as a
2302		 * source of jitter information to save some
2303		 * isochronous bandwidth:
2304		 */
2305		if (ch->priv_sc->sc_rec_chan[i].num_alt != 0 &&
2306		    uaudio_debug == 0)
2307			break;
2308		usbd_xfer_set_frames(xfer, 1);
2309		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_framelen(xfer));
2310		usbd_transfer_submit(xfer);
2311		break;
2312
2313	default:			/* Error */
2314		break;
2315	}
2316}
2317
2318static int
2319uaudio_chan_is_async(struct uaudio_chan *ch, uint8_t alt)
2320{
2321	uint8_t attr = ch->usb_alt[alt].p_ed1->bmAttributes;
2322	return (UE_GET_ISO_TYPE(attr) == UE_ISO_ASYNC);
2323}
2324
2325static void
2326uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error)
2327{
2328	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
2329	struct uaudio_chan *ch_rec;
2330	struct usb_page_cache *pc;
2331	uint32_t mfl;
2332	uint32_t total;
2333	uint32_t blockcount;
2334	uint32_t n;
2335	uint32_t offset;
2336	unsigned i;
2337	int sample_size;
2338	int actlen;
2339	int sumlen;
2340
2341	if (ch->running == 0 || ch->start == ch->end) {
2342		DPRINTF("not running or no buffer!\n");
2343		return;
2344	}
2345
2346	i = uaudio_get_child_index_by_chan(ch->priv_sc, ch);
2347
2348	/* check if there is a valid record channel */
2349	ch_rec = ch->priv_sc->sc_rec_chan + i;
2350
2351	if (ch_rec->num_alt == 0)
2352		ch_rec = NULL;
2353
2354	usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
2355
2356	switch (USB_GET_STATE(xfer)) {
2357	case USB_ST_SETUP:
2358tr_setup:
2359		if (ch_rec != NULL) {
2360			/*
2361			 * NOTE: The play and record callbacks are
2362			 * executed from the same USB thread and
2363			 * locking the record channel mutex here is
2364			 * not needed. This avoids a LOR situation.
2365			 */
2366
2367			/* reset receive jitter counters */
2368			ch_rec->jitter_curr = 0;
2369			ch_rec->jitter_rem = 0;
2370		}
2371
2372		/* reset transmit jitter counters */
2373		ch->jitter_curr = 0;
2374		ch->jitter_rem = 0;
2375
2376		/* FALLTHROUGH */
2377	case USB_ST_TRANSFERRED:
2378		if (actlen < sumlen) {
2379			DPRINTF("short transfer, "
2380			    "%d of %d bytes\n", actlen, sumlen);
2381		}
2382		chn_intr(ch->pcm_ch);
2383
2384		/*
2385		 * Check for asynchronous playback endpoint and that
2386		 * the playback endpoint is properly configured:
2387		 */
2388		if (ch_rec != NULL &&
2389		    uaudio_chan_is_async(ch, ch->cur_alt) != 0) {
2390			uint32_t rec_alt = ch_rec->cur_alt;
2391			if (rec_alt < ch_rec->num_alt) {
2392				int64_t tx_jitter;
2393				int64_t rx_rate;
2394				/*
2395				 * NOTE: The play and record callbacks
2396				 * are executed from the same USB
2397				 * thread and locking the record
2398				 * channel mutex here is not needed.
2399				 * This avoids a LOR situation.
2400				 */
2401
2402				/* translate receive jitter into transmit jitter */
2403				tx_jitter = ch->usb_alt[ch->cur_alt].sample_rate;
2404				tx_jitter = (tx_jitter * ch_rec->jitter_curr) +
2405				    ch->jitter_rem;
2406
2407				/* reset receive jitter counters */
2408				ch_rec->jitter_curr = 0;
2409				ch_rec->jitter_rem = 0;
2410
2411				/* compute exact number of transmit jitter samples */
2412				rx_rate = ch_rec->usb_alt[rec_alt].sample_rate;
2413				ch->jitter_curr += tx_jitter / rx_rate;
2414				ch->jitter_rem = tx_jitter % rx_rate;
2415			}
2416		}
2417
2418		/* start the SYNC transfer one time per second, if any */
2419		ch->intr_counter += ch->intr_frames;
2420		if (ch->intr_counter >= ch->frames_per_second) {
2421			ch->intr_counter -= ch->frames_per_second;
2422			usbd_transfer_start(ch->xfer[UAUDIO_NCHANBUFS]);
2423		}
2424
2425		mfl = usbd_xfer_max_framelen(xfer);
2426
2427		if (ch->bytes_per_frame[1] > mfl) {
2428			DPRINTF("bytes per transfer, %d, "
2429			    "exceeds maximum, %d!\n",
2430			    ch->bytes_per_frame[1],
2431			    mfl);
2432			break;
2433		}
2434
2435		blockcount = ch->intr_frames;
2436
2437		/* setup number of frames */
2438		usbd_xfer_set_frames(xfer, blockcount);
2439
2440		/* get sample size */
2441		sample_size = ch->usb_alt[ch->cur_alt].sample_size;
2442
2443		/* reset total length */
2444		total = 0;
2445
2446		/* setup frame lengths */
2447		for (n = 0; n != blockcount; n++) {
2448			uint32_t frame_len;
2449
2450			ch->sample_curr += ch->sample_rem;
2451			if (ch->sample_curr >= ch->frames_per_second) {
2452				ch->sample_curr -= ch->frames_per_second;
2453				frame_len = ch->bytes_per_frame[1];
2454			} else {
2455				frame_len = ch->bytes_per_frame[0];
2456			}
2457
2458			/* handle free running clock case */
2459			if (ch->jitter_curr > 0 &&
2460			    (frame_len + sample_size) <= mfl) {
2461				DPRINTFN(6, "sending one sample more\n");
2462				ch->jitter_curr--;
2463				frame_len += sample_size;
2464			} else if (ch->jitter_curr < 0 &&
2465			    frame_len >= sample_size) {
2466				DPRINTFN(6, "sending one sample less\n");
2467				ch->jitter_curr++;
2468				frame_len -= sample_size;
2469			}
2470			usbd_xfer_set_frame_len(xfer, n, frame_len);
2471			total += frame_len;
2472		}
2473
2474		DPRINTFN(6, "transferring %d bytes\n", total);
2475
2476		offset = 0;
2477
2478		pc = usbd_xfer_get_frame(xfer, 0);
2479		while (total > 0) {
2480
2481			n = (ch->end - ch->cur);
2482			if (n > total)
2483				n = total;
2484
2485			usbd_copy_in(pc, offset, ch->cur, n);
2486
2487			total -= n;
2488			ch->cur += n;
2489			offset += n;
2490
2491			if (ch->cur >= ch->end)
2492				ch->cur = ch->start;
2493		}
2494		usbd_transfer_submit(xfer);
2495		break;
2496
2497	default:			/* Error */
2498		if (error != USB_ERR_CANCELLED)
2499			goto tr_setup;
2500		break;
2501	}
2502}
2503
2504static void
2505uaudio_chan_record_sync_callback(struct usb_xfer *xfer, usb_error_t error)
2506{
2507	/* TODO */
2508}
2509
2510static void
2511uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error)
2512{
2513	struct uaudio_chan *ch = usbd_xfer_softc(xfer);
2514	struct usb_page_cache *pc;
2515	uint32_t offset0;
2516	uint32_t mfl;
2517	int m;
2518	int n;
2519	int len;
2520	int actlen;
2521	int nframes;
2522	int expected_bytes;
2523	int sample_size;
2524
2525	if (ch->start == ch->end) {
2526		DPRINTF("no buffer!\n");
2527		return;
2528	}
2529
2530	usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes);
2531	mfl = usbd_xfer_max_framelen(xfer);
2532
2533	switch (USB_GET_STATE(xfer)) {
2534	case USB_ST_TRANSFERRED:
2535
2536		offset0 = 0;
2537		pc = usbd_xfer_get_frame(xfer, 0);
2538
2539		/* try to compute the number of expected bytes */
2540		ch->sample_curr += (ch->sample_rem * ch->intr_frames);
2541
2542		/* compute number of expected bytes */
2543		expected_bytes = (ch->intr_frames * ch->bytes_per_frame[0]) +
2544		    ((ch->sample_curr / ch->frames_per_second) *
2545		    (ch->bytes_per_frame[1] - ch->bytes_per_frame[0]));
2546
2547		/* keep remainder */
2548		ch->sample_curr %= ch->frames_per_second;
2549
2550		/* get current sample size */
2551		sample_size = ch->usb_alt[ch->cur_alt].sample_size;
2552
2553		for (n = 0; n != nframes; n++) {
2554			uint32_t offset1 = offset0;
2555
2556			len = usbd_xfer_frame_len(xfer, n);
2557
2558			/* make sure we only receive complete samples */
2559			len = len - (len % sample_size);
2560
2561			/* subtract bytes received from expected payload */
2562			expected_bytes -= len;
2563
2564			/* don't receive data when not ready */
2565			if (ch->running == 0 || ch->cur_alt != ch->set_alt)
2566				continue;
2567
2568			/* fill ring buffer with samples, if any */
2569			while (len > 0) {
2570
2571				m = (ch->end - ch->cur);
2572
2573				if (m > len)
2574					m = len;
2575
2576				usbd_copy_out(pc, offset1, ch->cur, m);
2577
2578				len -= m;
2579				offset1 += m;
2580				ch->cur += m;
2581
2582				if (ch->cur >= ch->end)
2583					ch->cur = ch->start;
2584			}
2585
2586			offset0 += mfl;
2587		}
2588
2589		/* update current jitter */
2590		ch->jitter_curr -= (expected_bytes / sample_size);
2591
2592		/* don't allow a huge amount of jitter to accumulate */
2593		nframes = 2 * ch->intr_frames;
2594
2595		/* range check current jitter */
2596		if (ch->jitter_curr < -nframes)
2597			ch->jitter_curr = -nframes;
2598		else if (ch->jitter_curr > nframes)
2599			ch->jitter_curr = nframes;
2600
2601		DPRINTFN(6, "transferred %d bytes, jitter %d samples\n",
2602		    actlen, ch->jitter_curr);
2603
2604		if (ch->running != 0)
2605			chn_intr(ch->pcm_ch);
2606
2607	case USB_ST_SETUP:
2608tr_setup:
2609		nframes = ch->intr_frames;
2610
2611		usbd_xfer_set_frames(xfer, nframes);
2612		for (n = 0; n != nframes; n++)
2613			usbd_xfer_set_frame_len(xfer, n, mfl);
2614
2615		usbd_transfer_submit(xfer);
2616		break;
2617
2618	default:			/* Error */
2619		if (error != USB_ERR_CANCELLED)
2620			goto tr_setup;
2621		break;
2622	}
2623}
2624
2625void   *
2626uaudio_chan_init(struct uaudio_chan *ch, struct snd_dbuf *b,
2627    struct pcm_channel *c, int dir)
2628{
2629	uint32_t buf_size;
2630	uint8_t x;
2631
2632	/* store mutex and PCM channel */
2633
2634	ch->pcm_ch = c;
2635	ch->pcm_mtx = c->lock;
2636
2637	/* compute worst case buffer */
2638
2639	buf_size = 0;
2640	for (x = 0; x != ch->num_alt; x++) {
2641		uint32_t temp = uaudio_get_buffer_size(ch, x);
2642		if (temp > buf_size)
2643			buf_size = temp;
2644	}
2645
2646	/* allow double buffering */
2647	buf_size *= 2;
2648
2649	DPRINTF("Worst case buffer is %d bytes\n", (int)buf_size);
2650
2651	ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO);
2652	if (ch->buf == NULL)
2653		goto error;
2654	if (sndbuf_setup(b, ch->buf, buf_size) != 0)
2655		goto error;
2656
2657	ch->start = ch->buf;
2658	ch->end = ch->buf + buf_size;
2659	ch->cur = ch->buf;
2660	ch->pcm_buf = b;
2661	ch->max_buf = buf_size;
2662
2663	if (ch->pcm_mtx == NULL) {
2664		DPRINTF("ERROR: PCM channels does not have a mutex!\n");
2665		goto error;
2666	}
2667	return (ch);
2668
2669error:
2670	uaudio_chan_free(ch);
2671	return (NULL);
2672}
2673
2674int
2675uaudio_chan_free(struct uaudio_chan *ch)
2676{
2677	if (ch->buf != NULL) {
2678		free(ch->buf, M_DEVBUF);
2679		ch->buf = NULL;
2680	}
2681	usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS + 1);
2682
2683	ch->num_alt = 0;
2684
2685	return (0);
2686}
2687
2688int
2689uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize)
2690{
2691	uint32_t temp = 2 * uaudio_get_buffer_size(ch, ch->set_alt);
2692	sndbuf_setup(ch->pcm_buf, ch->buf, temp);
2693	return (temp / 2);
2694}
2695
2696int
2697uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize,
2698    uint32_t blockcount)
2699{
2700	return (1);
2701}
2702
2703int
2704uaudio_chan_set_param_speed(struct uaudio_chan *ch, uint32_t speed)
2705{
2706	struct uaudio_softc *sc;
2707	uint8_t x;
2708
2709	sc = ch->priv_sc;
2710
2711	for (x = 0; x < ch->num_alt; x++) {
2712		if (ch->usb_alt[x].sample_rate < speed) {
2713			/* sample rate is too low */
2714			break;
2715		}
2716	}
2717
2718	if (x != 0)
2719		x--;
2720
2721	usb_proc_explore_lock(sc->sc_udev);
2722	ch->set_alt = x;
2723	usb_proc_explore_unlock(sc->sc_udev);
2724
2725	DPRINTF("Selecting alt %d\n", (int)x);
2726
2727	return (ch->usb_alt[x].sample_rate);
2728}
2729
2730int
2731uaudio_chan_getptr(struct uaudio_chan *ch)
2732{
2733	return (ch->cur - ch->start);
2734}
2735
2736struct pcmchan_caps *
2737uaudio_chan_getcaps(struct uaudio_chan *ch)
2738{
2739	return (&ch->pcm_cap);
2740}
2741
2742static struct pcmchan_matrix uaudio_chan_matrix_swap_2_0 = {
2743	.id = SND_CHN_MATRIX_DRV,
2744	.channels = 2,
2745	.ext = 0,
2746	.map = {
2747		/* Right */
2748		[0] = {
2749			.type = SND_CHN_T_FR,
2750			.members =
2751			    SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC |
2752			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR |
2753			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR
2754		},
2755		/* Left */
2756		[1] = {
2757			.type = SND_CHN_T_FL,
2758			.members =
2759			    SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC |
2760			    SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL |
2761			    SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL
2762		},
2763		[2] = {
2764			.type = SND_CHN_T_MAX,
2765			.members = 0
2766		}
2767	},
2768	.mask = SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FL,
2769	.offset = {  1,  0, -1, -1, -1, -1, -1, -1, -1,
2770		    -1, -1, -1, -1, -1, -1, -1, -1, -1  }
2771};
2772
2773struct pcmchan_matrix *
2774uaudio_chan_getmatrix(struct uaudio_chan *ch, uint32_t format)
2775{
2776	struct uaudio_softc *sc;
2777
2778	sc = ch->priv_sc;
2779
2780	if (sc != NULL && sc->sc_uq_audio_swap_lr != 0 &&
2781	    AFMT_CHANNEL(format) == 2)
2782		return (&uaudio_chan_matrix_swap_2_0);
2783
2784	return (feeder_matrix_format_map(format));
2785}
2786
2787int
2788uaudio_chan_set_param_format(struct uaudio_chan *ch, uint32_t format)
2789{
2790	DPRINTF("Selecting format 0x%08x\n", (unsigned int)format);
2791	return (0);
2792}
2793
2794static void
2795uaudio_chan_reconfigure(struct uaudio_chan *ch, uint8_t operation)
2796{
2797	struct uaudio_softc *sc = ch->priv_sc;
2798
2799	/* Check for shutdown. */
2800	if (ch->operation == CHAN_OP_DRAIN)
2801		return;
2802
2803	/* Set next operation. */
2804	ch->operation = operation;
2805
2806	/*
2807	 * Because changing the alternate setting modifies the USB
2808	 * configuration, this part must be executed from the USB
2809	 * explore process.
2810	 */
2811	(void)usb_proc_explore_msignal(sc->sc_udev,
2812	    &sc->sc_config_msg[0], &sc->sc_config_msg[1]);
2813}
2814
2815static int
2816uaudio_chan_need_both(struct uaudio_chan *pchan, struct uaudio_chan *rchan)
2817{
2818	return (pchan->num_alt > 0 &&
2819	    pchan->running != 0 &&
2820	    uaudio_chan_is_async(pchan, pchan->set_alt) != 0 &&
2821	    rchan->num_alt > 0 &&
2822	    rchan->running == 0);
2823}
2824
2825static int
2826uaudio_chan_need_none(struct uaudio_chan *pchan, struct uaudio_chan *rchan)
2827{
2828	return (pchan->num_alt > 0 &&
2829	    pchan->running == 0 &&
2830	    rchan->num_alt > 0 &&
2831	    rchan->running == 0);
2832}
2833
2834void
2835uaudio_chan_start(struct uaudio_chan *ch)
2836{
2837	struct uaudio_softc *sc = ch->priv_sc;
2838	unsigned i = uaudio_get_child_index_by_chan(sc, ch);
2839
2840	/* make operation atomic */
2841	usb_proc_explore_lock(sc->sc_udev);
2842
2843	/* check if not running */
2844	if (ch->running == 0) {
2845		uint32_t temp;
2846
2847		/* get current buffer size */
2848		temp = 2 * uaudio_get_buffer_size(ch, ch->set_alt);
2849
2850		/* set running flag */
2851		ch->running = 1;
2852
2853		/* ensure the hardware buffer is reset */
2854		ch->start = ch->buf;
2855		ch->end = ch->buf + temp;
2856		ch->cur = ch->buf;
2857
2858		if (uaudio_chan_need_both(
2859		    &sc->sc_play_chan[i],
2860		    &sc->sc_rec_chan[i])) {
2861			/*
2862			 * Start both endpoints because of need for
2863			 * jitter information:
2864			 */
2865			uaudio_chan_reconfigure(&sc->sc_rec_chan[i], CHAN_OP_START);
2866			uaudio_chan_reconfigure(&sc->sc_play_chan[i], CHAN_OP_START);
2867		} else {
2868			uaudio_chan_reconfigure(ch, CHAN_OP_START);
2869		}
2870	}
2871
2872	/* exit atomic operation */
2873	usb_proc_explore_unlock(sc->sc_udev);
2874}
2875
2876void
2877uaudio_chan_stop(struct uaudio_chan *ch)
2878{
2879	struct uaudio_softc *sc = ch->priv_sc;
2880	unsigned i = uaudio_get_child_index_by_chan(sc, ch);
2881
2882	/* make operation atomic */
2883	usb_proc_explore_lock(sc->sc_udev);
2884
2885	/* check if running */
2886	if (ch->running != 0) {
2887		/* clear running flag */
2888		ch->running = 0;
2889
2890		if (uaudio_chan_need_both(
2891		    &sc->sc_play_chan[i],
2892		    &sc->sc_rec_chan[i])) {
2893			/*
2894			 * Leave the endpoints running because we need
2895			 * information about jitter!
2896			 */
2897		} else if (uaudio_chan_need_none(
2898		    &sc->sc_play_chan[i],
2899		    &sc->sc_rec_chan[i])) {
2900			/*
2901			 * Stop both endpoints in case the one was used for
2902			 * jitter information:
2903			 */
2904			uaudio_chan_reconfigure(&sc->sc_rec_chan[i], CHAN_OP_STOP);
2905			uaudio_chan_reconfigure(&sc->sc_play_chan[i], CHAN_OP_STOP);
2906		} else {
2907			uaudio_chan_reconfigure(ch, CHAN_OP_STOP);
2908		}
2909	}
2910
2911	/* exit atomic operation */
2912	usb_proc_explore_unlock(sc->sc_udev);
2913}
2914
2915/*========================================================================*
2916 * AC - Audio Controller - routines
2917 *========================================================================*/
2918
2919static int
2920uaudio_mixer_sysctl_handler(SYSCTL_HANDLER_ARGS)
2921{
2922	struct uaudio_softc *sc;
2923	struct uaudio_mixer_node *pmc;
2924	int hint;
2925	int error;
2926	int temp = 0;
2927	int chan = 0;
2928
2929	sc = (struct uaudio_softc *)oidp->oid_arg1;
2930	hint = oidp->oid_arg2;
2931
2932	if (sc->sc_child[0].mixer_lock == NULL)
2933		return (ENXIO);
2934
2935	/* lookup mixer node */
2936
2937	mtx_lock(sc->sc_child[0].mixer_lock);
2938	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
2939		for (chan = 0; chan != (int)pmc->nchan; chan++) {
2940			if (pmc->wValue[chan] != -1 &&
2941			    pmc->wValue[chan] == hint) {
2942				temp = pmc->wData[chan];
2943				goto found;
2944			}
2945		}
2946	}
2947found:
2948	mtx_unlock(sc->sc_child[0].mixer_lock);
2949
2950	error = sysctl_handle_int(oidp, &temp, 0, req);
2951	if (error != 0 || req->newptr == NULL)
2952		return (error);
2953
2954	/* update mixer value */
2955
2956	mtx_lock(sc->sc_child[0].mixer_lock);
2957	if (pmc != NULL &&
2958	    temp >= pmc->minval &&
2959	    temp <= pmc->maxval) {
2960
2961		pmc->wData[chan] = temp;
2962		pmc->update[(chan / 8)] |= (1 << (chan % 8));
2963
2964		/* start the transfer, if not already started */
2965		usbd_transfer_start(sc->sc_mixer_xfer[0]);
2966	}
2967	mtx_unlock(sc->sc_child[0].mixer_lock);
2968
2969	return (0);
2970}
2971
2972static void
2973uaudio_mixer_ctl_free(struct uaudio_softc *sc)
2974{
2975	struct uaudio_mixer_node *p_mc;
2976
2977	while ((p_mc = sc->sc_mixer_root) != NULL) {
2978		sc->sc_mixer_root = p_mc->next;
2979		free(p_mc, M_USBDEV);
2980	}
2981}
2982
2983static void
2984uaudio_mixer_register_sysctl(struct uaudio_softc *sc, device_t dev,
2985    unsigned index)
2986{
2987	struct uaudio_mixer_node *pmc;
2988	struct sysctl_oid *mixer_tree;
2989	struct sysctl_oid *control_tree;
2990	char buf[32];
2991	int chan;
2992	int n;
2993
2994	if (index != 0)
2995		return;
2996
2997	mixer_tree = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev),
2998	    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO, "mixer",
2999	    CTLFLAG_RD, NULL, "");
3000
3001	if (mixer_tree == NULL)
3002		return;
3003
3004	for (n = 0, pmc = sc->sc_mixer_root; pmc != NULL;
3005	    pmc = pmc->next, n++) {
3006
3007		for (chan = 0; chan < pmc->nchan; chan++) {
3008
3009			if (pmc->nchan > 1) {
3010				snprintf(buf, sizeof(buf), "%s_%d_%d",
3011				    pmc->name, n, chan);
3012			} else {
3013				snprintf(buf, sizeof(buf), "%s_%d",
3014				    pmc->name, n);
3015			}
3016
3017			control_tree = SYSCTL_ADD_NODE(device_get_sysctl_ctx(dev),
3018			    SYSCTL_CHILDREN(mixer_tree), OID_AUTO, buf,
3019			    CTLFLAG_RD, NULL, "Mixer control nodes");
3020
3021			if (control_tree == NULL)
3022				continue;
3023
3024			SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
3025			    SYSCTL_CHILDREN(control_tree),
3026			    OID_AUTO, "val", CTLTYPE_INT | CTLFLAG_RWTUN, sc,
3027			    pmc->wValue[chan],
3028			    uaudio_mixer_sysctl_handler, "I", "Current value");
3029
3030			SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3031			    SYSCTL_CHILDREN(control_tree),
3032			    OID_AUTO, "min", CTLFLAG_RD, 0, pmc->minval,
3033			    "Minimum value");
3034
3035			SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
3036			    SYSCTL_CHILDREN(control_tree),
3037			    OID_AUTO, "max", CTLFLAG_RD, 0, pmc->maxval,
3038			    "Maximum value");
3039
3040			SYSCTL_ADD_STRING(device_get_sysctl_ctx(dev),
3041			    SYSCTL_CHILDREN(control_tree),
3042			    OID_AUTO, "desc", CTLFLAG_RD, pmc->desc, 0,
3043			    "Description");
3044		}
3045	}
3046}
3047
3048/* M-Audio FastTrack Ultra Mixer Description */
3049/* Origin: Linux USB Audio driver */
3050static void
3051uaudio_mixer_controls_create_ftu(struct uaudio_softc *sc)
3052{
3053	int chx;
3054	int chy;
3055
3056	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3057	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
3058	MIX(sc).wValue[0] = MAKE_WORD(8, 0);
3059	MIX(sc).type = MIX_UNSIGNED_16;
3060	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3061	MIX(sc).name = "effect";
3062	MIX(sc).minval = 0;
3063	MIX(sc).maxval = 7;
3064	MIX(sc).mul = 7;
3065	MIX(sc).nchan = 1;
3066	MIX(sc).update[0] = 1;
3067	strlcpy(MIX(sc).desc, "Room1,2,3,Hall1,2,Plate,Delay,Echo", sizeof(MIX(sc).desc));
3068	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
3069
3070	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3071	MIX(sc).wIndex = MAKE_WORD(5, sc->sc_mixer_iface_no);
3072
3073	for (chx = 0; chx != 8; chx++) {
3074		for (chy = 0; chy != 8; chy++) {
3075
3076			MIX(sc).wValue[0] = MAKE_WORD(chx + 1, chy + 1);
3077			MIX(sc).type = MIX_SIGNED_16;
3078			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3079			MIX(sc).name = "mix_rec";
3080			MIX(sc).nchan = 1;
3081			MIX(sc).update[0] = 1;
3082			MIX(sc).val_default = 0;
3083			snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
3084			    "AIn%d - Out%d Record Volume", chy + 1, chx + 1);
3085
3086			uaudio_mixer_add_ctl(sc, &MIX(sc));
3087
3088			MIX(sc).wValue[0] = MAKE_WORD(chx + 1, chy + 1 + 8);
3089			MIX(sc).type = MIX_SIGNED_16;
3090			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3091			MIX(sc).name = "mix_play";
3092			MIX(sc).nchan = 1;
3093			MIX(sc).update[0] = 1;
3094			MIX(sc).val_default = (chx == chy) ? 2 : 0;
3095			snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
3096			    "DIn%d - Out%d Playback Volume", chy + 1, chx + 1);
3097
3098			uaudio_mixer_add_ctl(sc, &MIX(sc));
3099		}
3100	}
3101
3102	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3103	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
3104	MIX(sc).wValue[0] = MAKE_WORD(2, 0);
3105	MIX(sc).type = MIX_SIGNED_8;
3106	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3107	MIX(sc).name = "effect_vol";
3108	MIX(sc).nchan = 1;
3109	MIX(sc).update[0] = 1;
3110	MIX(sc).minval = 0;
3111	MIX(sc).maxval = 0x7f;
3112	MIX(sc).mul = 0x7f;
3113	MIX(sc).nchan = 1;
3114	MIX(sc).update[0] = 1;
3115	strlcpy(MIX(sc).desc, "Effect Volume", sizeof(MIX(sc).desc));
3116	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
3117
3118	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3119	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
3120	MIX(sc).wValue[0] = MAKE_WORD(3, 0);
3121	MIX(sc).type = MIX_SIGNED_16;
3122	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3123	MIX(sc).name = "effect_dur";
3124	MIX(sc).nchan = 1;
3125	MIX(sc).update[0] = 1;
3126	MIX(sc).minval = 0;
3127	MIX(sc).maxval = 0x7f00;
3128	MIX(sc).mul = 0x7f00;
3129	MIX(sc).nchan = 1;
3130	MIX(sc).update[0] = 1;
3131	strlcpy(MIX(sc).desc, "Effect Duration", sizeof(MIX(sc).desc));
3132	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
3133
3134	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3135	MIX(sc).wIndex = MAKE_WORD(6, sc->sc_mixer_iface_no);
3136	MIX(sc).wValue[0] = MAKE_WORD(4, 0);
3137	MIX(sc).type = MIX_SIGNED_8;
3138	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3139	MIX(sc).name = "effect_fb";
3140	MIX(sc).nchan = 1;
3141	MIX(sc).update[0] = 1;
3142	MIX(sc).minval = 0;
3143	MIX(sc).maxval = 0x7f;
3144	MIX(sc).mul = 0x7f;
3145	MIX(sc).nchan = 1;
3146	MIX(sc).update[0] = 1;
3147	strlcpy(MIX(sc).desc, "Effect Feedback Volume", sizeof(MIX(sc).desc));
3148	uaudio_mixer_add_ctl_sub(sc, &MIX(sc));
3149
3150	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3151	MIX(sc).wIndex = MAKE_WORD(7, sc->sc_mixer_iface_no);
3152	for (chy = 0; chy != 4; chy++) {
3153
3154		MIX(sc).wValue[0] = MAKE_WORD(7, chy + 1);
3155		MIX(sc).type = MIX_SIGNED_16;
3156		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3157		MIX(sc).name = "effect_ret";
3158		MIX(sc).nchan = 1;
3159		MIX(sc).update[0] = 1;
3160		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
3161		    "Effect Return %d Volume", chy + 1);
3162
3163		uaudio_mixer_add_ctl(sc, &MIX(sc));
3164	}
3165
3166	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3167	MIX(sc).wIndex = MAKE_WORD(5, sc->sc_mixer_iface_no);
3168
3169	for (chy = 0; chy != 8; chy++) {
3170		MIX(sc).wValue[0] = MAKE_WORD(9, chy + 1);
3171		MIX(sc).type = MIX_SIGNED_16;
3172		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3173		MIX(sc).name = "effect_send";
3174		MIX(sc).nchan = 1;
3175		MIX(sc).update[0] = 1;
3176		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
3177		    "Effect Send AIn%d Volume", chy + 1);
3178
3179		uaudio_mixer_add_ctl(sc, &MIX(sc));
3180
3181		MIX(sc).wValue[0] = MAKE_WORD(9, chy + 1 + 8);
3182		MIX(sc).type = MIX_SIGNED_16;
3183		MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3184		MIX(sc).name = "effect_send";
3185		MIX(sc).nchan = 1;
3186		MIX(sc).update[0] = 1;
3187		snprintf(MIX(sc).desc, sizeof(MIX(sc).desc),
3188		    "Effect Send DIn%d Volume", chy + 1);
3189
3190		uaudio_mixer_add_ctl(sc, &MIX(sc));
3191	}
3192}
3193
3194static void
3195uaudio_mixer_reload_all(struct uaudio_softc *sc)
3196{
3197	struct uaudio_mixer_node *pmc;
3198	int chan;
3199
3200	if (sc->sc_child[0].mixer_lock == NULL)
3201		return;
3202
3203	mtx_lock(sc->sc_child[0].mixer_lock);
3204	for (pmc = sc->sc_mixer_root; pmc != NULL; pmc = pmc->next) {
3205		/* use reset defaults for non-oss controlled settings */
3206		if (pmc->ctl == SOUND_MIXER_NRDEVICES)
3207			continue;
3208		for (chan = 0; chan < pmc->nchan; chan++)
3209			pmc->update[chan / 8] |= (1 << (chan % 8));
3210	}
3211	usbd_transfer_start(sc->sc_mixer_xfer[0]);
3212
3213	/* start HID volume keys, if any */
3214	usbd_transfer_start(sc->sc_hid.xfer[0]);
3215	mtx_unlock(sc->sc_child[0].mixer_lock);
3216}
3217
3218static void
3219uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
3220{
3221	struct uaudio_mixer_node *p_mc_new =
3222	    malloc(sizeof(*p_mc_new), M_USBDEV, M_WAITOK);
3223	int ch;
3224
3225	if (p_mc_new != NULL) {
3226		memcpy(p_mc_new, mc, sizeof(*p_mc_new));
3227		p_mc_new->next = sc->sc_mixer_root;
3228		sc->sc_mixer_root = p_mc_new;
3229		sc->sc_mixer_count++;
3230
3231		/* set default value for all channels */
3232		for (ch = 0; ch < p_mc_new->nchan; ch++) {
3233			switch (p_mc_new->val_default) {
3234			case 1:
3235				/* 50% */
3236				p_mc_new->wData[ch] = (p_mc_new->maxval + p_mc_new->minval) / 2;
3237				break;
3238			case 2:
3239				/* 100% */
3240				p_mc_new->wData[ch] = p_mc_new->maxval;
3241				break;
3242			default:
3243				/* 0% */
3244				p_mc_new->wData[ch] = p_mc_new->minval;
3245				break;
3246			}
3247		}
3248	} else {
3249		DPRINTF("out of memory\n");
3250	}
3251}
3252
3253static void
3254uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc)
3255{
3256	int32_t res;
3257
3258	DPRINTF("adding %d\n", mc->ctl);
3259
3260	if (mc->type == MIX_ON_OFF) {
3261		mc->minval = 0;
3262		mc->maxval = 1;
3263	} else if (mc->type == MIX_SELECTOR) {
3264	} else {
3265
3266		/* determine min and max values */
3267
3268		mc->minval = uaudio_mixer_get(sc->sc_udev,
3269		    sc->sc_audio_rev, GET_MIN, mc);
3270		mc->maxval = uaudio_mixer_get(sc->sc_udev,
3271		    sc->sc_audio_rev, GET_MAX, mc);
3272
3273		/* check if max and min was swapped */
3274
3275		if (mc->maxval < mc->minval) {
3276			res = mc->maxval;
3277			mc->maxval = mc->minval;
3278			mc->minval = res;
3279		}
3280
3281		/* compute value range */
3282		mc->mul = mc->maxval - mc->minval;
3283		if (mc->mul == 0)
3284			mc->mul = 1;
3285
3286		/* compute value alignment */
3287		res = uaudio_mixer_get(sc->sc_udev,
3288		    sc->sc_audio_rev, GET_RES, mc);
3289
3290		DPRINTF("Resolution = %d\n", (int)res);
3291	}
3292
3293	uaudio_mixer_add_ctl_sub(sc, mc);
3294
3295#ifdef USB_DEBUG
3296	if (uaudio_debug > 2) {
3297		uint8_t i;
3298
3299		for (i = 0; i < mc->nchan; i++) {
3300			DPRINTF("[mix] wValue=%04x\n", mc->wValue[0]);
3301		}
3302		DPRINTF("[mix] wIndex=%04x type=%d ctl='%d' "
3303		    "min=%d max=%d\n",
3304		    mc->wIndex, mc->type, mc->ctl,
3305		    mc->minval, mc->maxval);
3306	}
3307#endif
3308}
3309
3310static void
3311uaudio_mixer_add_mixer(struct uaudio_softc *sc,
3312    const struct uaudio_terminal_node *iot, int id)
3313{
3314	const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu_v1;
3315	const struct usb_audio_mixer_unit_1 *d1;
3316
3317	uint32_t bno;			/* bit number */
3318	uint32_t p;			/* bit number accumulator */
3319	uint32_t mo;			/* matching outputs */
3320	uint32_t mc;			/* matching channels */
3321	uint32_t ichs;			/* input channels */
3322	uint32_t ochs;			/* output channels */
3323	uint32_t c;
3324	uint32_t chs;			/* channels */
3325	uint32_t i;
3326	uint32_t o;
3327
3328	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3329	    d0->bUnitId, d0->bNrInPins);
3330
3331	/* compute the number of input channels */
3332
3333	ichs = 0;
3334	for (i = 0; i < d0->bNrInPins; i++) {
3335		ichs += uaudio_mixer_get_cluster(
3336		    d0->baSourceId[i], iot).bNrChannels;
3337	}
3338
3339	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
3340
3341	/* and the number of output channels */
3342
3343	ochs = d1->bNrChannels;
3344
3345	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
3346
3347	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3348
3349	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3350	MIX(sc).type = MIX_SIGNED_16;
3351
3352	if (uaudio_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL)
3353		return;
3354
3355	for (p = i = 0; i < d0->bNrInPins; i++) {
3356		chs = uaudio_mixer_get_cluster(
3357		    d0->baSourceId[i], iot).bNrChannels;
3358		mc = 0;
3359		for (c = 0; c < chs; c++) {
3360			mo = 0;
3361			for (o = 0; o < ochs; o++) {
3362				bno = ((p + c) * ochs) + o;
3363				if (BIT_TEST(d1->bmControls, bno))
3364					mo++;
3365			}
3366			if (mo == 1)
3367				mc++;
3368		}
3369		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
3370
3371			/* repeat bit-scan */
3372
3373			mc = 0;
3374			for (c = 0; c < chs; c++) {
3375				for (o = 0; o < ochs; o++) {
3376					bno = ((p + c) * ochs) + o;
3377					if (BIT_TEST(d1->bmControls, bno))
3378						MIX(sc).wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
3379				}
3380			}
3381			MIX(sc).nchan = chs;
3382			uaudio_mixer_add_ctl(sc, &MIX(sc));
3383		}
3384		p += chs;
3385	}
3386}
3387
3388static void
3389uaudio20_mixer_add_mixer(struct uaudio_softc *sc,
3390    const struct uaudio_terminal_node *iot, int id)
3391{
3392	const struct usb_audio20_mixer_unit_0 *d0 = iot[id].u.mu_v2;
3393	const struct usb_audio20_mixer_unit_1 *d1;
3394
3395	uint32_t bno;			/* bit number */
3396	uint32_t p;			/* bit number accumulator */
3397	uint32_t mo;			/* matching outputs */
3398	uint32_t mc;			/* matching channels */
3399	uint32_t ichs;			/* input channels */
3400	uint32_t ochs;			/* output channels */
3401	uint32_t c;
3402	uint32_t chs;			/* channels */
3403	uint32_t i;
3404	uint32_t o;
3405
3406	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3407	    d0->bUnitId, d0->bNrInPins);
3408
3409	/* compute the number of input channels */
3410
3411	ichs = 0;
3412	for (i = 0; i < d0->bNrInPins; i++) {
3413		ichs += uaudio20_mixer_get_cluster(
3414		    d0->baSourceId[i], iot).bNrChannels;
3415	}
3416
3417	d1 = (const void *)(d0->baSourceId + d0->bNrInPins);
3418
3419	/* and the number of output channels */
3420
3421	ochs = d1->bNrChannels;
3422
3423	DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs);
3424
3425	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3426
3427	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3428	MIX(sc).type = MIX_SIGNED_16;
3429
3430	if (uaudio20_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL)
3431		return;
3432
3433	for (p = i = 0; i < d0->bNrInPins; i++) {
3434		chs = uaudio20_mixer_get_cluster(
3435		    d0->baSourceId[i], iot).bNrChannels;
3436		mc = 0;
3437		for (c = 0; c < chs; c++) {
3438			mo = 0;
3439			for (o = 0; o < ochs; o++) {
3440				bno = ((p + c) * ochs) + o;
3441				if (BIT_TEST(d1->bmControls, bno))
3442					mo++;
3443			}
3444			if (mo == 1)
3445				mc++;
3446		}
3447		if ((mc == chs) && (chs <= MIX_MAX_CHAN)) {
3448
3449			/* repeat bit-scan */
3450
3451			mc = 0;
3452			for (c = 0; c < chs; c++) {
3453				for (o = 0; o < ochs; o++) {
3454					bno = ((p + c) * ochs) + o;
3455					if (BIT_TEST(d1->bmControls, bno))
3456						MIX(sc).wValue[mc++] = MAKE_WORD(p + c + 1, o + 1);
3457				}
3458			}
3459			MIX(sc).nchan = chs;
3460			uaudio_mixer_add_ctl(sc, &MIX(sc));
3461		}
3462		p += chs;
3463	}
3464}
3465
3466static void
3467uaudio_mixer_check_selectors(struct uaudio_softc *sc)
3468{
3469	uint8_t reserve_feature[] = {
3470	    SOUND_MIXER_LINE,
3471	    SOUND_MIXER_LINE1,
3472	    SOUND_MIXER_LINE2,
3473	    SOUND_MIXER_LINE3,
3474	    SOUND_MIXER_DIGITAL1,
3475	    SOUND_MIXER_DIGITAL2,
3476	    SOUND_MIXER_DIGITAL3,
3477	};
3478	const uint16_t reserve_max =
3479	    sizeof(reserve_feature) / sizeof(reserve_feature[0]);
3480	uint16_t i;
3481	uint16_t j;
3482	uint16_t k;
3483
3484	/* remove existing selector types from the reserve */
3485	for (i = 0; i < MIX(sc).maxval; i++) {
3486		if (MIX(sc).slctrtype[i] == SOUND_MIXER_NRDEVICES)
3487			continue;
3488		for (j = 0; j != reserve_max; j++) {
3489			if (reserve_feature[j] == MIX(sc).slctrtype[i])
3490				reserve_feature[j] = SOUND_MIXER_NRDEVICES;
3491		}
3492	}
3493
3494	/* make sure selector types are not overlapping */
3495	for (i = 0; i < MIX(sc).maxval; i++) {
3496		if (MIX(sc).slctrtype[i] == SOUND_MIXER_NRDEVICES)
3497			continue;
3498		for (j = i + 1; j < MIX(sc).maxval; j++) {
3499			if (MIX(sc).slctrtype[j] == SOUND_MIXER_NRDEVICES)
3500				continue;
3501			if (MIX(sc).slctrtype[i] != MIX(sc).slctrtype[j])
3502				continue;
3503			for (k = 0; k != reserve_max; k++) {
3504				if (reserve_feature[k] == SOUND_MIXER_NRDEVICES)
3505					continue;
3506				MIX(sc).slctrtype[j] = reserve_feature[k];
3507				reserve_feature[k] = SOUND_MIXER_NRDEVICES;
3508				break;
3509			}
3510			if (k == reserve_max) {
3511				DPRINTF("Selector type %d is not selectable!\n", j);
3512				MIX(sc).slctrtype[j] = SOUND_MIXER_NRDEVICES;
3513			}
3514		}
3515	}
3516}
3517
3518static void
3519uaudio_mixer_add_selector(struct uaudio_softc *sc,
3520    const struct uaudio_terminal_node *iot, int id)
3521{
3522	const struct usb_audio_selector_unit *d = iot[id].u.su_v1;
3523	uint16_t i;
3524
3525	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3526	    d->bUnitId, d->bNrInPins);
3527
3528	if (d->bNrInPins == 0)
3529		return;
3530
3531	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3532
3533	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3534	MIX(sc).wValue[0] = MAKE_WORD(0, 0);
3535	MIX(sc).nchan = 1;
3536	MIX(sc).type = MIX_SELECTOR;
3537	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3538	MIX(sc).minval = 1;
3539	MIX(sc).maxval = d->bNrInPins;
3540	MIX(sc).name = "selector";
3541
3542	i = d->baSourceId[d->bNrInPins];
3543	if (i == 0 ||
3544	    usbd_req_get_string_any(sc->sc_udev, NULL,
3545	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3546		MIX(sc).desc[0] = 0;
3547	}
3548
3549	if (MIX(sc).maxval > MAX_SELECTOR_INPUT_PIN)
3550		MIX(sc).maxval = MAX_SELECTOR_INPUT_PIN;
3551
3552	MIX(sc).mul = MIX(sc).maxval - MIX(sc).minval;
3553
3554	for (i = 0; i < MIX(sc).maxval; i++) {
3555		MIX(sc).slctrtype[i] =
3556		    uaudio_mixer_determine_class(&iot[d->baSourceId[i]]);
3557	}
3558	for (; i < MAX_SELECTOR_INPUT_PIN; i++)
3559		MIX(sc).slctrtype[i] = SOUND_MIXER_NRDEVICES;
3560
3561	uaudio_mixer_check_selectors(sc);
3562	uaudio_mixer_add_ctl(sc, &MIX(sc));
3563}
3564
3565static void
3566uaudio20_mixer_add_selector(struct uaudio_softc *sc,
3567    const struct uaudio_terminal_node *iot, int id)
3568{
3569	const struct usb_audio20_selector_unit *d = iot[id].u.su_v2;
3570	uint16_t i;
3571
3572	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
3573	    d->bUnitId, d->bNrInPins);
3574
3575	if (d->bNrInPins == 0)
3576		return;
3577
3578	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3579
3580	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3581	MIX(sc).wValue[0] = MAKE_WORD(0, 0);
3582	MIX(sc).nchan = 1;
3583	MIX(sc).type = MIX_SELECTOR;
3584	MIX(sc).ctl = SOUND_MIXER_NRDEVICES;
3585	MIX(sc).minval = 1;
3586	MIX(sc).maxval = d->bNrInPins;
3587	MIX(sc).name = "selector";
3588
3589	i = d->baSourceId[d->bNrInPins];
3590	if (i == 0 ||
3591	    usbd_req_get_string_any(sc->sc_udev, NULL,
3592	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3593		MIX(sc).desc[0] = 0;
3594	}
3595
3596	if (MIX(sc).maxval > MAX_SELECTOR_INPUT_PIN)
3597		MIX(sc).maxval = MAX_SELECTOR_INPUT_PIN;
3598
3599	MIX(sc).mul = MIX(sc).maxval - MIX(sc).minval;
3600
3601	for (i = 0; i < MIX(sc).maxval; i++) {
3602		MIX(sc).slctrtype[i] =
3603		    uaudio20_mixer_determine_class(&iot[d->baSourceId[i]]);
3604	}
3605	for (; i < MAX_SELECTOR_INPUT_PIN; i++)
3606		MIX(sc).slctrtype[i] = SOUND_MIXER_NRDEVICES;
3607
3608	uaudio_mixer_check_selectors(sc);
3609	uaudio_mixer_add_ctl(sc, &MIX(sc));
3610}
3611
3612static uint32_t
3613uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d,
3614    uint8_t i)
3615{
3616	uint32_t temp = 0;
3617	uint32_t offset = (i * d->bControlSize);
3618
3619	if (d->bControlSize > 0) {
3620		temp |= d->bmaControls[offset];
3621		if (d->bControlSize > 1) {
3622			temp |= d->bmaControls[offset + 1] << 8;
3623			if (d->bControlSize > 2) {
3624				temp |= d->bmaControls[offset + 2] << 16;
3625				if (d->bControlSize > 3) {
3626					temp |= d->bmaControls[offset + 3] << 24;
3627				}
3628			}
3629		}
3630	}
3631	return (temp);
3632}
3633
3634static void
3635uaudio_mixer_add_feature(struct uaudio_softc *sc,
3636    const struct uaudio_terminal_node *iot, int id)
3637{
3638	const struct usb_audio_feature_unit *d = iot[id].u.fu_v1;
3639	uint32_t fumask;
3640	uint32_t mmask;
3641	uint32_t cmask;
3642	uint16_t mixernumber;
3643	uint8_t nchan;
3644	uint8_t chan;
3645	uint8_t ctl;
3646	uint8_t i;
3647
3648	if (d->bControlSize == 0)
3649		return;
3650
3651	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3652
3653	nchan = (d->bLength - 7) / d->bControlSize;
3654	mmask = uaudio_mixer_feature_get_bmaControls(d, 0);
3655	cmask = 0;
3656
3657	if (nchan == 0)
3658		return;
3659
3660	/* figure out what we can control */
3661
3662	for (chan = 1; chan < nchan; chan++) {
3663		DPRINTFN(10, "chan=%d mask=%x\n",
3664		    chan, uaudio_mixer_feature_get_bmaControls(d, chan));
3665
3666		cmask |= uaudio_mixer_feature_get_bmaControls(d, chan);
3667	}
3668
3669	if (nchan > MIX_MAX_CHAN)
3670		nchan = MIX_MAX_CHAN;
3671
3672	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3673
3674	i = d->bmaControls[d->bControlSize];
3675	if (i == 0 ||
3676	    usbd_req_get_string_any(sc->sc_udev, NULL,
3677	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3678		MIX(sc).desc[0] = 0;
3679	}
3680
3681	for (ctl = 1; ctl <= LOUDNESS_CONTROL; ctl++) {
3682
3683		fumask = FU_MASK(ctl);
3684
3685		DPRINTFN(5, "ctl=%d fumask=0x%04x\n",
3686		    ctl, fumask);
3687
3688		if (mmask & fumask) {
3689			MIX(sc).nchan = 1;
3690			MIX(sc).wValue[0] = MAKE_WORD(ctl, 0);
3691		} else if (cmask & fumask) {
3692			MIX(sc).nchan = nchan - 1;
3693			for (i = 1; i < nchan; i++) {
3694				if (uaudio_mixer_feature_get_bmaControls(d, i) & fumask)
3695					MIX(sc).wValue[i - 1] = MAKE_WORD(ctl, i);
3696				else
3697					MIX(sc).wValue[i - 1] = -1;
3698			}
3699		} else {
3700			continue;
3701		}
3702
3703		mixernumber = uaudio_mixer_determine_class(&iot[id]);
3704
3705		switch (ctl) {
3706		case MUTE_CONTROL:
3707			MIX(sc).type = MIX_ON_OFF;
3708			MIX(sc).ctl = SOUND_MIXER_MUTE;
3709			MIX(sc).name = "mute";
3710			break;
3711
3712		case VOLUME_CONTROL:
3713			MIX(sc).type = MIX_SIGNED_16;
3714			MIX(sc).ctl = mixernumber;
3715			MIX(sc).name = "vol";
3716			break;
3717
3718		case BASS_CONTROL:
3719			MIX(sc).type = MIX_SIGNED_8;
3720			MIX(sc).ctl = SOUND_MIXER_BASS;
3721			MIX(sc).name = "bass";
3722			break;
3723
3724		case MID_CONTROL:
3725			MIX(sc).type = MIX_SIGNED_8;
3726			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3727			MIX(sc).name = "mid";
3728			break;
3729
3730		case TREBLE_CONTROL:
3731			MIX(sc).type = MIX_SIGNED_8;
3732			MIX(sc).ctl = SOUND_MIXER_TREBLE;
3733			MIX(sc).name = "treble";
3734			break;
3735
3736		case GRAPHIC_EQUALIZER_CONTROL:
3737			continue;	/* XXX don't add anything */
3738
3739		case AGC_CONTROL:
3740			MIX(sc).type = MIX_ON_OFF;
3741			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3742			MIX(sc).name = "agc";
3743			break;
3744
3745		case DELAY_CONTROL:
3746			MIX(sc).type = MIX_UNSIGNED_16;
3747			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3748			MIX(sc).name = "delay";
3749			break;
3750
3751		case BASS_BOOST_CONTROL:
3752			MIX(sc).type = MIX_ON_OFF;
3753			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3754			MIX(sc).name = "boost";
3755			break;
3756
3757		case LOUDNESS_CONTROL:
3758			MIX(sc).type = MIX_ON_OFF;
3759			MIX(sc).ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
3760			MIX(sc).name = "loudness";
3761			break;
3762
3763		default:
3764			MIX(sc).type = MIX_UNKNOWN;
3765			break;
3766		}
3767
3768		if (MIX(sc).type != MIX_UNKNOWN)
3769			uaudio_mixer_add_ctl(sc, &MIX(sc));
3770	}
3771}
3772
3773static void
3774uaudio20_mixer_add_feature(struct uaudio_softc *sc,
3775    const struct uaudio_terminal_node *iot, int id)
3776{
3777	const struct usb_audio20_feature_unit *d = iot[id].u.fu_v2;
3778	uint32_t ctl;
3779	uint32_t mmask;
3780	uint32_t cmask;
3781	uint16_t mixernumber;
3782	uint8_t nchan;
3783	uint8_t chan;
3784	uint8_t i;
3785	uint8_t what;
3786
3787	if (UGETDW(d->bmaControls[0]) == 0)
3788		return;
3789
3790	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3791
3792	nchan = (d->bLength - 6) / 4;
3793	mmask = UGETDW(d->bmaControls[0]);
3794	cmask = 0;
3795
3796	if (nchan == 0)
3797		return;
3798
3799	/* figure out what we can control */
3800
3801	for (chan = 1; chan < nchan; chan++)
3802		cmask |= UGETDW(d->bmaControls[chan]);
3803
3804	if (nchan > MIX_MAX_CHAN)
3805		nchan = MIX_MAX_CHAN;
3806
3807	MIX(sc).wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no);
3808
3809	i = d->bmaControls[nchan][0];
3810	if (i == 0 ||
3811	    usbd_req_get_string_any(sc->sc_udev, NULL,
3812	    MIX(sc).desc, sizeof(MIX(sc).desc), i) != 0) {
3813		MIX(sc).desc[0] = 0;
3814	}
3815
3816	for (ctl = 3; ctl != 0; ctl <<= 2) {
3817
3818		mixernumber = uaudio20_mixer_determine_class(&iot[id]);
3819
3820		switch (ctl) {
3821		case (3 << 0):
3822			MIX(sc).type = MIX_ON_OFF;
3823			MIX(sc).ctl = SOUND_MIXER_MUTE;
3824			MIX(sc).name = "mute";
3825			what = MUTE_CONTROL;
3826			break;
3827		case (3 << 2):
3828			MIX(sc).type = MIX_SIGNED_16;
3829			MIX(sc).ctl = mixernumber;
3830			MIX(sc).name = "vol";
3831			what = VOLUME_CONTROL;
3832			break;
3833		case (3 << 4):
3834			MIX(sc).type = MIX_SIGNED_8;
3835			MIX(sc).ctl = SOUND_MIXER_BASS;
3836			MIX(sc).name = "bass";
3837			what = BASS_CONTROL;
3838			break;
3839		case (3 << 6):
3840			MIX(sc).type = MIX_SIGNED_8;
3841			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3842			MIX(sc).name = "mid";
3843			what = MID_CONTROL;
3844			break;
3845		case (3 << 8):
3846			MIX(sc).type = MIX_SIGNED_8;
3847			MIX(sc).ctl = SOUND_MIXER_TREBLE;
3848			MIX(sc).name = "treble";
3849			what = TREBLE_CONTROL;
3850			break;
3851		case (3 << 12):
3852			MIX(sc).type = MIX_ON_OFF;
3853			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3854			MIX(sc).name = "agc";
3855			what = AGC_CONTROL;
3856			break;
3857		case (3 << 14):
3858			MIX(sc).type = MIX_UNSIGNED_16;
3859			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3860			MIX(sc).name = "delay";
3861			what = DELAY_CONTROL;
3862			break;
3863		case (3 << 16):
3864			MIX(sc).type = MIX_ON_OFF;
3865			MIX(sc).ctl = SOUND_MIXER_NRDEVICES;	/* XXXXX */
3866			MIX(sc).name = "boost";
3867			what = BASS_BOOST_CONTROL;
3868			break;
3869		case (3 << 18):
3870			MIX(sc).type = MIX_ON_OFF;
3871			MIX(sc).ctl = SOUND_MIXER_LOUD;	/* Is this correct ? */
3872			MIX(sc).name = "loudness";
3873			what = LOUDNESS_CONTROL;
3874			break;
3875		case (3 << 20):
3876			MIX(sc).type = MIX_SIGNED_16;
3877			MIX(sc).ctl = mixernumber;
3878			MIX(sc).name = "igain";
3879			what = INPUT_GAIN_CONTROL;
3880			break;
3881		case (3 << 22):
3882			MIX(sc).type = MIX_SIGNED_16;
3883			MIX(sc).ctl = mixernumber;
3884			MIX(sc).name = "igainpad";
3885			what = INPUT_GAIN_PAD_CONTROL;
3886			break;
3887		default:
3888			continue;
3889		}
3890
3891		if ((mmask & ctl) == ctl) {
3892			MIX(sc).nchan = 1;
3893			MIX(sc).wValue[0] = MAKE_WORD(what, 0);
3894		} else if ((cmask & ctl) == ctl) {
3895			MIX(sc).nchan = nchan - 1;
3896			for (i = 1; i < nchan; i++) {
3897				if ((UGETDW(d->bmaControls[i]) & ctl) == ctl)
3898					MIX(sc).wValue[i - 1] = MAKE_WORD(what, i);
3899				else
3900					MIX(sc).wValue[i - 1] = -1;
3901			}
3902		} else {
3903			continue;
3904		}
3905
3906		if (MIX(sc).type != MIX_UNKNOWN)
3907			uaudio_mixer_add_ctl(sc, &MIX(sc));
3908	}
3909}
3910
3911static void
3912uaudio_mixer_add_processing_updown(struct uaudio_softc *sc,
3913    const struct uaudio_terminal_node *iot, int id)
3914{
3915	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu_v1;
3916	const struct usb_audio_processing_unit_1 *d1 =
3917	    (const void *)(d0->baSourceId + d0->bNrInPins);
3918	const struct usb_audio_processing_unit_updown *ud =
3919	    (const void *)(d1->bmControls + d1->bControlSize);
3920	uint8_t i;
3921
3922	if (uaudio_mixer_verify_desc(d0, sizeof(*ud)) == NULL) {
3923		return;
3924	}
3925	if (uaudio_mixer_verify_desc(d0, sizeof(*ud) + (2 * ud->bNrModes))
3926	    == NULL) {
3927		return;
3928	}
3929	DPRINTFN(3, "bUnitId=%d bNrModes=%d\n",
3930	    d0->bUnitId, ud->bNrModes);
3931
3932	if (!(d1->bmControls[0] & UA_PROC_MASK(UD_MODE_SELECT_CONTROL))) {
3933		DPRINTF("no mode select\n");
3934		return;
3935	}
3936	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3937
3938	MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3939	MIX(sc).nchan = 1;
3940	MIX(sc).wValue[0] = MAKE_WORD(UD_MODE_SELECT_CONTROL, 0);
3941	MIX(sc).type = MIX_ON_OFF;		/* XXX */
3942
3943	for (i = 0; i < ud->bNrModes; i++) {
3944		DPRINTFN(3, "i=%d bm=0x%x\n", i, UGETW(ud->waModes[i]));
3945		/* XXX */
3946	}
3947
3948	uaudio_mixer_add_ctl(sc, &MIX(sc));
3949}
3950
3951static void
3952uaudio_mixer_add_processing(struct uaudio_softc *sc,
3953    const struct uaudio_terminal_node *iot, int id)
3954{
3955	const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu_v1;
3956	const struct usb_audio_processing_unit_1 *d1 =
3957	    (const void *)(d0->baSourceId + d0->bNrInPins);
3958	uint16_t ptype;
3959
3960	memset(&MIX(sc), 0, sizeof(MIX(sc)));
3961
3962	ptype = UGETW(d0->wProcessType);
3963
3964	DPRINTFN(3, "wProcessType=%d bUnitId=%d "
3965	    "bNrInPins=%d\n", ptype, d0->bUnitId, d0->bNrInPins);
3966
3967	if (d1->bControlSize == 0) {
3968		return;
3969	}
3970	if (d1->bmControls[0] & UA_PROC_ENABLE_MASK) {
3971		MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
3972		MIX(sc).nchan = 1;
3973		MIX(sc).wValue[0] = MAKE_WORD(XX_ENABLE_CONTROL, 0);
3974		MIX(sc).type = MIX_ON_OFF;
3975		uaudio_mixer_add_ctl(sc, &MIX(sc));
3976	}
3977	switch (ptype) {
3978	case UPDOWNMIX_PROCESS:
3979		uaudio_mixer_add_processing_updown(sc, iot, id);
3980		break;
3981
3982	case DOLBY_PROLOGIC_PROCESS:
3983	case P3D_STEREO_EXTENDER_PROCESS:
3984	case REVERBATION_PROCESS:
3985	case CHORUS_PROCESS:
3986	case DYN_RANGE_COMP_PROCESS:
3987	default:
3988		DPRINTF("unit %d, type=%d is not implemented\n",
3989		    d0->bUnitId, ptype);
3990		break;
3991	}
3992}
3993
3994static void
3995uaudio_mixer_add_extension(struct uaudio_softc *sc,
3996    const struct uaudio_terminal_node *iot, int id)
3997{
3998	const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu_v1;
3999	const struct usb_audio_extension_unit_1 *d1 =
4000	    (const void *)(d0->baSourceId + d0->bNrInPins);
4001
4002	DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n",
4003	    d0->bUnitId, d0->bNrInPins);
4004
4005	if (sc->sc_uq_au_no_xu) {
4006		return;
4007	}
4008	if (d1->bControlSize == 0) {
4009		return;
4010	}
4011	if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) {
4012
4013		memset(&MIX(sc), 0, sizeof(MIX(sc)));
4014
4015		MIX(sc).wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no);
4016		MIX(sc).nchan = 1;
4017		MIX(sc).wValue[0] = MAKE_WORD(UA_EXT_ENABLE, 0);
4018		MIX(sc).type = MIX_ON_OFF;
4019
4020		uaudio_mixer_add_ctl(sc, &MIX(sc));
4021	}
4022}
4023
4024static const void *
4025uaudio_mixer_verify_desc(const void *arg, uint32_t len)
4026{
4027	const struct usb_audio_mixer_unit_1 *d1;
4028	const struct usb_audio_extension_unit_1 *e1;
4029	const struct usb_audio_processing_unit_1 *u1;
4030
4031	union {
4032		const struct usb_descriptor *desc;
4033		const struct usb_audio_input_terminal *it;
4034		const struct usb_audio_output_terminal *ot;
4035		const struct usb_audio_mixer_unit_0 *mu;
4036		const struct usb_audio_selector_unit *su;
4037		const struct usb_audio_feature_unit *fu;
4038		const struct usb_audio_processing_unit_0 *pu;
4039		const struct usb_audio_extension_unit_0 *eu;
4040	}     u;
4041
4042	u.desc = arg;
4043
4044	if (u.desc == NULL) {
4045		goto error;
4046	}
4047	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE) {
4048		goto error;
4049	}
4050	switch (u.desc->bDescriptorSubtype) {
4051	case UDESCSUB_AC_INPUT:
4052		len += sizeof(*u.it);
4053		break;
4054
4055	case UDESCSUB_AC_OUTPUT:
4056		len += sizeof(*u.ot);
4057		break;
4058
4059	case UDESCSUB_AC_MIXER:
4060		len += sizeof(*u.mu);
4061
4062		if (u.desc->bLength < len) {
4063			goto error;
4064		}
4065		len += u.mu->bNrInPins;
4066
4067		if (u.desc->bLength < len) {
4068			goto error;
4069		}
4070		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
4071
4072		len += sizeof(*d1);
4073		break;
4074
4075	case UDESCSUB_AC_SELECTOR:
4076		len += sizeof(*u.su);
4077
4078		if (u.desc->bLength < len) {
4079			goto error;
4080		}
4081		len += u.su->bNrInPins + 1;
4082		break;
4083
4084	case UDESCSUB_AC_FEATURE:
4085		len += sizeof(*u.fu) + 1;
4086
4087		if (u.desc->bLength < len)
4088			goto error;
4089
4090		len += u.fu->bControlSize;
4091		break;
4092
4093	case UDESCSUB_AC_PROCESSING:
4094		len += sizeof(*u.pu);
4095
4096		if (u.desc->bLength < len) {
4097			goto error;
4098		}
4099		len += u.pu->bNrInPins;
4100
4101		if (u.desc->bLength < len) {
4102			goto error;
4103		}
4104		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
4105
4106		len += sizeof(*u1);
4107
4108		if (u.desc->bLength < len) {
4109			goto error;
4110		}
4111		len += u1->bControlSize;
4112
4113		break;
4114
4115	case UDESCSUB_AC_EXTENSION:
4116		len += sizeof(*u.eu);
4117
4118		if (u.desc->bLength < len) {
4119			goto error;
4120		}
4121		len += u.eu->bNrInPins;
4122
4123		if (u.desc->bLength < len) {
4124			goto error;
4125		}
4126		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
4127
4128		len += sizeof(*e1);
4129
4130		if (u.desc->bLength < len) {
4131			goto error;
4132		}
4133		len += e1->bControlSize;
4134		break;
4135
4136	default:
4137		goto error;
4138	}
4139
4140	if (u.desc->bLength < len) {
4141		goto error;
4142	}
4143	return (u.desc);
4144
4145error:
4146	if (u.desc) {
4147		DPRINTF("invalid descriptor, type=%d, "
4148		    "sub_type=%d, len=%d of %d bytes\n",
4149		    u.desc->bDescriptorType,
4150		    u.desc->bDescriptorSubtype,
4151		    u.desc->bLength, len);
4152	}
4153	return (NULL);
4154}
4155
4156static const void *
4157uaudio20_mixer_verify_desc(const void *arg, uint32_t len)
4158{
4159	const struct usb_audio20_mixer_unit_1 *d1;
4160	const struct usb_audio20_extension_unit_1 *e1;
4161	const struct usb_audio20_processing_unit_1 *u1;
4162	const struct usb_audio20_clock_selector_unit_1 *c1;
4163
4164	union {
4165		const struct usb_descriptor *desc;
4166		const struct usb_audio20_clock_source_unit *csrc;
4167		const struct usb_audio20_clock_selector_unit_0 *csel;
4168		const struct usb_audio20_clock_multiplier_unit *cmul;
4169		const struct usb_audio20_input_terminal *it;
4170		const struct usb_audio20_output_terminal *ot;
4171		const struct usb_audio20_mixer_unit_0 *mu;
4172		const struct usb_audio20_selector_unit *su;
4173		const struct usb_audio20_feature_unit *fu;
4174		const struct usb_audio20_sample_rate_unit *ru;
4175		const struct usb_audio20_processing_unit_0 *pu;
4176		const struct usb_audio20_extension_unit_0 *eu;
4177		const struct usb_audio20_effect_unit *ef;
4178	}     u;
4179
4180	u.desc = arg;
4181
4182	if (u.desc == NULL)
4183		goto error;
4184
4185	if (u.desc->bDescriptorType != UDESC_CS_INTERFACE)
4186		goto error;
4187
4188	switch (u.desc->bDescriptorSubtype) {
4189	case UDESCSUB_AC_INPUT:
4190		len += sizeof(*u.it);
4191		break;
4192
4193	case UDESCSUB_AC_OUTPUT:
4194		len += sizeof(*u.ot);
4195		break;
4196
4197	case UDESCSUB_AC_MIXER:
4198		len += sizeof(*u.mu);
4199
4200		if (u.desc->bLength < len)
4201			goto error;
4202		len += u.mu->bNrInPins;
4203
4204		if (u.desc->bLength < len)
4205			goto error;
4206
4207		d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins);
4208
4209		len += sizeof(*d1) + d1->bNrChannels;
4210		break;
4211
4212	case UDESCSUB_AC_SELECTOR:
4213		len += sizeof(*u.su);
4214
4215		if (u.desc->bLength < len)
4216			goto error;
4217
4218		len += u.su->bNrInPins + 1;
4219		break;
4220
4221	case UDESCSUB_AC_FEATURE:
4222		len += sizeof(*u.fu) + 1;
4223		break;
4224
4225	case UDESCSUB_AC_EFFECT:
4226		len += sizeof(*u.ef) + 4;
4227		break;
4228
4229	case UDESCSUB_AC_PROCESSING_V2:
4230		len += sizeof(*u.pu);
4231
4232		if (u.desc->bLength < len)
4233			goto error;
4234
4235		len += u.pu->bNrInPins;
4236
4237		if (u.desc->bLength < len)
4238			goto error;
4239
4240		u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins);
4241
4242		len += sizeof(*u1);
4243		break;
4244
4245	case UDESCSUB_AC_EXTENSION_V2:
4246		len += sizeof(*u.eu);
4247
4248		if (u.desc->bLength < len)
4249			goto error;
4250
4251		len += u.eu->bNrInPins;
4252
4253		if (u.desc->bLength < len)
4254			goto error;
4255
4256		e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins);
4257
4258		len += sizeof(*e1);
4259		break;
4260
4261	case UDESCSUB_AC_CLOCK_SRC:
4262		len += sizeof(*u.csrc);
4263		break;
4264
4265	case UDESCSUB_AC_CLOCK_SEL:
4266		len += sizeof(*u.csel);
4267
4268		if (u.desc->bLength < len)
4269			goto error;
4270
4271		len += u.csel->bNrInPins;
4272
4273		if (u.desc->bLength < len)
4274			goto error;
4275
4276		c1 = (const void *)(u.csel->baCSourceId + u.csel->bNrInPins);
4277
4278		len += sizeof(*c1);
4279		break;
4280
4281	case UDESCSUB_AC_CLOCK_MUL:
4282		len += sizeof(*u.cmul);
4283		break;
4284
4285	case UDESCSUB_AC_SAMPLE_RT:
4286		len += sizeof(*u.ru);
4287		break;
4288
4289	default:
4290		goto error;
4291	}
4292
4293	if (u.desc->bLength < len)
4294		goto error;
4295
4296	return (u.desc);
4297
4298error:
4299	if (u.desc) {
4300		DPRINTF("invalid descriptor, type=%d, "
4301		    "sub_type=%d, len=%d of %d bytes\n",
4302		    u.desc->bDescriptorType,
4303		    u.desc->bDescriptorSubtype,
4304		    u.desc->bLength, len);
4305	}
4306	return (NULL);
4307}
4308
4309static struct usb_audio_cluster
4310uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
4311{
4312	struct usb_audio_cluster r;
4313	const struct usb_descriptor *dp;
4314	uint8_t i;
4315
4316	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
4317		dp = iot[id].u.desc;
4318		if (dp == NULL) {
4319			goto error;
4320		}
4321		switch (dp->bDescriptorSubtype) {
4322		case UDESCSUB_AC_INPUT:
4323			r.bNrChannels = iot[id].u.it_v1->bNrChannels;
4324			r.wChannelConfig[0] = iot[id].u.it_v1->wChannelConfig[0];
4325			r.wChannelConfig[1] = iot[id].u.it_v1->wChannelConfig[1];
4326			r.iChannelNames = iot[id].u.it_v1->iChannelNames;
4327			goto done;
4328
4329		case UDESCSUB_AC_OUTPUT:
4330			id = iot[id].u.ot_v1->bSourceId;
4331			break;
4332
4333		case UDESCSUB_AC_MIXER:
4334			r = *(const struct usb_audio_cluster *)
4335			    &iot[id].u.mu_v1->baSourceId[
4336			    iot[id].u.mu_v1->bNrInPins];
4337			goto done;
4338
4339		case UDESCSUB_AC_SELECTOR:
4340			if (iot[id].u.su_v1->bNrInPins > 0) {
4341				/* XXX This is not really right */
4342				id = iot[id].u.su_v1->baSourceId[0];
4343			}
4344			break;
4345
4346		case UDESCSUB_AC_FEATURE:
4347			id = iot[id].u.fu_v1->bSourceId;
4348			break;
4349
4350		case UDESCSUB_AC_PROCESSING:
4351			r = *((const struct usb_audio_cluster *)
4352			    &iot[id].u.pu_v1->baSourceId[
4353			    iot[id].u.pu_v1->bNrInPins]);
4354			goto done;
4355
4356		case UDESCSUB_AC_EXTENSION:
4357			r = *((const struct usb_audio_cluster *)
4358			    &iot[id].u.eu_v1->baSourceId[
4359			    iot[id].u.eu_v1->bNrInPins]);
4360			goto done;
4361
4362		default:
4363			goto error;
4364		}
4365	}
4366error:
4367	DPRINTF("bad data\n");
4368	memset(&r, 0, sizeof(r));
4369done:
4370	return (r);
4371}
4372
4373static struct usb_audio20_cluster
4374uaudio20_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot)
4375{
4376	struct usb_audio20_cluster r;
4377	const struct usb_descriptor *dp;
4378	uint8_t i;
4379
4380	for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) {	/* avoid infinite loops */
4381		dp = iot[id].u.desc;
4382		if (dp == NULL)
4383			goto error;
4384
4385		switch (dp->bDescriptorSubtype) {
4386		case UDESCSUB_AC_INPUT:
4387			r.bNrChannels = iot[id].u.it_v2->bNrChannels;
4388			r.bmChannelConfig[0] = iot[id].u.it_v2->bmChannelConfig[0];
4389			r.bmChannelConfig[1] = iot[id].u.it_v2->bmChannelConfig[1];
4390			r.bmChannelConfig[2] = iot[id].u.it_v2->bmChannelConfig[2];
4391			r.bmChannelConfig[3] = iot[id].u.it_v2->bmChannelConfig[3];
4392			r.iChannelNames = iot[id].u.it_v2->iTerminal;
4393			goto done;
4394
4395		case UDESCSUB_AC_OUTPUT:
4396			id = iot[id].u.ot_v2->bSourceId;
4397			break;
4398
4399		case UDESCSUB_AC_MIXER:
4400			r = *(const struct usb_audio20_cluster *)
4401			    &iot[id].u.mu_v2->baSourceId[
4402			    iot[id].u.mu_v2->bNrInPins];
4403			goto done;
4404
4405		case UDESCSUB_AC_SELECTOR:
4406			if (iot[id].u.su_v2->bNrInPins > 0) {
4407				/* XXX This is not really right */
4408				id = iot[id].u.su_v2->baSourceId[0];
4409			}
4410			break;
4411
4412		case UDESCSUB_AC_SAMPLE_RT:
4413			id = iot[id].u.ru_v2->bSourceId;
4414			break;
4415
4416		case UDESCSUB_AC_EFFECT:
4417			id = iot[id].u.ef_v2->bSourceId;
4418			break;
4419
4420		case UDESCSUB_AC_FEATURE:
4421			id = iot[id].u.fu_v2->bSourceId;
4422			break;
4423
4424		case UDESCSUB_AC_PROCESSING_V2:
4425			r = *((const struct usb_audio20_cluster *)
4426			    &iot[id].u.pu_v2->baSourceId[
4427			    iot[id].u.pu_v2->bNrInPins]);
4428			goto done;
4429
4430		case UDESCSUB_AC_EXTENSION_V2:
4431			r = *((const struct usb_audio20_cluster *)
4432			    &iot[id].u.eu_v2->baSourceId[
4433			    iot[id].u.eu_v2->bNrInPins]);
4434			goto done;
4435
4436		default:
4437			goto error;
4438		}
4439	}
4440error:
4441	DPRINTF("Bad data!\n");
4442	memset(&r, 0, sizeof(r));
4443done:
4444	return (r);
4445}
4446
4447static bool
4448uaudio_mixer_foreach_input(const struct uaudio_terminal_node *iot, uint8_t *pindex)
4449{
4450	uint8_t n;
4451
4452	n = *pindex;
4453
4454	while (1) {
4455		if (!n--)
4456			n = iot->usr.id_max;
4457		if (n == 0)
4458			return (false);
4459		if (iot->usr.bit_input[n / 8] & (1 << (n % 8)))
4460			break;
4461	}
4462	*pindex = n;
4463	return (true);
4464}
4465
4466static bool
4467uaudio_mixer_foreach_output(const struct uaudio_terminal_node *iot, uint8_t *pindex)
4468{
4469	uint8_t n;
4470
4471	n = *pindex;
4472
4473	while (1) {
4474		if (!n--)
4475			n = iot->usr.id_max;
4476		if (n == 0)
4477			return (false);
4478		if (iot->usr.bit_output[n / 8] & (1 << (n % 8)))
4479			break;
4480	}
4481	*pindex = n;
4482	return (true);
4483}
4484
4485struct uaudio_tt_to_feature {
4486	uint16_t terminal_type;
4487	uint16_t feature;
4488};
4489
4490static const struct uaudio_tt_to_feature uaudio_tt_to_feature[] = {
4491
4492	{UATI_MICROPHONE, SOUND_MIXER_MIC},
4493	{UATI_DESKMICROPHONE, SOUND_MIXER_MIC},
4494	{UATI_PERSONALMICROPHONE, SOUND_MIXER_MIC},
4495	{UATI_OMNIMICROPHONE, SOUND_MIXER_MIC},
4496	{UATI_MICROPHONEARRAY, SOUND_MIXER_MIC},
4497	{UATI_PROCMICROPHONEARR, SOUND_MIXER_MIC},
4498
4499	{UATE_ANALOGCONN, SOUND_MIXER_LINE},
4500	{UATE_LINECONN, SOUND_MIXER_LINE},
4501	{UATE_LEGACYCONN, SOUND_MIXER_LINE},
4502
4503	{UATE_DIGITALAUIFC, SOUND_MIXER_ALTPCM},
4504	{UATE_SPDIF, SOUND_MIXER_ALTPCM},
4505	{UATE_1394DA, SOUND_MIXER_ALTPCM},
4506	{UATE_1394DV, SOUND_MIXER_ALTPCM},
4507
4508	{UATF_CDPLAYER, SOUND_MIXER_CD},
4509
4510	{UATF_SYNTHESIZER, SOUND_MIXER_SYNTH},
4511
4512	{UATF_VIDEODISCAUDIO, SOUND_MIXER_VIDEO},
4513	{UATF_DVDAUDIO, SOUND_MIXER_VIDEO},
4514	{UATF_TVTUNERAUDIO, SOUND_MIXER_VIDEO},
4515
4516	{UATF_RADIORECV, SOUND_MIXER_RADIO},
4517	{UATF_RADIOXMIT, SOUND_MIXER_RADIO},
4518
4519	{}	/* END */
4520};
4521
4522static uint16_t
4523uaudio_mixer_get_feature_by_tt(uint16_t terminal_type, uint16_t default_type)
4524{
4525	const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature;
4526	uint16_t retval;
4527
4528	if (terminal_type == 0) {
4529		retval = default_type;
4530	} else while (1) {
4531		if (uat->terminal_type == 0) {
4532			switch (terminal_type >> 8) {
4533			case UATI_UNDEFINED >> 8:
4534				retval = SOUND_MIXER_RECLEV;
4535				goto done;
4536			case UATO_UNDEFINED >> 8:
4537				retval = SOUND_MIXER_PCM;
4538				goto done;
4539			case UATT_UNDEFINED >> 8:
4540				retval = SOUND_MIXER_PHONEIN;
4541				goto done;
4542			default:
4543				retval = default_type;
4544				goto done;
4545			}
4546		} else if (uat->terminal_type == terminal_type) {
4547			retval = uat->feature;
4548			goto done;
4549		}
4550		uat++;
4551	}
4552done:
4553	DPRINTF("terminal_type=0x%04x RET=%d DEF=%d\n",
4554	    terminal_type, retval, default_type);
4555	return (retval);
4556}
4557
4558static uint16_t
4559uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot)
4560{
4561	const struct uaudio_terminal_node *ptr;
4562	uint16_t terminal_type_input = 0;
4563	uint16_t terminal_type_output = 0;
4564	uint16_t temp;
4565	uint8_t match = 0;
4566	uint8_t i;
4567
4568	for (i = 0; uaudio_mixer_foreach_input(iot, &i); ) {
4569		ptr = iot->root + i;
4570		temp = UGETW(ptr->u.it_v1->wTerminalType);
4571
4572		if (temp == 0)
4573			continue;
4574		else if (temp == UAT_STREAM)
4575			match |= 1;
4576		else if ((temp & 0xFF00) != (UAT_UNDEFINED & 0xff00))
4577			terminal_type_input = temp;
4578	}
4579
4580	for (i = 0; uaudio_mixer_foreach_output(iot, &i); ) {
4581		ptr = iot->root + i;
4582		temp = UGETW(ptr->u.ot_v1->wTerminalType);
4583
4584		if (temp == 0)
4585			continue;
4586		else if (temp == UAT_STREAM)
4587			match |= 2;
4588		else if ((temp & 0xFF00) != (UAT_UNDEFINED & 0xff00))
4589			terminal_type_output = temp;
4590	}
4591
4592	DPRINTF("MATCH=%d IN=0x%04x OUT=0x%04x\n",
4593	    match, terminal_type_input, terminal_type_output);
4594
4595	switch (match) {
4596	case 0:	/* not connected to USB */
4597		if (terminal_type_output != 0) {
4598			return (uaudio_mixer_get_feature_by_tt(
4599			    terminal_type_output, SOUND_MIXER_MONITOR));
4600		} else {
4601			return (uaudio_mixer_get_feature_by_tt(
4602			    terminal_type_input, SOUND_MIXER_MONITOR));
4603		}
4604	case 3:	/* connected to both USB input and USB output */
4605		return (SOUND_MIXER_IMIX);
4606	case 2:	/* connected to USB output */
4607		return (uaudio_mixer_get_feature_by_tt(
4608		    terminal_type_input, SOUND_MIXER_RECLEV));
4609	case 1: /* connected to USB input */
4610		return (uaudio_mixer_get_feature_by_tt(
4611		    terminal_type_output, SOUND_MIXER_PCM));
4612	default:
4613		return (SOUND_MIXER_NRDEVICES);
4614	}
4615}
4616
4617static uint16_t
4618uaudio20_mixer_determine_class(const struct uaudio_terminal_node *iot)
4619{
4620	const struct uaudio_terminal_node *ptr;
4621	uint16_t terminal_type_input = 0;
4622	uint16_t terminal_type_output = 0;
4623	uint16_t temp;
4624	uint8_t match = 0;
4625	uint8_t i;
4626
4627	for (i = 0; uaudio_mixer_foreach_input(iot, &i); ) {
4628		ptr = iot->root + i;
4629		temp = UGETW(ptr->u.it_v2->wTerminalType);
4630
4631		if (temp == 0)
4632			continue;
4633		else if (temp == UAT_STREAM)
4634			match |= 1;
4635		else if ((temp & 0xFF00) != (UAT_UNDEFINED & 0xff00))
4636			terminal_type_input = temp;
4637	}
4638
4639	for (i = 0; uaudio_mixer_foreach_output(iot, &i); ) {
4640		ptr = iot->root + i;
4641		temp = UGETW(ptr->u.ot_v2->wTerminalType);
4642
4643		if (temp == 0)
4644			continue;
4645		else if (temp == UAT_STREAM)
4646			match |= 2;
4647		else if ((temp & 0xFF00) != (UAT_UNDEFINED & 0xff00))
4648			terminal_type_output = temp;
4649	}
4650
4651	DPRINTF("MATCH=%d IN=0x%04x OUT=0x%04x\n",
4652	    match, terminal_type_input, terminal_type_output);
4653
4654	switch (match) {
4655	case 0:	/* not connected to USB */
4656		if (terminal_type_output != 0) {
4657			return (uaudio_mixer_get_feature_by_tt(
4658			    terminal_type_output, SOUND_MIXER_MONITOR));
4659		} else {
4660			return (uaudio_mixer_get_feature_by_tt(
4661			    terminal_type_input, SOUND_MIXER_MONITOR));
4662		}
4663	case 3:	/* connected to both USB input and USB output */
4664		return (SOUND_MIXER_IMIX);
4665	case 2:	/* connected to USB output */
4666		return (uaudio_mixer_get_feature_by_tt(
4667		    terminal_type_input, SOUND_MIXER_RECLEV));
4668	case 1: /* connected to USB input */
4669		return (uaudio_mixer_get_feature_by_tt(
4670		    terminal_type_output, SOUND_MIXER_PCM));
4671	default:
4672		return (SOUND_MIXER_NRDEVICES);
4673	}
4674}
4675
4676static void
4677uaudio_mixer_merge_outputs(struct uaudio_search_result *dst,
4678    const struct uaudio_search_result *src)
4679{
4680	const uint8_t max = sizeof(src->bit_output) / sizeof(src->bit_output[0]);
4681	uint8_t x;
4682
4683	for (x = 0; x != max; x++)
4684		dst->bit_output[x] |= src->bit_output[x];
4685}
4686
4687static void
4688uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
4689    const uint8_t *p_id, uint8_t n_id,
4690    struct uaudio_search_result *info)
4691{
4692	struct uaudio_terminal_node *iot;
4693	uint8_t n;
4694	uint8_t i;
4695
4696	for (n = 0; n < n_id; n++) {
4697
4698		i = p_id[n];
4699
4700		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4701			DPRINTF("avoided going into a circle at id=%d!\n", i);
4702			return;
4703		}
4704
4705		info->recurse_level++;
4706
4707		iot = (root + i);
4708
4709		if (iot->u.desc == NULL)
4710			continue;
4711
4712		switch (iot->u.desc->bDescriptorSubtype) {
4713		case UDESCSUB_AC_INPUT:
4714			uaudio_mixer_merge_outputs(&iot->usr, info);
4715			info->bit_input[i / 8] |= (1 << (i % 8));
4716			break;
4717
4718		case UDESCSUB_AC_FEATURE:
4719			uaudio_mixer_merge_outputs(&iot->usr, info);
4720			uaudio_mixer_find_inputs_sub(
4721			    root, &iot->u.fu_v1->bSourceId, 1, info);
4722			break;
4723
4724		case UDESCSUB_AC_OUTPUT:
4725			info->bit_output[i / 8] |= (1 << (i % 8));
4726			uaudio_mixer_find_inputs_sub(
4727			    root, &iot->u.ot_v1->bSourceId, 1, info);
4728			info->bit_output[i / 8] &= ~(1 << (i % 8));
4729			break;
4730
4731		case UDESCSUB_AC_MIXER:
4732			uaudio_mixer_merge_outputs(&iot->usr, info);
4733			uaudio_mixer_find_inputs_sub(
4734			    root, iot->u.mu_v1->baSourceId,
4735			    iot->u.mu_v1->bNrInPins, info);
4736			break;
4737
4738		case UDESCSUB_AC_SELECTOR:
4739			uaudio_mixer_merge_outputs(&iot->usr, info);
4740			uaudio_mixer_find_inputs_sub(
4741			    root, iot->u.su_v1->baSourceId,
4742			    iot->u.su_v1->bNrInPins, info);
4743			break;
4744
4745		case UDESCSUB_AC_PROCESSING:
4746			uaudio_mixer_merge_outputs(&iot->usr, info);
4747			uaudio_mixer_find_inputs_sub(
4748			    root, iot->u.pu_v1->baSourceId,
4749			    iot->u.pu_v1->bNrInPins, info);
4750			break;
4751
4752		case UDESCSUB_AC_EXTENSION:
4753			uaudio_mixer_merge_outputs(&iot->usr, info);
4754			uaudio_mixer_find_inputs_sub(
4755			    root, iot->u.eu_v1->baSourceId,
4756			    iot->u.eu_v1->bNrInPins, info);
4757			break;
4758
4759		default:
4760			break;
4761		}
4762	}
4763}
4764
4765static void
4766uaudio20_mixer_find_inputs_sub(struct uaudio_terminal_node *root,
4767    const uint8_t *p_id, uint8_t n_id,
4768    struct uaudio_search_result *info)
4769{
4770	struct uaudio_terminal_node *iot;
4771	uint8_t n;
4772	uint8_t i;
4773
4774	for (n = 0; n < n_id; n++) {
4775
4776		i = p_id[n];
4777
4778		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4779			DPRINTF("avoided going into a circle at id=%d!\n", i);
4780			return;
4781		}
4782
4783		info->recurse_level++;
4784
4785		iot = (root + i);
4786
4787		if (iot->u.desc == NULL)
4788			continue;
4789
4790		switch (iot->u.desc->bDescriptorSubtype) {
4791		case UDESCSUB_AC_INPUT:
4792			uaudio_mixer_merge_outputs(&iot->usr, info);
4793			info->bit_input[i / 8] |= (1 << (i % 8));
4794			break;
4795
4796		case UDESCSUB_AC_OUTPUT:
4797			info->bit_output[i / 8] |= (1 << (i % 8));
4798			uaudio20_mixer_find_inputs_sub(
4799			    root, &iot->u.ot_v2->bSourceId, 1, info);
4800			info->bit_output[i / 8] &= ~(1 << (i % 8));
4801			break;
4802
4803		case UDESCSUB_AC_MIXER:
4804			uaudio_mixer_merge_outputs(&iot->usr, info);
4805			uaudio20_mixer_find_inputs_sub(
4806			    root, iot->u.mu_v2->baSourceId,
4807			    iot->u.mu_v2->bNrInPins, info);
4808			break;
4809
4810		case UDESCSUB_AC_SELECTOR:
4811			uaudio_mixer_merge_outputs(&iot->usr, info);
4812			uaudio20_mixer_find_inputs_sub(
4813			    root, iot->u.su_v2->baSourceId,
4814			    iot->u.su_v2->bNrInPins, info);
4815			break;
4816
4817		case UDESCSUB_AC_SAMPLE_RT:
4818			uaudio_mixer_merge_outputs(&iot->usr, info);
4819			uaudio20_mixer_find_inputs_sub(
4820			    root, &iot->u.ru_v2->bSourceId,
4821			    1, info);
4822			break;
4823
4824		case UDESCSUB_AC_EFFECT:
4825			uaudio_mixer_merge_outputs(&iot->usr, info);
4826			uaudio20_mixer_find_inputs_sub(
4827			    root, &iot->u.ef_v2->bSourceId,
4828			    1, info);
4829			break;
4830
4831		case UDESCSUB_AC_FEATURE:
4832			uaudio_mixer_merge_outputs(&iot->usr, info);
4833			uaudio20_mixer_find_inputs_sub(
4834			    root, &iot->u.fu_v2->bSourceId, 1, info);
4835			break;
4836
4837		case UDESCSUB_AC_PROCESSING_V2:
4838			uaudio_mixer_merge_outputs(&iot->usr, info);
4839			uaudio20_mixer_find_inputs_sub(
4840			    root, iot->u.pu_v2->baSourceId,
4841			    iot->u.pu_v2->bNrInPins, info);
4842			break;
4843
4844		case UDESCSUB_AC_EXTENSION_V2:
4845			uaudio_mixer_merge_outputs(&iot->usr, info);
4846			uaudio20_mixer_find_inputs_sub(
4847			    root, iot->u.eu_v2->baSourceId,
4848			    iot->u.eu_v2->bNrInPins, info);
4849			break;
4850		default:
4851			break;
4852		}
4853	}
4854}
4855
4856static void
4857uaudio20_mixer_find_clocks_sub(struct uaudio_terminal_node *root,
4858    const uint8_t *p_id, uint8_t n_id,
4859    struct uaudio_search_result *info)
4860{
4861	struct uaudio_terminal_node *iot;
4862	uint8_t n;
4863	uint8_t i;
4864	uint8_t is_last;
4865	uint8_t id;
4866
4867top:
4868	for (n = 0; n < n_id; n++) {
4869
4870		i = p_id[n];
4871
4872		if (info->recurse_level == UAUDIO_RECURSE_LIMIT) {
4873			DPRINTF("avoided going into a circle at id=%d!\n", i);
4874			return;
4875		}
4876
4877		info->recurse_level++;
4878
4879		iot = (root + i);
4880
4881		if (iot->u.desc == NULL)
4882			continue;
4883
4884		is_last = ((n + 1) == n_id);
4885
4886		switch (iot->u.desc->bDescriptorSubtype) {
4887		case UDESCSUB_AC_INPUT:
4888			info->is_input = 1;
4889			if (is_last) {
4890				p_id = &iot->u.it_v2->bCSourceId;
4891				n_id = 1;
4892				goto top;
4893			}
4894			uaudio20_mixer_find_clocks_sub(root,
4895			    &iot->u.it_v2->bCSourceId, 1, info);
4896			break;
4897
4898		case UDESCSUB_AC_OUTPUT:
4899			info->is_input = 0;
4900			if (is_last) {
4901				p_id = &iot->u.ot_v2->bCSourceId;
4902				n_id = 1;
4903				goto top;
4904			}
4905			uaudio20_mixer_find_clocks_sub(root,
4906			    &iot->u.ot_v2->bCSourceId, 1, info);
4907			break;
4908
4909		case UDESCSUB_AC_CLOCK_SEL:
4910			if (is_last) {
4911				p_id = iot->u.csel_v2->baCSourceId;
4912				n_id = iot->u.csel_v2->bNrInPins;
4913				goto top;
4914			}
4915			uaudio20_mixer_find_clocks_sub(root,
4916			    iot->u.csel_v2->baCSourceId,
4917			    iot->u.csel_v2->bNrInPins, info);
4918			break;
4919
4920		case UDESCSUB_AC_CLOCK_MUL:
4921			if (is_last) {
4922				p_id = &iot->u.cmul_v2->bCSourceId;
4923				n_id = 1;
4924				goto top;
4925			}
4926			uaudio20_mixer_find_clocks_sub(root,
4927			    &iot->u.cmul_v2->bCSourceId,
4928			    1, info);
4929			break;
4930
4931		case UDESCSUB_AC_CLOCK_SRC:
4932
4933			id = iot->u.csrc_v2->bClockId;
4934
4935			switch (info->is_input) {
4936			case 0:
4937				info->bit_output[id / 8] |= (1 << (id % 8));
4938				break;
4939			case 1:
4940				info->bit_input[id / 8] |= (1 << (id % 8));
4941				break;
4942			default:
4943				break;
4944			}
4945			break;
4946
4947		default:
4948			break;
4949		}
4950	}
4951}
4952
4953static void
4954uaudio_mixer_fill_info(struct uaudio_softc *sc,
4955    struct usb_device *udev, void *desc)
4956{
4957	const struct usb_audio_control_descriptor *acdp;
4958	struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev);
4959	const struct usb_descriptor *dp;
4960	const struct usb_audio_unit *au;
4961	struct uaudio_terminal_node *iot = NULL;
4962	uint16_t wTotalLen;
4963	uint8_t ID_max = 0;		/* inclusive */
4964	uint8_t i;
4965
4966	desc = usb_desc_foreach(cd, desc);
4967
4968	if (desc == NULL) {
4969		DPRINTF("no Audio Control header\n");
4970		goto done;
4971	}
4972	acdp = desc;
4973
4974	if ((acdp->bLength < sizeof(*acdp)) ||
4975	    (acdp->bDescriptorType != UDESC_CS_INTERFACE) ||
4976	    (acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER)) {
4977		DPRINTF("invalid Audio Control header\n");
4978		goto done;
4979	}
4980	/* "wTotalLen" is allowed to be corrupt */
4981	wTotalLen = UGETW(acdp->wTotalLength) - acdp->bLength;
4982
4983	/* get USB audio revision */
4984	sc->sc_audio_rev = UGETW(acdp->bcdADC);
4985
4986	DPRINTFN(3, "found AC header, vers=%03x, len=%d\n",
4987	    sc->sc_audio_rev, wTotalLen);
4988
4989	iot = malloc(sizeof(struct uaudio_terminal_node) * 256, M_TEMP,
4990	    M_WAITOK | M_ZERO);
4991
4992	while ((desc = usb_desc_foreach(cd, desc))) {
4993
4994		dp = desc;
4995
4996		if (dp->bLength > wTotalLen) {
4997			break;
4998		} else {
4999			wTotalLen -= dp->bLength;
5000		}
5001
5002		if (sc->sc_audio_rev >= UAUDIO_VERSION_30)
5003			au = NULL;
5004		else if (sc->sc_audio_rev >= UAUDIO_VERSION_20)
5005			au = uaudio20_mixer_verify_desc(dp, 0);
5006		else
5007			au = uaudio_mixer_verify_desc(dp, 0);
5008
5009		if (au) {
5010			iot[au->bUnitId].u.desc = (const void *)au;
5011			if (au->bUnitId > ID_max)
5012				ID_max = au->bUnitId;
5013		}
5014	}
5015
5016	DPRINTF("Maximum ID=%d\n", ID_max);
5017
5018	/*
5019	 * determine sourcing inputs for
5020	 * all nodes in the tree:
5021	 */
5022	i = ID_max;
5023	do {
5024		if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
5025			/* FALLTHROUGH */
5026		} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
5027			uaudio20_mixer_find_inputs_sub(iot,
5028			    &i, 1, &((iot + i)->usr));
5029
5030			sc->sc_mixer_clocks.is_input = 255;
5031			sc->sc_mixer_clocks.recurse_level = 0;
5032
5033			uaudio20_mixer_find_clocks_sub(iot,
5034			    &i, 1, &sc->sc_mixer_clocks);
5035		} else {
5036			uaudio_mixer_find_inputs_sub(iot,
5037			    &i, 1, &((iot + i)->usr));
5038		}
5039	} while (i--);
5040
5041	/* set "id_max" and "root" */
5042
5043	i = ID_max;
5044	do {
5045		(iot + i)->usr.id_max = ID_max;
5046		(iot + i)->root = iot;
5047	} while (i--);
5048
5049	/*
5050	 * Scan the config to create a linked list of "mixer" nodes:
5051	 */
5052
5053	i = ID_max;
5054	do {
5055		dp = iot[i].u.desc;
5056
5057		if (dp == NULL)
5058			continue;
5059
5060		DPRINTFN(11, "id=%d subtype=%d\n",
5061		    i, dp->bDescriptorSubtype);
5062
5063		if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
5064			continue;
5065		} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
5066
5067			switch (dp->bDescriptorSubtype) {
5068			case UDESCSUB_AC_HEADER:
5069				DPRINTF("unexpected AC header\n");
5070				break;
5071
5072			case UDESCSUB_AC_INPUT:
5073			case UDESCSUB_AC_OUTPUT:
5074			case UDESCSUB_AC_PROCESSING_V2:
5075			case UDESCSUB_AC_EXTENSION_V2:
5076			case UDESCSUB_AC_EFFECT:
5077			case UDESCSUB_AC_CLOCK_SRC:
5078			case UDESCSUB_AC_CLOCK_SEL:
5079			case UDESCSUB_AC_CLOCK_MUL:
5080			case UDESCSUB_AC_SAMPLE_RT:
5081				break;
5082
5083			case UDESCSUB_AC_MIXER:
5084				uaudio20_mixer_add_mixer(sc, iot, i);
5085				break;
5086
5087			case UDESCSUB_AC_SELECTOR:
5088				uaudio20_mixer_add_selector(sc, iot, i);
5089				break;
5090
5091			case UDESCSUB_AC_FEATURE:
5092				uaudio20_mixer_add_feature(sc, iot, i);
5093				break;
5094
5095			default:
5096				DPRINTF("bad AC desc subtype=0x%02x\n",
5097				    dp->bDescriptorSubtype);
5098				break;
5099			}
5100			continue;
5101		}
5102
5103		switch (dp->bDescriptorSubtype) {
5104		case UDESCSUB_AC_HEADER:
5105			DPRINTF("unexpected AC header\n");
5106			break;
5107
5108		case UDESCSUB_AC_INPUT:
5109		case UDESCSUB_AC_OUTPUT:
5110			break;
5111
5112		case UDESCSUB_AC_MIXER:
5113			uaudio_mixer_add_mixer(sc, iot, i);
5114			break;
5115
5116		case UDESCSUB_AC_SELECTOR:
5117			uaudio_mixer_add_selector(sc, iot, i);
5118			break;
5119
5120		case UDESCSUB_AC_FEATURE:
5121			uaudio_mixer_add_feature(sc, iot, i);
5122			break;
5123
5124		case UDESCSUB_AC_PROCESSING:
5125			uaudio_mixer_add_processing(sc, iot, i);
5126			break;
5127
5128		case UDESCSUB_AC_EXTENSION:
5129			uaudio_mixer_add_extension(sc, iot, i);
5130			break;
5131
5132		default:
5133			DPRINTF("bad AC desc subtype=0x%02x\n",
5134			    dp->bDescriptorSubtype);
5135			break;
5136		}
5137
5138	} while (i--);
5139
5140done:
5141	free(iot, M_TEMP);
5142}
5143
5144static int
5145uaudio_mixer_get(struct usb_device *udev, uint16_t audio_rev,
5146    uint8_t what, struct uaudio_mixer_node *mc)
5147{
5148	struct usb_device_request req;
5149	int val;
5150	uint8_t data[2 + (2 * 3)];
5151	usb_error_t err;
5152
5153	if (mc->wValue[0] == -1)
5154		return (0);
5155
5156	if (audio_rev >= UAUDIO_VERSION_30)
5157		return (0);
5158	else if (audio_rev >= UAUDIO_VERSION_20) {
5159		if (what == GET_CUR) {
5160			req.bRequest = UA20_CS_CUR;
5161			USETW(req.wLength, 2);
5162		} else {
5163			req.bRequest = UA20_CS_RANGE;
5164			USETW(req.wLength, 8);
5165		}
5166	} else {
5167		uint16_t len = MIX_SIZE(mc->type);
5168
5169		req.bRequest = what;
5170		USETW(req.wLength, len);
5171	}
5172
5173	req.bmRequestType = UT_READ_CLASS_INTERFACE;
5174	USETW(req.wValue, mc->wValue[0]);
5175	USETW(req.wIndex, mc->wIndex);
5176
5177	memset(data, 0, sizeof(data));
5178
5179	err = usbd_do_request(udev, NULL, &req, data);
5180	if (err) {
5181		DPRINTF("err=%s\n", usbd_errstr(err));
5182		return (0);
5183	}
5184
5185	if (audio_rev >= UAUDIO_VERSION_30) {
5186		val = 0;
5187	} else if (audio_rev >= UAUDIO_VERSION_20) {
5188		switch (what) {
5189		case GET_CUR:
5190			val = (data[0] | (data[1] << 8));
5191			break;
5192		case GET_MIN:
5193			val = (data[2] | (data[3] << 8));
5194			break;
5195		case GET_MAX:
5196			val = (data[4] | (data[5] << 8));
5197			break;
5198		case GET_RES:
5199			val = (data[6] | (data[7] << 8));
5200			break;
5201		default:
5202			val = 0;
5203			break;
5204		}
5205	} else {
5206		val = (data[0] | (data[1] << 8));
5207	}
5208
5209	if (what == GET_CUR || what == GET_MIN || what == GET_MAX)
5210		val = uaudio_mixer_signext(mc->type, val);
5211
5212	DPRINTFN(3, "val=%d\n", val);
5213
5214	return (val);
5215}
5216
5217static void
5218uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer, usb_error_t error)
5219{
5220	struct usb_device_request req;
5221	struct uaudio_softc *sc = usbd_xfer_softc(xfer);
5222	struct uaudio_mixer_node *mc = sc->sc_mixer_curr;
5223	struct usb_page_cache *pc;
5224	uint16_t len;
5225	uint8_t repeat = 1;
5226	uint8_t update;
5227	uint8_t chan;
5228	uint8_t buf[2];
5229
5230	DPRINTF("\n");
5231
5232	switch (USB_GET_STATE(xfer)) {
5233	case USB_ST_TRANSFERRED:
5234tr_transferred:
5235	case USB_ST_SETUP:
5236tr_setup:
5237
5238		if (mc == NULL) {
5239			mc = sc->sc_mixer_root;
5240			sc->sc_mixer_curr = mc;
5241			sc->sc_mixer_chan = 0;
5242			repeat = 0;
5243		}
5244		while (mc) {
5245			while (sc->sc_mixer_chan < mc->nchan) {
5246
5247				chan = sc->sc_mixer_chan;
5248
5249				sc->sc_mixer_chan++;
5250
5251				update = ((mc->update[chan / 8] & (1 << (chan % 8))) &&
5252				    (mc->wValue[chan] != -1));
5253
5254				mc->update[chan / 8] &= ~(1 << (chan % 8));
5255
5256				if (update) {
5257
5258					req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
5259					USETW(req.wValue, mc->wValue[chan]);
5260					USETW(req.wIndex, mc->wIndex);
5261
5262					if (sc->sc_audio_rev >= UAUDIO_VERSION_30) {
5263						return;
5264					} else if (sc->sc_audio_rev >= UAUDIO_VERSION_20) {
5265						len = 2;
5266						req.bRequest = UA20_CS_CUR;
5267						USETW(req.wLength, len);
5268					} else {
5269						len = MIX_SIZE(mc->type);
5270						req.bRequest = SET_CUR;
5271						USETW(req.wLength, len);
5272					}
5273
5274					buf[0] = (mc->wData[chan] & 0xFF);
5275					buf[1] = (mc->wData[chan] >> 8) & 0xFF;
5276
5277					pc = usbd_xfer_get_frame(xfer, 0);
5278					usbd_copy_in(pc, 0, &req, sizeof(req));
5279					pc = usbd_xfer_get_frame(xfer, 1);
5280					usbd_copy_in(pc, 0, buf, len);
5281
5282					usbd_xfer_set_frame_len(xfer, 0, sizeof(req));
5283					usbd_xfer_set_frame_len(xfer, 1, len);
5284					usbd_xfer_set_frames(xfer, len ? 2 : 1);
5285					usbd_transfer_submit(xfer);
5286					return;
5287				}
5288			}
5289
5290			mc = mc->next;
5291			sc->sc_mixer_curr = mc;
5292			sc->sc_mixer_chan = 0;
5293		}
5294
5295		if (repeat) {
5296			goto tr_setup;
5297		}
5298		break;
5299
5300	default:			/* Error */
5301		DPRINTF("error=%s\n", usbd_errstr(error));
5302		if (error == USB_ERR_CANCELLED) {
5303			/* do nothing - we are detaching */
5304			break;
5305		}
5306		goto tr_transferred;
5307	}
5308}
5309
5310static usb_error_t
5311uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed)
5312{
5313	struct usb_device_request req;
5314	uint8_t data[3];
5315
5316	DPRINTFN(6, "endpt=%d speed=%u\n", endpt, speed);
5317
5318	req.bmRequestType = UT_WRITE_CLASS_ENDPOINT;
5319	req.bRequest = SET_CUR;
5320	USETW2(req.wValue, SAMPLING_FREQ_CONTROL, 0);
5321	USETW(req.wIndex, endpt);
5322	USETW(req.wLength, 3);
5323	data[0] = speed;
5324	data[1] = speed >> 8;
5325	data[2] = speed >> 16;
5326
5327	return (usbd_do_request(udev, NULL, &req, data));
5328}
5329
5330static usb_error_t
5331uaudio20_set_speed(struct usb_device *udev, uint8_t iface_no,
5332    uint8_t clockid, uint32_t speed)
5333{
5334	struct usb_device_request req;
5335	uint8_t data[4];
5336
5337	DPRINTFN(6, "ifaceno=%d clockid=%d speed=%u\n",
5338	    iface_no, clockid, speed);
5339
5340	req.bmRequestType = UT_WRITE_CLASS_INTERFACE;
5341	req.bRequest = UA20_CS_CUR;
5342	USETW2(req.wValue, UA20_CS_SAM_FREQ_CONTROL, 0);
5343	USETW2(req.wIndex, clockid, iface_no);
5344	USETW(req.wLength, 4);
5345	data[0] = speed;
5346	data[1] = speed >> 8;
5347	data[2] = speed >> 16;
5348	data[3] = speed >> 24;
5349
5350	return (usbd_do_request(udev, NULL, &req, data));
5351}
5352
5353static int
5354uaudio_mixer_signext(uint8_t type, int val)
5355{
5356	if (!MIX_UNSIGNED(type)) {
5357		if (MIX_SIZE(type) == 2) {
5358			val = (int16_t)val;
5359		} else {
5360			val = (int8_t)val;
5361		}
5362	}
5363	return (val);
5364}
5365
5366static int
5367uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int val)
5368{
5369	if (mc->type == MIX_ON_OFF) {
5370		val = (val != 0);
5371	} else if (mc->type != MIX_SELECTOR) {
5372
5373		/* compute actual volume */
5374		val = (val * mc->mul) / 100;
5375
5376		/* add lower offset */
5377		val = val + mc->minval;
5378	}
5379	/* make sure we don't write a value out of range */
5380	if (val > mc->maxval)
5381		val = mc->maxval;
5382	else if (val < mc->minval)
5383		val = mc->minval;
5384
5385	DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n",
5386	    mc->type, val, mc->minval, mc->maxval, val);
5387	return (val);
5388}
5389
5390static void
5391uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc,
5392    uint8_t chan, int val)
5393{
5394	val = uaudio_mixer_bsd2value(mc, val);
5395
5396	mc->update[chan / 8] |= (1 << (chan % 8));
5397	mc->wData[chan] = val;
5398
5399	/* start the transfer, if not already started */
5400
5401	usbd_transfer_start(sc->sc_mixer_xfer[0]);
5402}
5403
5404static void
5405uaudio_mixer_init(struct uaudio_softc *sc, unsigned index)
5406{
5407	struct uaudio_mixer_node *mc;
5408	int32_t i;
5409
5410	if (index != 0)
5411		return;
5412	for (mc = sc->sc_mixer_root; mc; mc = mc->next) {
5413
5414		if (mc->ctl != SOUND_MIXER_NRDEVICES) {
5415			/*
5416			 * Set device mask bits. See
5417			 * /usr/include/machine/soundcard.h
5418			 */
5419			sc->sc_child[index].mix_info |= 1U << mc->ctl;
5420		}
5421		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
5422		    (mc->type == MIX_SELECTOR)) {
5423
5424			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
5425				if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES)
5426					continue;
5427				sc->sc_child[index].recsrc_info |= 1U << mc->slctrtype[i - 1];
5428			}
5429		}
5430	}
5431}
5432
5433int
5434uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m)
5435{
5436	unsigned i = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
5437
5438	DPRINTF("child=%u\n", i);
5439
5440	sc->sc_child[i].mixer_lock = mixer_get_lock(m);
5441	sc->sc_child[i].mixer_dev = m;
5442
5443	if (i == 0 &&
5444	    usbd_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index,
5445	    sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc,
5446	    sc->sc_child[i].mixer_lock)) {
5447		DPRINTFN(0, "could not allocate USB transfer for mixer!\n");
5448		return (ENOMEM);
5449	}
5450
5451	if (sc->sc_play_chan[i].num_alt > 0 &&
5452	    (sc->sc_child[i].mix_info & SOUND_MASK_VOLUME) == 0) {
5453		mix_setparentchild(m, SOUND_MIXER_VOLUME, SOUND_MASK_PCM);
5454		mix_setrealdev(m, SOUND_MIXER_VOLUME, SOUND_MIXER_NONE);
5455	}
5456	mix_setdevs(m, sc->sc_child[i].mix_info);
5457	mix_setrecdevs(m, sc->sc_child[i].recsrc_info);
5458	return (0);
5459}
5460
5461int
5462uaudio_mixer_uninit_sub(struct uaudio_softc *sc, struct snd_mixer *m)
5463{
5464  	unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
5465
5466	DPRINTF("child=%u\n", index);
5467
5468	if (index == 0)
5469		usbd_transfer_unsetup(sc->sc_mixer_xfer, 1);
5470
5471	sc->sc_child[index].mixer_lock = NULL;
5472
5473	return (0);
5474}
5475
5476void
5477uaudio_mixer_set(struct uaudio_softc *sc, struct snd_mixer *m,
5478    unsigned type, unsigned left, unsigned right)
5479{
5480    	unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
5481	struct uaudio_mixer_node *mc;
5482	int chan;
5483
5484	if (index != 0)
5485		return;
5486	for (mc = sc->sc_mixer_root; mc != NULL; mc = mc->next) {
5487		if (mc->ctl == type) {
5488			for (chan = 0; chan < mc->nchan; chan++) {
5489				uaudio_mixer_ctl_set(sc, mc, chan,
5490				    chan == 0 ? left : right);
5491			}
5492		}
5493	}
5494}
5495
5496uint32_t
5497uaudio_mixer_setrecsrc(struct uaudio_softc *sc, struct snd_mixer *m, uint32_t src)
5498{
5499      	unsigned index = uaudio_get_child_index_by_dev(sc, mix_get_dev(m));
5500	struct uaudio_mixer_node *mc;
5501	uint32_t mask;
5502	uint32_t temp;
5503	int32_t i;
5504
5505	if (index != 0)
5506		return (0);
5507	for (mc = sc->sc_mixer_root; mc; mc = mc->next) {
5508
5509		if ((mc->ctl == SOUND_MIXER_NRDEVICES) &&
5510		    (mc->type == MIX_SELECTOR)) {
5511
5512			/* compute selector mask */
5513
5514			mask = 0;
5515			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++)
5516				mask |= 1U << mc->slctrtype[i - 1];
5517
5518			temp = mask & src;
5519			if (temp == 0)
5520				continue;
5521
5522			/* find the first set bit */
5523			temp = (-temp) & temp;
5524
5525			/* update "src" */
5526			src &= ~mask;
5527			src |= temp;
5528
5529			for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) {
5530				if (temp != (1U << mc->slctrtype[i - 1]))
5531					continue;
5532				uaudio_mixer_ctl_set(sc, mc, 0, i);
5533				break;
5534			}
5535		}
5536	}
5537	return (src);
5538}
5539
5540/*========================================================================*
5541 * MIDI support routines
5542 *========================================================================*/
5543
5544static void
5545umidi_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error)
5546{
5547	struct umidi_chan *chan = usbd_xfer_softc(xfer);
5548	struct umidi_sub_chan *sub;
5549	struct usb_page_cache *pc;
5550	uint8_t buf[4];
5551	uint8_t cmd_len;
5552	uint8_t cn;
5553	uint16_t pos;
5554	int actlen;
5555
5556	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
5557
5558	switch (USB_GET_STATE(xfer)) {
5559	case USB_ST_TRANSFERRED:
5560
5561		DPRINTF("actlen=%d bytes\n", actlen);
5562
5563		pos = 0;
5564		pc = usbd_xfer_get_frame(xfer, 0);
5565
5566		while (actlen >= 4) {
5567
5568			/* copy out the MIDI data */
5569			usbd_copy_out(pc, pos, buf, 4);
5570			/* command length */
5571			cmd_len = umidi_cmd_to_len[buf[0] & 0xF];
5572			/* cable number */
5573			cn = buf[0] >> 4;
5574			/*
5575			 * Lookup sub-channel. The index is range
5576			 * checked below.
5577			 */
5578			sub = &chan->sub[cn];
5579
5580			if ((cmd_len != 0) && (cn < chan->max_emb_jack) &&
5581			    (sub->read_open != 0)) {
5582
5583				/* Send data to the application */
5584				usb_fifo_put_data_linear(
5585				    sub->fifo.fp[USB_FIFO_RX],
5586				    buf + 1, cmd_len, 1);
5587			}
5588			actlen -= 4;
5589			pos += 4;
5590		}
5591
5592	case USB_ST_SETUP:
5593		DPRINTF("start\n");
5594tr_setup:
5595		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
5596		usbd_transfer_submit(xfer);
5597		break;
5598
5599	default:
5600		DPRINTF("error=%s\n", usbd_errstr(error));
5601
5602		if (error != USB_ERR_CANCELLED) {
5603			/* try to clear stall first */
5604			usbd_xfer_set_stall(xfer);
5605			goto tr_setup;
5606		}
5607		break;
5608	}
5609}
5610
5611/*
5612 * The following statemachine, that converts MIDI commands to
5613 * USB MIDI packets, derives from Linux's usbmidi.c, which
5614 * was written by "Clemens Ladisch":
5615 *
5616 * Returns:
5617 *    0: No command
5618 * Else: Command is complete
5619 */
5620static uint8_t
5621umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b)
5622{
5623	uint8_t p0 = (cn << 4);
5624
5625	if (b >= 0xf8) {
5626		sub->temp_0[0] = p0 | 0x0f;
5627		sub->temp_0[1] = b;
5628		sub->temp_0[2] = 0;
5629		sub->temp_0[3] = 0;
5630		sub->temp_cmd = sub->temp_0;
5631		return (1);
5632
5633	} else if (b >= 0xf0) {
5634		switch (b) {
5635		case 0xf0:		/* system exclusive begin */
5636			sub->temp_1[1] = b;
5637			sub->state = UMIDI_ST_SYSEX_1;
5638			break;
5639		case 0xf1:		/* MIDI time code */
5640		case 0xf3:		/* song select */
5641			sub->temp_1[1] = b;
5642			sub->state = UMIDI_ST_1PARAM;
5643			break;
5644		case 0xf2:		/* song position pointer */
5645			sub->temp_1[1] = b;
5646			sub->state = UMIDI_ST_2PARAM_1;
5647			break;
5648		case 0xf4:		/* unknown */
5649		case 0xf5:		/* unknown */
5650			sub->state = UMIDI_ST_UNKNOWN;
5651			break;
5652		case 0xf6:		/* tune request */
5653			sub->temp_1[0] = p0 | 0x05;
5654			sub->temp_1[1] = 0xf6;
5655			sub->temp_1[2] = 0;
5656			sub->temp_1[3] = 0;
5657			sub->temp_cmd = sub->temp_1;
5658			sub->state = UMIDI_ST_UNKNOWN;
5659			return (1);
5660
5661		case 0xf7:		/* system exclusive end */
5662			switch (sub->state) {
5663			case UMIDI_ST_SYSEX_0:
5664				sub->temp_1[0] = p0 | 0x05;
5665				sub->temp_1[1] = 0xf7;
5666				sub->temp_1[2] = 0;
5667				sub->temp_1[3] = 0;
5668				sub->temp_cmd = sub->temp_1;
5669				sub->state = UMIDI_ST_UNKNOWN;
5670				return (1);
5671			case UMIDI_ST_SYSEX_1:
5672				sub->temp_1[0] = p0 | 0x06;
5673				sub->temp_1[2] = 0xf7;
5674				sub->temp_1[3] = 0;
5675				sub->temp_cmd = sub->temp_1;
5676				sub->state = UMIDI_ST_UNKNOWN;
5677				return (1);
5678			case UMIDI_ST_SYSEX_2:
5679				sub->temp_1[0] = p0 | 0x07;
5680				sub->temp_1[3] = 0xf7;
5681				sub->temp_cmd = sub->temp_1;
5682				sub->state = UMIDI_ST_UNKNOWN;
5683				return (1);
5684			}
5685			sub->state = UMIDI_ST_UNKNOWN;
5686			break;
5687		}
5688	} else if (b >= 0x80) {
5689		sub->temp_1[1] = b;
5690		if ((b >= 0xc0) && (b <= 0xdf)) {
5691			sub->state = UMIDI_ST_1PARAM;
5692		} else {
5693			sub->state = UMIDI_ST_2PARAM_1;
5694		}
5695	} else {			/* b < 0x80 */
5696		switch (sub->state) {
5697		case UMIDI_ST_1PARAM:
5698			if (sub->temp_1[1] < 0xf0) {
5699				p0 |= sub->temp_1[1] >> 4;
5700			} else {
5701				p0 |= 0x02;
5702				sub->state = UMIDI_ST_UNKNOWN;
5703			}
5704			sub->temp_1[0] = p0;
5705			sub->temp_1[2] = b;
5706			sub->temp_1[3] = 0;
5707			sub->temp_cmd = sub->temp_1;
5708			return (1);
5709		case UMIDI_ST_2PARAM_1:
5710			sub->temp_1[2] = b;
5711			sub->state = UMIDI_ST_2PARAM_2;
5712			break;
5713		case UMIDI_ST_2PARAM_2:
5714			if (sub->temp_1[1] < 0xf0) {
5715				p0 |= sub->temp_1[1] >> 4;
5716				sub->state = UMIDI_ST_2PARAM_1;
5717			} else {
5718				p0 |= 0x03;
5719				sub->state = UMIDI_ST_UNKNOWN;
5720			}
5721			sub->temp_1[0] = p0;
5722			sub->temp_1[3] = b;
5723			sub->temp_cmd = sub->temp_1;
5724			return (1);
5725		case UMIDI_ST_SYSEX_0:
5726			sub->temp_1[1] = b;
5727			sub->state = UMIDI_ST_SYSEX_1;
5728			break;
5729		case UMIDI_ST_SYSEX_1:
5730			sub->temp_1[2] = b;
5731			sub->state = UMIDI_ST_SYSEX_2;
5732			break;
5733		case UMIDI_ST_SYSEX_2:
5734			sub->temp_1[0] = p0 | 0x04;
5735			sub->temp_1[3] = b;
5736			sub->temp_cmd = sub->temp_1;
5737			sub->state = UMIDI_ST_SYSEX_0;
5738			return (1);
5739		default:
5740			break;
5741		}
5742	}
5743	return (0);
5744}
5745
5746static void
5747umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error)
5748{
5749	struct umidi_chan *chan = usbd_xfer_softc(xfer);
5750	struct umidi_sub_chan *sub;
5751	struct usb_page_cache *pc;
5752	uint32_t actlen;
5753	uint16_t nframes;
5754	uint8_t buf;
5755	uint8_t start_cable;
5756	uint8_t tr_any;
5757	int len;
5758
5759	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
5760
5761	/*
5762	 * NOTE: Some MIDI devices only accept 4 bytes of data per
5763	 * short terminated USB transfer.
5764	 */
5765	switch (USB_GET_STATE(xfer)) {
5766	case USB_ST_TRANSFERRED:
5767		DPRINTF("actlen=%d bytes\n", len);
5768
5769	case USB_ST_SETUP:
5770tr_setup:
5771		DPRINTF("start\n");
5772
5773		nframes = 0;	/* reset */
5774		start_cable = chan->curr_cable;
5775		tr_any = 0;
5776		pc = usbd_xfer_get_frame(xfer, 0);
5777
5778		while (1) {
5779
5780			/* round robin de-queueing */
5781
5782			sub = &chan->sub[chan->curr_cable];
5783
5784			if (sub->write_open) {
5785				usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX],
5786				    &buf, 1, &actlen, 0);
5787			} else {
5788				actlen = 0;
5789			}
5790
5791			if (actlen) {
5792
5793				tr_any = 1;
5794
5795				DPRINTF("byte=0x%02x from FIFO %u\n", buf,
5796				    (unsigned int)chan->curr_cable);
5797
5798				if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) {
5799
5800					DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n",
5801					    sub->temp_cmd[0], sub->temp_cmd[1],
5802					    sub->temp_cmd[2], sub->temp_cmd[3]);
5803
5804					usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4);
5805
5806					nframes++;
5807
5808					if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0))
5809						break;
5810				} else {
5811					continue;
5812				}
5813			}
5814
5815			chan->curr_cable++;
5816			if (chan->curr_cable >= chan->max_emb_jack)
5817				chan->curr_cable = 0;
5818
5819			if (chan->curr_cable == start_cable) {
5820				if (tr_any == 0)
5821					break;
5822				tr_any = 0;
5823			}
5824		}
5825
5826		if (nframes != 0) {
5827			DPRINTF("Transferring %d frames\n", (int)nframes);
5828			usbd_xfer_set_frame_len(xfer, 0, 4 * nframes);
5829			usbd_transfer_submit(xfer);
5830		}
5831		break;
5832
5833	default:			/* Error */
5834
5835		DPRINTF("error=%s\n", usbd_errstr(error));
5836
5837		if (error != USB_ERR_CANCELLED) {
5838			/* try to clear stall first */
5839			usbd_xfer_set_stall(xfer);
5840			goto tr_setup;
5841		}
5842		break;
5843	}
5844}
5845
5846static struct umidi_sub_chan *
5847umidi_sub_by_fifo(struct usb_fifo *fifo)
5848{
5849	struct umidi_chan *chan = usb_fifo_softc(fifo);
5850	struct umidi_sub_chan *sub;
5851	uint32_t n;
5852
5853	for (n = 0; n < UMIDI_EMB_JACK_MAX; n++) {
5854		sub = &chan->sub[n];
5855		if ((sub->fifo.fp[USB_FIFO_RX] == fifo) ||
5856		    (sub->fifo.fp[USB_FIFO_TX] == fifo)) {
5857			return (sub);
5858		}
5859	}
5860
5861	panic("%s:%d cannot find usb_fifo!\n",
5862	    __FILE__, __LINE__);
5863
5864	return (NULL);
5865}
5866
5867static void
5868umidi_start_read(struct usb_fifo *fifo)
5869{
5870	struct umidi_chan *chan = usb_fifo_softc(fifo);
5871
5872	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
5873}
5874
5875static void
5876umidi_stop_read(struct usb_fifo *fifo)
5877{
5878	struct umidi_chan *chan = usb_fifo_softc(fifo);
5879	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5880
5881	DPRINTF("\n");
5882
5883	sub->read_open = 0;
5884
5885	if (--(chan->read_open_refcount) == 0) {
5886		/*
5887		 * XXX don't stop the read transfer here, hence that causes
5888		 * problems with some MIDI adapters
5889		 */
5890		DPRINTF("(stopping read transfer)\n");
5891	}
5892}
5893
5894static void
5895umidi_start_write(struct usb_fifo *fifo)
5896{
5897	struct umidi_chan *chan = usb_fifo_softc(fifo);
5898
5899	if (chan->xfer[UMIDI_TX_TRANSFER] == NULL) {
5900		uint8_t buf[1];
5901		int actlen;
5902		do {
5903			/* dump data */
5904			usb_fifo_get_data_linear(fifo, buf, 1, &actlen, 0);
5905		} while (actlen > 0);
5906	} else {
5907		usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]);
5908	}
5909}
5910
5911static void
5912umidi_stop_write(struct usb_fifo *fifo)
5913{
5914	struct umidi_chan *chan = usb_fifo_softc(fifo);
5915	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5916
5917	DPRINTF("\n");
5918
5919	sub->write_open = 0;
5920
5921	if (--(chan->write_open_refcount) == 0) {
5922		DPRINTF("(stopping write transfer)\n");
5923		usbd_transfer_stop(chan->xfer[UMIDI_TX_TRANSFER]);
5924	}
5925}
5926
5927static int
5928umidi_open(struct usb_fifo *fifo, int fflags)
5929{
5930	struct umidi_chan *chan = usb_fifo_softc(fifo);
5931	struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo);
5932
5933	if (fflags & FREAD) {
5934		if (usb_fifo_alloc_buffer(fifo, 4, (1024 / 4))) {
5935			return (ENOMEM);
5936		}
5937		mtx_lock(&chan->mtx);
5938		chan->read_open_refcount++;
5939		sub->read_open = 1;
5940		mtx_unlock(&chan->mtx);
5941	}
5942	if (fflags & FWRITE) {
5943		if (usb_fifo_alloc_buffer(fifo, 32, (1024 / 32))) {
5944			return (ENOMEM);
5945		}
5946		/* clear stall first */
5947		mtx_lock(&chan->mtx);
5948		chan->write_open_refcount++;
5949		sub->write_open = 1;
5950
5951		/* reset */
5952		sub->state = UMIDI_ST_UNKNOWN;
5953		mtx_unlock(&chan->mtx);
5954	}
5955	return (0);			/* success */
5956}
5957
5958static void
5959umidi_close(struct usb_fifo *fifo, int fflags)
5960{
5961	if (fflags & FREAD) {
5962		usb_fifo_free_buffer(fifo);
5963	}
5964	if (fflags & FWRITE) {
5965		usb_fifo_free_buffer(fifo);
5966	}
5967}
5968
5969
5970static int
5971umidi_ioctl(struct usb_fifo *fifo, u_long cmd, void *data,
5972    int fflags)
5973{
5974	return (ENODEV);
5975}
5976
5977static void
5978umidi_init(device_t dev)
5979{
5980	struct uaudio_softc *sc = device_get_softc(dev);
5981	struct umidi_chan *chan = &sc->sc_midi_chan;
5982
5983	mtx_init(&chan->mtx, "umidi lock", NULL, MTX_DEF | MTX_RECURSE);
5984}
5985
5986static struct usb_fifo_methods umidi_fifo_methods = {
5987	.f_start_read = &umidi_start_read,
5988	.f_start_write = &umidi_start_write,
5989	.f_stop_read = &umidi_stop_read,
5990	.f_stop_write = &umidi_stop_write,
5991	.f_open = &umidi_open,
5992	.f_close = &umidi_close,
5993	.f_ioctl = &umidi_ioctl,
5994	.basename[0] = "umidi",
5995};
5996
5997static int
5998umidi_probe(device_t dev)
5999{
6000	struct uaudio_softc *sc = device_get_softc(dev);
6001	struct usb_attach_arg *uaa = device_get_ivars(dev);
6002	struct umidi_chan *chan = &sc->sc_midi_chan;
6003	struct umidi_sub_chan *sub;
6004	int unit = device_get_unit(dev);
6005	int error;
6006	uint32_t n;
6007
6008	if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI))
6009		chan->single_command = 1;
6010
6011	error = usbd_set_alt_interface_index(sc->sc_udev,
6012	    chan->iface_index, chan->iface_alt_index);
6013	if (error) {
6014		DPRINTF("setting of alternate index failed: %s\n",
6015		    usbd_errstr(error));
6016		goto detach;
6017	}
6018	usbd_set_parent_iface(sc->sc_udev, chan->iface_index,
6019	    sc->sc_mixer_iface_index);
6020
6021	error = usbd_transfer_setup(uaa->device, &chan->iface_index,
6022	    chan->xfer, umidi_config, UMIDI_N_TRANSFER,
6023	    chan, &chan->mtx);
6024	if (error) {
6025		DPRINTF("error=%s\n", usbd_errstr(error));
6026		goto detach;
6027	}
6028	if (chan->xfer[UMIDI_TX_TRANSFER] == NULL &&
6029	    chan->xfer[UMIDI_RX_TRANSFER] == NULL) {
6030		DPRINTF("no BULK or INTERRUPT MIDI endpoint(s) found\n");
6031		goto detach;
6032	}
6033
6034	/*
6035	 * Some USB MIDI device makers couldn't resist using
6036	 * wMaxPacketSize = 4 for RX and TX BULK endpoints, although
6037	 * that size is an unsupported value for FULL speed BULK
6038	 * endpoints. The same applies to some HIGH speed MIDI devices
6039	 * which are using a wMaxPacketSize different from 512 bytes.
6040	 *
6041	 * Refer to section 5.8.3 in USB 2.0 PDF: Cite: "All Host
6042	 * Controllers are required to have support for 8-, 16-, 32-,
6043	 * and 64-byte maximum packet sizes for full-speed bulk
6044	 * endpoints and 512 bytes for high-speed bulk endpoints."
6045	 */
6046	if (chan->xfer[UMIDI_TX_TRANSFER] != NULL &&
6047	    usbd_xfer_maxp_was_clamped(chan->xfer[UMIDI_TX_TRANSFER]))
6048		chan->single_command = 1;
6049
6050	if (chan->single_command != 0)
6051		device_printf(dev, "Single command MIDI quirk enabled\n");
6052
6053	if ((chan->max_emb_jack == 0) ||
6054	    (chan->max_emb_jack > UMIDI_EMB_JACK_MAX)) {
6055		chan->max_emb_jack = UMIDI_EMB_JACK_MAX;
6056	}
6057
6058	for (n = 0; n < chan->max_emb_jack; n++) {
6059
6060		sub = &chan->sub[n];
6061
6062		error = usb_fifo_attach(sc->sc_udev, chan, &chan->mtx,
6063		    &umidi_fifo_methods, &sub->fifo, unit, n,
6064		    chan->iface_index,
6065		    UID_ROOT, GID_OPERATOR, 0644);
6066		if (error) {
6067			goto detach;
6068		}
6069	}
6070
6071	mtx_lock(&chan->mtx);
6072
6073	/*
6074	 * NOTE: At least one device will not work properly unless the
6075	 * BULK IN pipe is open all the time. This might have to do
6076	 * about that the internal queues of the device overflow if we
6077	 * don't read them regularly.
6078	 */
6079	usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]);
6080
6081	mtx_unlock(&chan->mtx);
6082
6083	return (0);			/* success */
6084
6085detach:
6086	return (ENXIO);			/* failure */
6087}
6088
6089static int
6090umidi_detach(device_t dev)
6091{
6092	struct uaudio_softc *sc = device_get_softc(dev);
6093	struct umidi_chan *chan = &sc->sc_midi_chan;
6094	uint32_t n;
6095
6096	for (n = 0; n < UMIDI_EMB_JACK_MAX; n++)
6097		usb_fifo_detach(&chan->sub[n].fifo);
6098
6099	mtx_lock(&chan->mtx);
6100
6101	usbd_transfer_stop(chan->xfer[UMIDI_RX_TRANSFER]);
6102
6103	mtx_unlock(&chan->mtx);
6104
6105	usbd_transfer_unsetup(chan->xfer, UMIDI_N_TRANSFER);
6106
6107	mtx_destroy(&chan->mtx);
6108
6109	return (0);
6110}
6111
6112static void
6113uaudio_hid_rx_callback(struct usb_xfer *xfer, usb_error_t error)
6114{
6115	struct uaudio_softc *sc = usbd_xfer_softc(xfer);
6116	const uint8_t *buffer = usbd_xfer_get_frame_buffer(xfer, 0);
6117	struct snd_mixer *m;
6118	uint8_t id;
6119	int actlen;
6120
6121	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
6122
6123	switch (USB_GET_STATE(xfer)) {
6124	case USB_ST_TRANSFERRED:
6125		DPRINTF("actlen=%d\n", actlen);
6126
6127		if (actlen != 0 &&
6128		    (sc->sc_hid.flags & UAUDIO_HID_HAS_ID)) {
6129			id = *buffer;
6130			buffer++;
6131			actlen--;
6132		} else {
6133			id = 0;
6134		}
6135
6136		m = sc->sc_child[0].mixer_dev;
6137
6138		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_MUTE) &&
6139		    (sc->sc_hid.mute_id == id) &&
6140		    hid_get_data(buffer, actlen,
6141		    &sc->sc_hid.mute_loc)) {
6142
6143			DPRINTF("Mute toggle\n");
6144
6145			mixer_hwvol_mute_locked(m);
6146		}
6147
6148		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_UP) &&
6149		    (sc->sc_hid.volume_up_id == id) &&
6150		    hid_get_data(buffer, actlen,
6151		    &sc->sc_hid.volume_up_loc)) {
6152
6153			DPRINTF("Volume Up\n");
6154
6155			mixer_hwvol_step_locked(m, 1, 1);
6156		}
6157
6158		if ((sc->sc_hid.flags & UAUDIO_HID_HAS_VOLUME_DOWN) &&
6159		    (sc->sc_hid.volume_down_id == id) &&
6160		    hid_get_data(buffer, actlen,
6161		    &sc->sc_hid.volume_down_loc)) {
6162
6163			DPRINTF("Volume Down\n");
6164
6165			mixer_hwvol_step_locked(m, -1, -1);
6166		}
6167
6168	case USB_ST_SETUP:
6169tr_setup:
6170		/* check if we can put more data into the FIFO */
6171		usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer));
6172		usbd_transfer_submit(xfer);
6173		break;
6174
6175	default:			/* Error */
6176
6177		DPRINTF("error=%s\n", usbd_errstr(error));
6178
6179		if (error != USB_ERR_CANCELLED) {
6180			/* try to clear stall first */
6181			usbd_xfer_set_stall(xfer);
6182			goto tr_setup;
6183		}
6184		break;
6185	}
6186}
6187
6188static int
6189uaudio_hid_probe(struct uaudio_softc *sc,
6190    struct usb_attach_arg *uaa)
6191{
6192	void *d_ptr;
6193	uint32_t flags;
6194	uint16_t d_len;
6195	uint8_t id;
6196	int error;
6197
6198	if (!(sc->sc_hid.flags & UAUDIO_HID_VALID))
6199		return (-1);
6200
6201	if (sc->sc_child[0].mixer_lock == NULL)
6202		return (-1);
6203
6204	/* Get HID descriptor */
6205	error = usbd_req_get_hid_desc(uaa->device, NULL, &d_ptr,
6206	    &d_len, M_TEMP, sc->sc_hid.iface_index);
6207
6208	if (error) {
6209		DPRINTF("error reading report description\n");
6210		return (-1);
6211	}
6212
6213	/* check if there is an ID byte */
6214	hid_report_size(d_ptr, d_len, hid_input, &id);
6215
6216	if (id != 0)
6217		sc->sc_hid.flags |= UAUDIO_HID_HAS_ID;
6218
6219	if (hid_locate(d_ptr, d_len,
6220	    HID_USAGE2(HUP_CONSUMER, 0xE9 /* Volume Increment */),
6221	    hid_input, 0, &sc->sc_hid.volume_up_loc, &flags,
6222	    &sc->sc_hid.volume_up_id)) {
6223		if (flags & HIO_VARIABLE)
6224			sc->sc_hid.flags |= UAUDIO_HID_HAS_VOLUME_UP;
6225		DPRINTFN(1, "Found Volume Up key\n");
6226	}
6227
6228	if (hid_locate(d_ptr, d_len,
6229	    HID_USAGE2(HUP_CONSUMER, 0xEA /* Volume Decrement */),
6230	    hid_input, 0, &sc->sc_hid.volume_down_loc, &flags,
6231	    &sc->sc_hid.volume_down_id)) {
6232		if (flags & HIO_VARIABLE)
6233			sc->sc_hid.flags |= UAUDIO_HID_HAS_VOLUME_DOWN;
6234		DPRINTFN(1, "Found Volume Down key\n");
6235	}
6236
6237	if (hid_locate(d_ptr, d_len,
6238	    HID_USAGE2(HUP_CONSUMER, 0xE2 /* Mute */),
6239	    hid_input, 0, &sc->sc_hid.mute_loc, &flags,
6240	    &sc->sc_hid.mute_id)) {
6241		if (flags & HIO_VARIABLE)
6242			sc->sc_hid.flags |= UAUDIO_HID_HAS_MUTE;
6243		DPRINTFN(1, "Found Mute key\n");
6244	}
6245
6246	free(d_ptr, M_TEMP);
6247
6248	if (!(sc->sc_hid.flags & (UAUDIO_HID_HAS_VOLUME_UP |
6249	    UAUDIO_HID_HAS_VOLUME_DOWN |
6250	    UAUDIO_HID_HAS_MUTE))) {
6251		DPRINTFN(1, "Did not find any volume related keys\n");
6252		return (-1);
6253	}
6254
6255	/* prevent the uhid driver from attaching */
6256	usbd_set_parent_iface(uaa->device, sc->sc_hid.iface_index,
6257	    sc->sc_mixer_iface_index);
6258
6259	/* allocate USB transfers */
6260	error = usbd_transfer_setup(uaa->device, &sc->sc_hid.iface_index,
6261	    sc->sc_hid.xfer, uaudio_hid_config, UAUDIO_HID_N_TRANSFER,
6262	    sc, sc->sc_child[0].mixer_lock);
6263	if (error) {
6264		DPRINTF("error=%s\n", usbd_errstr(error));
6265		return (-1);
6266	}
6267	return (0);
6268}
6269
6270static void
6271uaudio_hid_detach(struct uaudio_softc *sc)
6272{
6273	usbd_transfer_unsetup(sc->sc_hid.xfer, UAUDIO_HID_N_TRANSFER);
6274}
6275
6276DRIVER_MODULE_ORDERED(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0, SI_ORDER_ANY);
6277MODULE_DEPEND(uaudio, usb, 1, 1, 1);
6278MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER);
6279MODULE_VERSION(uaudio, 1);
6280USB_PNP_HOST_INFO(uaudio_devs);
6281USB_PNP_HOST_INFO(uaudio_vendor_midi);
6282