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