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