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