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