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