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