The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/sound/usb/uaudio.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 686002bcc4edc7b7a6c221c475d78808


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.