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