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