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