1 /* $NetBSD: uaudio.c,v 1.91 2004/11/05 17:46:14 kent Exp $ */ 2 /* $FreeBSD$ */ 3 4 /*- 5 * Copyright (c) 1999 The NetBSD Foundation, Inc. 6 * All rights reserved. 7 * 8 * This code is derived from software contributed to The NetBSD Foundation 9 * by Lennart Augustsson (lennart@augustsson.net) at 10 * Carlstedt Research & Technology. 11 * 12 * Redistribution and use in source and binary forms, with or without 13 * modification, are permitted provided that the following conditions 14 * are met: 15 * 1. Redistributions of source code must retain the above copyright 16 * notice, this list of conditions and the following disclaimer. 17 * 2. Redistributions in binary form must reproduce the above copyright 18 * notice, this list of conditions and the following disclaimer in the 19 * documentation and/or other materials provided with the distribution. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 22 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 * POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #include <sys/cdefs.h> 35 __FBSDID("$FreeBSD$"); 36 37 /* 38 * USB audio specs: http://www.usb.org/developers/devclass_docs/audio10.pdf 39 * http://www.usb.org/developers/devclass_docs/frmts10.pdf 40 * http://www.usb.org/developers/devclass_docs/termt10.pdf 41 */ 42 43 /* 44 * Also merged: 45 * $NetBSD: uaudio.c,v 1.94 2005/01/15 15:19:53 kent Exp $ 46 * $NetBSD: uaudio.c,v 1.95 2005/01/16 06:02:19 dsainty Exp $ 47 * $NetBSD: uaudio.c,v 1.96 2005/01/16 12:46:00 kent Exp $ 48 * $NetBSD: uaudio.c,v 1.97 2005/02/24 08:19:38 martin Exp $ 49 */ 50 51 #include <sys/stdint.h> 52 #include <sys/stddef.h> 53 #include <sys/param.h> 54 #include <sys/queue.h> 55 #include <sys/types.h> 56 #include <sys/systm.h> 57 #include <sys/kernel.h> 58 #include <sys/bus.h> 59 #include <sys/module.h> 60 #include <sys/lock.h> 61 #include <sys/mutex.h> 62 #include <sys/condvar.h> 63 #include <sys/sysctl.h> 64 #include <sys/sx.h> 65 #include <sys/unistd.h> 66 #include <sys/callout.h> 67 #include <sys/malloc.h> 68 #include <sys/priv.h> 69 70 #include "usbdevs.h" 71 #include <dev/usb/usb.h> 72 #include <dev/usb/usbdi.h> 73 #include <dev/usb/usbdi_util.h> 74 75 #define USB_DEBUG_VAR uaudio_debug 76 #include <dev/usb/usb_debug.h> 77 78 #include <dev/usb/quirk/usb_quirk.h> 79 80 #include <sys/reboot.h> /* for bootverbose */ 81 82 #ifdef HAVE_KERNEL_OPTION_HEADERS 83 #include "opt_snd.h" 84 #endif 85 86 #include <dev/sound/pcm/sound.h> 87 #include <dev/sound/usb/uaudioreg.h> 88 #include <dev/sound/usb/uaudio.h> 89 #include <dev/sound/chip.h> 90 #include "feeder_if.h" 91 92 static int uaudio_default_rate = 0; /* use rate list */ 93 static int uaudio_default_bits = 32; 94 static int uaudio_default_channels = 0; /* use default */ 95 96 #ifdef USB_DEBUG 97 static int uaudio_debug = 0; 98 99 static SYSCTL_NODE(_hw_usb, OID_AUTO, uaudio, CTLFLAG_RW, 0, "USB uaudio"); 100 101 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, debug, CTLFLAG_RW, 102 &uaudio_debug, 0, "uaudio debug level"); 103 104 TUNABLE_INT("hw.usb.uaudio.default_rate", &uaudio_default_rate); 105 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_rate, CTLFLAG_RW, 106 &uaudio_default_rate, 0, "uaudio default sample rate"); 107 108 TUNABLE_INT("hw.usb.uaudio.default_bits", &uaudio_default_bits); 109 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_bits, CTLFLAG_RW, 110 &uaudio_default_bits, 0, "uaudio default sample bits"); 111 112 TUNABLE_INT("hw.usb.uaudio.default_channels", &uaudio_default_channels); 113 SYSCTL_INT(_hw_usb_uaudio, OID_AUTO, default_channels, CTLFLAG_RW, 114 &uaudio_default_channels, 0, "uaudio default sample channels"); 115 #endif 116 117 #define UAUDIO_NFRAMES 64 /* must be factor of 8 due HS-USB */ 118 #define UAUDIO_NCHANBUFS 2 /* number of outstanding request */ 119 #define UAUDIO_RECURSE_LIMIT 24 /* rounds */ 120 121 #define MAKE_WORD(h,l) (((h) << 8) | (l)) 122 #define BIT_TEST(bm,bno) (((bm)[(bno) / 8] >> (7 - ((bno) % 8))) & 1) 123 #define UAUDIO_MAX_CHAN(x) (x) 124 125 struct uaudio_mixer_node { 126 int32_t minval; 127 int32_t maxval; 128 #define MIX_MAX_CHAN 8 129 int32_t wValue[MIX_MAX_CHAN]; /* using nchan */ 130 uint32_t mul; 131 uint32_t ctl; 132 133 uint16_t wData[MIX_MAX_CHAN]; /* using nchan */ 134 uint16_t wIndex; 135 136 uint8_t update[(MIX_MAX_CHAN + 7) / 8]; 137 uint8_t nchan; 138 uint8_t type; 139 #define MIX_ON_OFF 1 140 #define MIX_SIGNED_16 2 141 #define MIX_UNSIGNED_16 3 142 #define MIX_SIGNED_8 4 143 #define MIX_SELECTOR 5 144 #define MIX_UNKNOWN 6 145 #define MIX_SIZE(n) ((((n) == MIX_SIGNED_16) || \ 146 ((n) == MIX_UNSIGNED_16)) ? 2 : 1) 147 #define MIX_UNSIGNED(n) ((n) == MIX_UNSIGNED_16) 148 149 #define MAX_SELECTOR_INPUT_PIN 256 150 uint8_t slctrtype[MAX_SELECTOR_INPUT_PIN]; 151 uint8_t class; 152 153 struct uaudio_mixer_node *next; 154 }; 155 156 struct uaudio_chan { 157 struct pcmchan_caps pcm_cap; /* capabilities */ 158 159 struct snd_dbuf *pcm_buf; 160 const struct usb_config *usb_cfg; 161 struct mtx *pcm_mtx; /* lock protecting this structure */ 162 struct uaudio_softc *priv_sc; 163 struct pcm_channel *pcm_ch; 164 struct usb_xfer *xfer[UAUDIO_NCHANBUFS]; 165 const struct usb_audio_streaming_interface_descriptor *p_asid; 166 const struct usb_audio_streaming_type1_descriptor *p_asf1d; 167 const struct usb_audio_streaming_endpoint_descriptor *p_sed; 168 const usb_endpoint_descriptor_audio_t *p_ed1; 169 const usb_endpoint_descriptor_audio_t *p_ed2; 170 const struct uaudio_format *p_fmt; 171 172 uint8_t *buf; /* pointer to buffer */ 173 uint8_t *start; /* upper layer buffer start */ 174 uint8_t *end; /* upper layer buffer end */ 175 uint8_t *cur; /* current position in upper layer 176 * buffer */ 177 178 uint32_t intr_size; /* in bytes */ 179 uint32_t intr_frames; /* in units */ 180 uint32_t sample_rate; 181 uint32_t frames_per_second; 182 uint32_t sample_rem; 183 uint32_t sample_curr; 184 185 uint32_t format; 186 uint32_t pcm_format[2]; 187 188 uint16_t bytes_per_frame[2]; 189 190 uint16_t sample_size; 191 192 uint8_t valid; 193 uint8_t iface_index; 194 uint8_t iface_alt_index; 195 }; 196 197 #define UMIDI_CABLES_MAX 16 /* units */ 198 #define UMIDI_TX_FRAMES 256 /* units */ 199 #define UMIDI_TX_BUFFER (UMIDI_TX_FRAMES * 4) /* bytes */ 200 201 enum { 202 UMIDI_TX_TRANSFER, 203 UMIDI_RX_TRANSFER, 204 UMIDI_N_TRANSFER, 205 }; 206 207 struct umidi_sub_chan { 208 struct usb_fifo_sc fifo; 209 uint8_t *temp_cmd; 210 uint8_t temp_0[4]; 211 uint8_t temp_1[4]; 212 uint8_t state; 213 #define UMIDI_ST_UNKNOWN 0 /* scan for command */ 214 #define UMIDI_ST_1PARAM 1 215 #define UMIDI_ST_2PARAM_1 2 216 #define UMIDI_ST_2PARAM_2 3 217 #define UMIDI_ST_SYSEX_0 4 218 #define UMIDI_ST_SYSEX_1 5 219 #define UMIDI_ST_SYSEX_2 6 220 221 uint8_t read_open:1; 222 uint8_t write_open:1; 223 uint8_t unused:6; 224 }; 225 226 struct umidi_chan { 227 228 struct umidi_sub_chan sub[UMIDI_CABLES_MAX]; 229 struct mtx mtx; 230 231 struct usb_xfer *xfer[UMIDI_N_TRANSFER]; 232 233 uint8_t iface_index; 234 uint8_t iface_alt_index; 235 236 uint8_t read_open_refcount; 237 uint8_t write_open_refcount; 238 239 uint8_t curr_cable; 240 uint8_t max_cable; 241 uint8_t valid; 242 uint8_t single_command; 243 }; 244 245 struct uaudio_softc { 246 struct sbuf sc_sndstat; 247 struct sndcard_func sc_sndcard_func; 248 struct uaudio_chan sc_rec_chan; 249 struct uaudio_chan sc_play_chan; 250 struct umidi_chan sc_midi_chan; 251 252 struct usb_device *sc_udev; 253 struct usb_xfer *sc_mixer_xfer[1]; 254 struct uaudio_mixer_node *sc_mixer_root; 255 struct uaudio_mixer_node *sc_mixer_curr; 256 257 uint32_t sc_mix_info; 258 uint32_t sc_recsrc_info; 259 260 uint16_t sc_audio_rev; 261 uint16_t sc_mixer_count; 262 263 uint8_t sc_sndstat_valid; 264 uint8_t sc_mixer_iface_index; 265 uint8_t sc_mixer_iface_no; 266 uint8_t sc_mixer_chan; 267 uint8_t sc_pcm_registered:1; 268 uint8_t sc_mixer_init:1; 269 uint8_t sc_uq_audio_swap_lr:1; 270 uint8_t sc_uq_au_inp_async:1; 271 uint8_t sc_uq_au_no_xu:1; 272 uint8_t sc_uq_bad_adc:1; 273 uint8_t sc_uq_au_vendor_class:1; 274 }; 275 276 struct uaudio_search_result { 277 uint8_t bit_input[(256 + 7) / 8]; 278 uint8_t bit_output[(256 + 7) / 8]; 279 uint8_t bit_visited[(256 + 7) / 8]; 280 uint8_t recurse_level; 281 uint8_t id_max; 282 }; 283 284 struct uaudio_terminal_node { 285 union { 286 const struct usb_descriptor *desc; 287 const struct usb_audio_input_terminal *it; 288 const struct usb_audio_output_terminal *ot; 289 const struct usb_audio_mixer_unit_0 *mu; 290 const struct usb_audio_selector_unit *su; 291 const struct usb_audio_feature_unit *fu; 292 const struct usb_audio_processing_unit_0 *pu; 293 const struct usb_audio_extension_unit_0 *eu; 294 } u; 295 struct uaudio_search_result usr; 296 struct uaudio_terminal_node *root; 297 }; 298 299 struct uaudio_format { 300 uint16_t wFormat; 301 uint8_t bPrecision; 302 uint32_t freebsd_fmt; 303 const char *description; 304 }; 305 306 static const struct uaudio_format uaudio_formats[] = { 307 308 {UA_FMT_PCM8, 8, AFMT_U8, "8-bit U-LE PCM"}, 309 {UA_FMT_PCM8, 16, AFMT_U16_LE, "16-bit U-LE PCM"}, 310 {UA_FMT_PCM8, 24, AFMT_U24_LE, "24-bit U-LE PCM"}, 311 {UA_FMT_PCM8, 32, AFMT_U32_LE, "32-bit U-LE PCM"}, 312 313 {UA_FMT_PCM, 8, AFMT_S8, "8-bit S-LE PCM"}, 314 {UA_FMT_PCM, 16, AFMT_S16_LE, "16-bit S-LE PCM"}, 315 {UA_FMT_PCM, 24, AFMT_S24_LE, "24-bit S-LE PCM"}, 316 {UA_FMT_PCM, 32, AFMT_S32_LE, "32-bit S-LE PCM"}, 317 318 {UA_FMT_ALAW, 8, AFMT_A_LAW, "8-bit A-Law"}, 319 {UA_FMT_MULAW, 8, AFMT_MU_LAW, "8-bit mu-Law"}, 320 321 {0, 0, 0, NULL} 322 }; 323 324 #define UAC_OUTPUT 0 325 #define UAC_INPUT 1 326 #define UAC_EQUAL 2 327 #define UAC_RECORD 3 328 #define UAC_NCLASSES 4 329 330 #ifdef USB_DEBUG 331 static const char *uac_names[] = { 332 "outputs", "inputs", "equalization", "record" 333 }; 334 335 #endif 336 337 /* prototypes */ 338 339 static device_probe_t uaudio_probe; 340 static device_attach_t uaudio_attach; 341 static device_detach_t uaudio_detach; 342 343 static usb_callback_t uaudio_chan_play_callback; 344 static usb_callback_t uaudio_chan_record_callback; 345 static usb_callback_t uaudio_mixer_write_cfg_callback; 346 static usb_callback_t umidi_bulk_read_callback; 347 static usb_callback_t umidi_bulk_write_callback; 348 349 static void uaudio_chan_fill_info_sub(struct uaudio_softc *, 350 struct usb_device *, uint32_t, uint8_t, uint8_t); 351 static void uaudio_chan_fill_info(struct uaudio_softc *, 352 struct usb_device *); 353 static void uaudio_mixer_add_ctl_sub(struct uaudio_softc *, 354 struct uaudio_mixer_node *); 355 static void uaudio_mixer_add_ctl(struct uaudio_softc *, 356 struct uaudio_mixer_node *); 357 static void uaudio_mixer_add_input(struct uaudio_softc *, 358 const struct uaudio_terminal_node *, int); 359 static void uaudio_mixer_add_output(struct uaudio_softc *, 360 const struct uaudio_terminal_node *, int); 361 static void uaudio_mixer_add_mixer(struct uaudio_softc *, 362 const struct uaudio_terminal_node *, int); 363 static void uaudio_mixer_add_selector(struct uaudio_softc *, 364 const struct uaudio_terminal_node *, int); 365 static uint32_t uaudio_mixer_feature_get_bmaControls( 366 const struct usb_audio_feature_unit *, uint8_t); 367 static void uaudio_mixer_add_feature(struct uaudio_softc *, 368 const struct uaudio_terminal_node *, int); 369 static void uaudio_mixer_add_processing_updown(struct uaudio_softc *, 370 const struct uaudio_terminal_node *, int); 371 static void uaudio_mixer_add_processing(struct uaudio_softc *, 372 const struct uaudio_terminal_node *, int); 373 static void uaudio_mixer_add_extension(struct uaudio_softc *, 374 const struct uaudio_terminal_node *, int); 375 static struct usb_audio_cluster uaudio_mixer_get_cluster(uint8_t, 376 const struct uaudio_terminal_node *); 377 static uint16_t uaudio_mixer_determine_class(const struct uaudio_terminal_node *, 378 struct uaudio_mixer_node *); 379 static uint16_t uaudio_mixer_feature_name(const struct uaudio_terminal_node *, 380 struct uaudio_mixer_node *); 381 static const struct uaudio_terminal_node *uaudio_mixer_get_input( 382 const struct uaudio_terminal_node *, uint8_t); 383 static const struct uaudio_terminal_node *uaudio_mixer_get_output( 384 const struct uaudio_terminal_node *, uint8_t); 385 static void uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *, 386 const uint8_t *, uint8_t, struct uaudio_search_result *); 387 static void uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *, 388 uint8_t, uint8_t, struct uaudio_search_result *); 389 static void uaudio_mixer_fill_info(struct uaudio_softc *, 390 struct usb_device *, void *); 391 static uint16_t uaudio_mixer_get(struct usb_device *, uint8_t, 392 struct uaudio_mixer_node *); 393 static void uaudio_mixer_ctl_set(struct uaudio_softc *, 394 struct uaudio_mixer_node *, uint8_t, int32_t val); 395 static usb_error_t uaudio_set_speed(struct usb_device *, uint8_t, uint32_t); 396 static int uaudio_mixer_signext(uint8_t, int); 397 static int uaudio_mixer_bsd2value(struct uaudio_mixer_node *, int32_t val); 398 static const void *uaudio_mixer_verify_desc(const void *, uint32_t); 399 static void uaudio_mixer_init(struct uaudio_softc *); 400 static uint8_t umidi_convert_to_usb(struct umidi_sub_chan *, uint8_t, uint8_t); 401 static struct umidi_sub_chan *umidi_sub_by_fifo(struct usb_fifo *); 402 static void umidi_start_read(struct usb_fifo *); 403 static void umidi_stop_read(struct usb_fifo *); 404 static void umidi_start_write(struct usb_fifo *); 405 static void umidi_stop_write(struct usb_fifo *); 406 static int umidi_open(struct usb_fifo *, int); 407 static int umidi_ioctl(struct usb_fifo *, u_long cmd, void *, int); 408 static void umidi_close(struct usb_fifo *, int); 409 static void umidi_init(device_t dev); 410 static int umidi_probe(device_t dev); 411 static int umidi_detach(device_t dev); 412 413 #ifdef USB_DEBUG 414 static void uaudio_chan_dump_ep_desc( 415 const usb_endpoint_descriptor_audio_t *); 416 static void uaudio_mixer_dump_cluster(uint8_t, 417 const struct uaudio_terminal_node *); 418 static const char *uaudio_mixer_get_terminal_name(uint16_t); 419 #endif 420 421 static const struct usb_config 422 uaudio_cfg_record[UAUDIO_NCHANBUFS] = { 423 [0] = { 424 .type = UE_ISOCHRONOUS, 425 .endpoint = UE_ADDR_ANY, 426 .direction = UE_DIR_IN, 427 .bufsize = 0, /* use "wMaxPacketSize * frames" */ 428 .frames = UAUDIO_NFRAMES, 429 .flags = {.short_xfer_ok = 1,}, 430 .callback = &uaudio_chan_record_callback, 431 }, 432 433 [1] = { 434 .type = UE_ISOCHRONOUS, 435 .endpoint = UE_ADDR_ANY, 436 .direction = UE_DIR_IN, 437 .bufsize = 0, /* use "wMaxPacketSize * frames" */ 438 .frames = UAUDIO_NFRAMES, 439 .flags = {.short_xfer_ok = 1,}, 440 .callback = &uaudio_chan_record_callback, 441 }, 442 }; 443 444 static const struct usb_config 445 uaudio_cfg_play[UAUDIO_NCHANBUFS] = { 446 [0] = { 447 .type = UE_ISOCHRONOUS, 448 .endpoint = UE_ADDR_ANY, 449 .direction = UE_DIR_OUT, 450 .bufsize = 0, /* use "wMaxPacketSize * frames" */ 451 .frames = UAUDIO_NFRAMES, 452 .flags = {.short_xfer_ok = 1,}, 453 .callback = &uaudio_chan_play_callback, 454 }, 455 456 [1] = { 457 .type = UE_ISOCHRONOUS, 458 .endpoint = UE_ADDR_ANY, 459 .direction = UE_DIR_OUT, 460 .bufsize = 0, /* use "wMaxPacketSize * frames" */ 461 .frames = UAUDIO_NFRAMES, 462 .flags = {.short_xfer_ok = 1,}, 463 .callback = &uaudio_chan_play_callback, 464 }, 465 }; 466 467 static const struct usb_config 468 uaudio_mixer_config[1] = { 469 [0] = { 470 .type = UE_CONTROL, 471 .endpoint = 0x00, /* Control pipe */ 472 .direction = UE_DIR_ANY, 473 .bufsize = (sizeof(struct usb_device_request) + 4), 474 .callback = &uaudio_mixer_write_cfg_callback, 475 .timeout = 1000, /* 1 second */ 476 }, 477 }; 478 479 static const 480 uint8_t umidi_cmd_to_len[16] = { 481 [0x0] = 0, /* reserved */ 482 [0x1] = 0, /* reserved */ 483 [0x2] = 2, /* bytes */ 484 [0x3] = 3, /* bytes */ 485 [0x4] = 3, /* bytes */ 486 [0x5] = 1, /* bytes */ 487 [0x6] = 2, /* bytes */ 488 [0x7] = 3, /* bytes */ 489 [0x8] = 3, /* bytes */ 490 [0x9] = 3, /* bytes */ 491 [0xA] = 3, /* bytes */ 492 [0xB] = 3, /* bytes */ 493 [0xC] = 2, /* bytes */ 494 [0xD] = 2, /* bytes */ 495 [0xE] = 3, /* bytes */ 496 [0xF] = 1, /* bytes */ 497 }; 498 499 static const struct usb_config 500 umidi_config[UMIDI_N_TRANSFER] = { 501 [UMIDI_TX_TRANSFER] = { 502 .type = UE_BULK, 503 .endpoint = UE_ADDR_ANY, 504 .direction = UE_DIR_OUT, 505 .bufsize = UMIDI_TX_BUFFER, 506 .callback = &umidi_bulk_write_callback, 507 }, 508 509 [UMIDI_RX_TRANSFER] = { 510 .type = UE_BULK, 511 .endpoint = UE_ADDR_ANY, 512 .direction = UE_DIR_IN, 513 .bufsize = 4, /* bytes */ 514 .flags = {.short_xfer_ok = 1,.proxy_buffer = 1,}, 515 .callback = &umidi_bulk_read_callback, 516 }, 517 }; 518 519 static devclass_t uaudio_devclass; 520 521 static device_method_t uaudio_methods[] = { 522 DEVMETHOD(device_probe, uaudio_probe), 523 DEVMETHOD(device_attach, uaudio_attach), 524 DEVMETHOD(device_detach, uaudio_detach), 525 DEVMETHOD(device_suspend, bus_generic_suspend), 526 DEVMETHOD(device_resume, bus_generic_resume), 527 DEVMETHOD(device_shutdown, bus_generic_shutdown), 528 529 DEVMETHOD_END 530 }; 531 532 static driver_t uaudio_driver = { 533 .name = "uaudio", 534 .methods = uaudio_methods, 535 .size = sizeof(struct uaudio_softc), 536 }; 537 538 static const STRUCT_USB_HOST_ID __used uaudio_devs[] = { 539 /* Generic USB audio class match */ 540 {USB_IFACE_CLASS(UICLASS_AUDIO), 541 USB_IFACE_SUBCLASS(UISUBCLASS_AUDIOCONTROL),}, 542 /* Generic USB MIDI class match */ 543 {USB_IFACE_CLASS(UICLASS_AUDIO), 544 USB_IFACE_SUBCLASS(UISUBCLASS_MIDISTREAM),}, 545 }; 546 547 static int 548 uaudio_probe(device_t dev) 549 { 550 struct usb_attach_arg *uaa = device_get_ivars(dev); 551 552 if (uaa->usb_mode != USB_MODE_HOST) 553 return (ENXIO); 554 555 /* lookup non-standard device */ 556 557 if (uaa->info.bInterfaceClass != UICLASS_AUDIO) { 558 if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS) == 0) 559 return (ENXIO); 560 } 561 562 /* check for AUDIO control interface */ 563 564 if (uaa->info.bInterfaceSubClass == UISUBCLASS_AUDIOCONTROL) { 565 if (usb_test_quirk(uaa, UQ_BAD_AUDIO)) 566 return (ENXIO); 567 else 568 return (BUS_PROBE_GENERIC); 569 } 570 571 /* check for MIDI stream */ 572 573 if (uaa->info.bInterfaceSubClass == UISUBCLASS_MIDISTREAM) { 574 if (usb_test_quirk(uaa, UQ_BAD_MIDI)) 575 return (ENXIO); 576 else 577 return (BUS_PROBE_GENERIC); 578 } 579 return (ENXIO); 580 } 581 582 static int 583 uaudio_attach(device_t dev) 584 { 585 struct usb_attach_arg *uaa = device_get_ivars(dev); 586 struct uaudio_softc *sc = device_get_softc(dev); 587 struct usb_interface_descriptor *id; 588 device_t child; 589 590 sc->sc_play_chan.priv_sc = sc; 591 sc->sc_rec_chan.priv_sc = sc; 592 sc->sc_udev = uaa->device; 593 sc->sc_mixer_iface_index = uaa->info.bIfaceIndex; 594 sc->sc_mixer_iface_no = uaa->info.bIfaceNum; 595 596 if (usb_test_quirk(uaa, UQ_AUDIO_SWAP_LR)) 597 sc->sc_uq_audio_swap_lr = 1; 598 599 if (usb_test_quirk(uaa, UQ_AU_INP_ASYNC)) 600 sc->sc_uq_au_inp_async = 1; 601 602 if (usb_test_quirk(uaa, UQ_AU_NO_XU)) 603 sc->sc_uq_au_no_xu = 1; 604 605 if (usb_test_quirk(uaa, UQ_BAD_ADC)) 606 sc->sc_uq_bad_adc = 1; 607 608 if (usb_test_quirk(uaa, UQ_AU_VENDOR_CLASS)) 609 sc->sc_uq_au_vendor_class = 1; 610 611 umidi_init(dev); 612 613 device_set_usb_desc(dev); 614 615 id = usbd_get_interface_descriptor(uaa->iface); 616 617 uaudio_chan_fill_info(sc, uaa->device); 618 619 uaudio_mixer_fill_info(sc, uaa->device, id); 620 621 DPRINTF("audio rev %d.%02x\n", 622 sc->sc_audio_rev >> 8, 623 sc->sc_audio_rev & 0xff); 624 625 DPRINTF("%d mixer controls\n", 626 sc->sc_mixer_count); 627 628 if (sc->sc_play_chan.valid) { 629 device_printf(dev, "Play: %d Hz, %d ch, %s format.\n", 630 sc->sc_play_chan.sample_rate, 631 sc->sc_play_chan.p_asf1d->bNrChannels, 632 sc->sc_play_chan.p_fmt->description); 633 } else { 634 device_printf(dev, "No playback.\n"); 635 } 636 637 if (sc->sc_rec_chan.valid) { 638 device_printf(dev, "Record: %d Hz, %d ch, %s format.\n", 639 sc->sc_rec_chan.sample_rate, 640 sc->sc_rec_chan.p_asf1d->bNrChannels, 641 sc->sc_rec_chan.p_fmt->description); 642 } else { 643 device_printf(dev, "No recording.\n"); 644 } 645 646 if (sc->sc_midi_chan.valid) { 647 648 if (umidi_probe(dev)) { 649 goto detach; 650 } 651 device_printf(dev, "MIDI sequencer.\n"); 652 } else { 653 device_printf(dev, "No midi sequencer.\n"); 654 } 655 656 DPRINTF("doing child attach\n"); 657 658 /* attach the children */ 659 660 sc->sc_sndcard_func.func = SCF_PCM; 661 662 /* 663 * Only attach a PCM device if we have a playback, recording 664 * or mixer device present: 665 */ 666 if (sc->sc_play_chan.valid || 667 sc->sc_rec_chan.valid || 668 sc->sc_mix_info) { 669 child = device_add_child(dev, "pcm", -1); 670 671 if (child == NULL) { 672 DPRINTF("out of memory\n"); 673 goto detach; 674 } 675 device_set_ivars(child, &sc->sc_sndcard_func); 676 } 677 678 if (bus_generic_attach(dev)) { 679 DPRINTF("child attach failed\n"); 680 goto detach; 681 } 682 return (0); /* success */ 683 684 detach: 685 uaudio_detach(dev); 686 return (ENXIO); 687 } 688 689 static void 690 uaudio_pcm_setflags(device_t dev, uint32_t flags) 691 { 692 pcm_setflags(dev, pcm_getflags(dev) | flags); 693 } 694 695 int 696 uaudio_attach_sub(device_t dev, kobj_class_t mixer_class, kobj_class_t chan_class) 697 { 698 struct uaudio_softc *sc = device_get_softc(device_get_parent(dev)); 699 char status[SND_STATUSLEN]; 700 701 uaudio_mixer_init(sc); 702 703 if (sc->sc_uq_audio_swap_lr) { 704 DPRINTF("hardware has swapped left and right\n"); 705 /* uaudio_pcm_setflags(dev, SD_F_PSWAPLR); */ 706 } 707 if (!(sc->sc_mix_info & SOUND_MASK_PCM)) { 708 709 DPRINTF("emulating master volume\n"); 710 711 /* 712 * Emulate missing pcm mixer controller 713 * through FEEDER_VOLUME 714 */ 715 uaudio_pcm_setflags(dev, SD_F_SOFTPCMVOL); 716 } 717 if (mixer_init(dev, mixer_class, sc)) { 718 goto detach; 719 } 720 sc->sc_mixer_init = 1; 721 722 snprintf(status, sizeof(status), "at ? %s", PCM_KLDSTRING(snd_uaudio)); 723 724 if (pcm_register(dev, sc, 725 sc->sc_play_chan.valid ? 1 : 0, 726 sc->sc_rec_chan.valid ? 1 : 0)) { 727 goto detach; 728 } 729 730 uaudio_pcm_setflags(dev, SD_F_MPSAFE); 731 sc->sc_pcm_registered = 1; 732 733 if (sc->sc_play_chan.valid) { 734 pcm_addchan(dev, PCMDIR_PLAY, chan_class, sc); 735 } 736 if (sc->sc_rec_chan.valid) { 737 pcm_addchan(dev, PCMDIR_REC, chan_class, sc); 738 } 739 pcm_setstatus(dev, status); 740 741 return (0); /* success */ 742 743 detach: 744 uaudio_detach_sub(dev); 745 return (ENXIO); 746 } 747 748 int 749 uaudio_detach_sub(device_t dev) 750 { 751 struct uaudio_softc *sc = device_get_softc(device_get_parent(dev)); 752 int error = 0; 753 754 repeat: 755 if (sc->sc_pcm_registered) { 756 error = pcm_unregister(dev); 757 } else { 758 if (sc->sc_mixer_init) { 759 error = mixer_uninit(dev); 760 } 761 } 762 763 if (error) { 764 device_printf(dev, "Waiting for sound application to exit!\n"); 765 usb_pause_mtx(NULL, 2 * hz); 766 goto repeat; /* try again */ 767 } 768 return (0); /* success */ 769 } 770 771 static int 772 uaudio_detach(device_t dev) 773 { 774 struct uaudio_softc *sc = device_get_softc(dev); 775 776 /* 777 * Stop USB transfers early so that any audio applications 778 * will time out and close opened /dev/dspX.Y device(s), if 779 * any. 780 */ 781 if (sc->sc_play_chan.valid) 782 usbd_transfer_unsetup(sc->sc_play_chan.xfer, UAUDIO_NCHANBUFS); 783 if (sc->sc_rec_chan.valid) 784 usbd_transfer_unsetup(sc->sc_rec_chan.xfer, UAUDIO_NCHANBUFS); 785 786 if (bus_generic_detach(dev) != 0) { 787 DPRINTF("detach failed!\n"); 788 } 789 sbuf_delete(&sc->sc_sndstat); 790 sc->sc_sndstat_valid = 0; 791 792 umidi_detach(dev); 793 794 return (0); 795 } 796 797 /*========================================================================* 798 * AS - Audio Stream - routines 799 *========================================================================*/ 800 801 #ifdef USB_DEBUG 802 static void 803 uaudio_chan_dump_ep_desc(const usb_endpoint_descriptor_audio_t *ed) 804 { 805 if (ed) { 806 DPRINTF("endpoint=%p bLength=%d bDescriptorType=%d \n" 807 "bEndpointAddress=%d bmAttributes=0x%x \n" 808 "wMaxPacketSize=%d bInterval=%d \n" 809 "bRefresh=%d bSynchAddress=%d\n", 810 ed, ed->bLength, ed->bDescriptorType, 811 ed->bEndpointAddress, ed->bmAttributes, 812 UGETW(ed->wMaxPacketSize), ed->bInterval, 813 UEP_HAS_REFRESH(ed) ? ed->bRefresh : 0, 814 UEP_HAS_SYNCADDR(ed) ? ed->bSynchAddress : 0); 815 } 816 } 817 818 #endif 819 820 /* 821 * The following is a workaround for broken no-name USB audio devices 822 * sold by dealextreme called "3D sound". The problem is that the 823 * manufacturer computed wMaxPacketSize is too small to hold the 824 * actual data sent. In other words the device sometimes sends more 825 * data than it actually reports it can send in a single isochronous 826 * packet. 827 */ 828 static void 829 uaudio_record_fix_fs(usb_endpoint_descriptor_audio_t *ep, 830 uint32_t xps, uint32_t add) 831 { 832 uint32_t mps; 833 834 mps = UGETW(ep->wMaxPacketSize); 835 836 /* 837 * If the device indicates it can send more data than what the 838 * sample rate indicates, we apply the workaround. 839 */ 840 if (mps > xps) { 841 842 /* allow additional data */ 843 xps += add; 844 845 /* check against the maximum USB 1.x length */ 846 if (xps > 1023) 847 xps = 1023; 848 849 /* check if we should do an update */ 850 if (mps < xps) { 851 /* simply update the wMaxPacketSize field */ 852 USETW(ep->wMaxPacketSize, xps); 853 DPRINTF("Workaround: Updated wMaxPacketSize " 854 "from %d to %d bytes.\n", 855 (int)mps, (int)xps); 856 } 857 } 858 } 859 860 static void 861 uaudio_chan_fill_info_sub(struct uaudio_softc *sc, struct usb_device *udev, 862 uint32_t rate, uint8_t channels, uint8_t bit_resolution) 863 { 864 struct usb_descriptor *desc = NULL; 865 const struct usb_audio_streaming_interface_descriptor *asid = NULL; 866 const struct usb_audio_streaming_type1_descriptor *asf1d = NULL; 867 const struct usb_audio_streaming_endpoint_descriptor *sed = NULL; 868 usb_endpoint_descriptor_audio_t *ed1 = NULL; 869 const usb_endpoint_descriptor_audio_t *ed2 = NULL; 870 struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev); 871 struct usb_interface_descriptor *id; 872 const struct uaudio_format *p_fmt; 873 struct uaudio_chan *chan; 874 uint16_t curidx = 0xFFFF; 875 uint16_t lastidx = 0xFFFF; 876 uint16_t alt_index = 0; 877 uint16_t wFormat; 878 uint8_t ep_dir; 879 uint8_t bChannels; 880 uint8_t bBitResolution; 881 uint8_t x; 882 uint8_t audio_if = 0; 883 uint8_t uma_if_class; 884 885 while ((desc = usb_desc_foreach(cd, desc))) { 886 887 if ((desc->bDescriptorType == UDESC_INTERFACE) && 888 (desc->bLength >= sizeof(*id))) { 889 890 id = (void *)desc; 891 892 if (id->bInterfaceNumber != lastidx) { 893 lastidx = id->bInterfaceNumber; 894 curidx++; 895 alt_index = 0; 896 897 } else { 898 alt_index++; 899 } 900 901 uma_if_class = 902 ((id->bInterfaceClass == UICLASS_AUDIO) || 903 ((id->bInterfaceClass == UICLASS_VENDOR) && 904 (sc->sc_uq_au_vendor_class != 0))); 905 906 if ((uma_if_class != 0) && (id->bInterfaceSubClass == UISUBCLASS_AUDIOSTREAM)) { 907 audio_if = 1; 908 } else { 909 audio_if = 0; 910 } 911 912 if ((uma_if_class != 0) && 913 (id->bInterfaceSubClass == UISUBCLASS_MIDISTREAM)) { 914 915 /* 916 * XXX could allow multiple MIDI interfaces 917 */ 918 919 if ((sc->sc_midi_chan.valid == 0) && 920 usbd_get_iface(udev, curidx)) { 921 sc->sc_midi_chan.iface_index = curidx; 922 sc->sc_midi_chan.iface_alt_index = alt_index; 923 sc->sc_midi_chan.valid = 1; 924 } 925 } 926 asid = NULL; 927 asf1d = NULL; 928 ed1 = NULL; 929 ed2 = NULL; 930 sed = NULL; 931 } 932 if ((desc->bDescriptorType == UDESC_CS_INTERFACE) && 933 (desc->bDescriptorSubtype == AS_GENERAL) && 934 (desc->bLength >= sizeof(*asid))) { 935 if (asid == NULL) { 936 asid = (void *)desc; 937 } 938 } 939 if ((desc->bDescriptorType == UDESC_CS_INTERFACE) && 940 (desc->bDescriptorSubtype == FORMAT_TYPE) && 941 (desc->bLength >= sizeof(*asf1d))) { 942 if (asf1d == NULL) { 943 asf1d = (void *)desc; 944 if (asf1d->bFormatType != FORMAT_TYPE_I) { 945 DPRINTFN(11, "ignored bFormatType = %d\n", 946 asf1d->bFormatType); 947 asf1d = NULL; 948 continue; 949 } 950 if (asf1d->bLength < (sizeof(*asf1d) + 951 ((asf1d->bSamFreqType == 0) ? 6 : 952 (asf1d->bSamFreqType * 3)))) { 953 DPRINTFN(11, "'asf1d' descriptor is too short\n"); 954 asf1d = NULL; 955 continue; 956 } 957 } 958 } 959 if ((desc->bDescriptorType == UDESC_ENDPOINT) && 960 (desc->bLength >= UEP_MINSIZE)) { 961 if (ed1 == NULL) { 962 ed1 = (void *)desc; 963 if (UE_GET_XFERTYPE(ed1->bmAttributes) != UE_ISOCHRONOUS) { 964 ed1 = NULL; 965 } 966 } 967 } 968 if ((desc->bDescriptorType == UDESC_CS_ENDPOINT) && 969 (desc->bDescriptorSubtype == AS_GENERAL) && 970 (desc->bLength >= sizeof(*sed))) { 971 if (sed == NULL) { 972 sed = (void *)desc; 973 } 974 } 975 if (audio_if && asid && asf1d && ed1 && sed) { 976 977 ep_dir = UE_GET_DIR(ed1->bEndpointAddress); 978 979 /* We ignore sync endpoint information until further. */ 980 981 wFormat = UGETW(asid->wFormatTag); 982 bChannels = UAUDIO_MAX_CHAN(asf1d->bNrChannels); 983 bBitResolution = asf1d->bBitResolution; 984 985 if (asf1d->bSamFreqType == 0) { 986 DPRINTFN(16, "Sample rate: %d-%dHz\n", 987 UA_SAMP_LO(asf1d), UA_SAMP_HI(asf1d)); 988 989 if ((rate >= UA_SAMP_LO(asf1d)) && 990 (rate <= UA_SAMP_HI(asf1d))) { 991 goto found_rate; 992 } 993 } else { 994 995 for (x = 0; x < asf1d->bSamFreqType; x++) { 996 DPRINTFN(16, "Sample rate = %dHz\n", 997 UA_GETSAMP(asf1d, x)); 998 999 if (rate == UA_GETSAMP(asf1d, x)) { 1000 goto found_rate; 1001 } 1002 } 1003 } 1004 1005 audio_if = 0; 1006 continue; 1007 1008 found_rate: 1009 1010 for (p_fmt = uaudio_formats; 1011 p_fmt->wFormat; 1012 p_fmt++) { 1013 if ((p_fmt->wFormat == wFormat) && 1014 (p_fmt->bPrecision == bBitResolution)) { 1015 goto found_format; 1016 } 1017 } 1018 1019 audio_if = 0; 1020 continue; 1021 1022 found_format: 1023 1024 if ((bChannels == channels) && 1025 (bBitResolution == bit_resolution)) { 1026 1027 chan = (ep_dir == UE_DIR_IN) ? 1028 &sc->sc_rec_chan : 1029 &sc->sc_play_chan; 1030 1031 if ((chan->valid == 0) && usbd_get_iface(udev, curidx)) { 1032 1033 chan->valid = 1; 1034 #ifdef USB_DEBUG 1035 uaudio_chan_dump_ep_desc(ed1); 1036 uaudio_chan_dump_ep_desc(ed2); 1037 1038 if (sed->bmAttributes & UA_SED_FREQ_CONTROL) { 1039 DPRINTFN(2, "FREQ_CONTROL\n"); 1040 } 1041 if (sed->bmAttributes & UA_SED_PITCH_CONTROL) { 1042 DPRINTFN(2, "PITCH_CONTROL\n"); 1043 } 1044 #endif 1045 DPRINTF("Sample rate = %dHz, channels = %d, " 1046 "bits = %d, format = %s\n", rate, channels, 1047 bit_resolution, p_fmt->description); 1048 1049 chan->sample_rate = rate; 1050 chan->p_asid = asid; 1051 chan->p_asf1d = asf1d; 1052 chan->p_ed1 = ed1; 1053 chan->p_ed2 = ed2; 1054 chan->p_fmt = p_fmt; 1055 chan->p_sed = sed; 1056 chan->iface_index = curidx; 1057 chan->iface_alt_index = alt_index; 1058 1059 if (ep_dir == UE_DIR_IN) 1060 chan->usb_cfg = 1061 uaudio_cfg_record; 1062 else 1063 chan->usb_cfg = 1064 uaudio_cfg_play; 1065 1066 chan->sample_size = (( 1067 UAUDIO_MAX_CHAN(chan->p_asf1d->bNrChannels) * 1068 chan->p_asf1d->bBitResolution) / 8); 1069 1070 if (ep_dir == UE_DIR_IN && 1071 usbd_get_speed(udev) == USB_SPEED_FULL) { 1072 uaudio_record_fix_fs(ed1, 1073 chan->sample_size * (rate / 1000), 1074 chan->sample_size * (rate / 4000)); 1075 } 1076 1077 if (sc->sc_sndstat_valid) { 1078 sbuf_printf(&sc->sc_sndstat, "\n\t" 1079 "mode %d.%d:(%s) %dch, %d/%dbit, %s, %dHz", 1080 curidx, alt_index, 1081 (ep_dir == UE_DIR_IN) ? "input" : "output", 1082 asf1d->bNrChannels, asf1d->bBitResolution, 1083 asf1d->bSubFrameSize * 8, 1084 p_fmt->description, rate); 1085 } 1086 } 1087 } 1088 audio_if = 0; 1089 continue; 1090 } 1091 } 1092 } 1093 1094 /* This structure defines all the supported rates. */ 1095 1096 static const uint32_t uaudio_rate_list[] = { 1097 96000, 1098 88000, 1099 80000, 1100 72000, 1101 64000, 1102 56000, 1103 48000, 1104 44100, 1105 40000, 1106 32000, 1107 24000, 1108 22050, 1109 16000, 1110 11025, 1111 8000, 1112 0 1113 }; 1114 1115 static void 1116 uaudio_chan_fill_info(struct uaudio_softc *sc, struct usb_device *udev) 1117 { 1118 uint32_t rate = uaudio_default_rate; 1119 uint8_t z; 1120 uint8_t bits = uaudio_default_bits; 1121 uint8_t y; 1122 uint8_t channels = uaudio_default_channels; 1123 uint8_t x; 1124 1125 bits -= (bits % 8); 1126 if ((bits == 0) || (bits > 32)) { 1127 /* set a valid value */ 1128 bits = 32; 1129 } 1130 if (channels == 0) { 1131 switch (usbd_get_speed(udev)) { 1132 case USB_SPEED_LOW: 1133 case USB_SPEED_FULL: 1134 /* 1135 * Due to high bandwidth usage and problems 1136 * with HIGH-speed split transactions we 1137 * disable surround setups on FULL-speed USB 1138 * by default 1139 */ 1140 channels = 2; 1141 break; 1142 default: 1143 channels = 16; 1144 break; 1145 } 1146 } else if (channels > 16) { 1147 channels = 16; 1148 } 1149 if (sbuf_new(&sc->sc_sndstat, NULL, 4096, SBUF_AUTOEXTEND)) { 1150 sc->sc_sndstat_valid = 1; 1151 } 1152 /* try to search for a valid config */ 1153 1154 for (x = channels; x; x--) { 1155 for (y = bits; y; y -= 8) { 1156 1157 /* try user defined rate, if any */ 1158 if (rate != 0) 1159 uaudio_chan_fill_info_sub(sc, udev, rate, x, y); 1160 1161 /* try find a matching rate, if any */ 1162 for (z = 0; uaudio_rate_list[z]; z++) { 1163 uaudio_chan_fill_info_sub(sc, udev, uaudio_rate_list[z], x, y); 1164 1165 if (sc->sc_rec_chan.valid && 1166 sc->sc_play_chan.valid) { 1167 goto done; 1168 } 1169 } 1170 } 1171 } 1172 1173 done: 1174 if (sc->sc_sndstat_valid) { 1175 sbuf_finish(&sc->sc_sndstat); 1176 } 1177 } 1178 1179 static void 1180 uaudio_chan_play_callback(struct usb_xfer *xfer, usb_error_t error) 1181 { 1182 struct uaudio_chan *ch = usbd_xfer_softc(xfer); 1183 struct usb_page_cache *pc; 1184 uint32_t total; 1185 uint32_t blockcount; 1186 uint32_t n; 1187 uint32_t offset; 1188 int actlen; 1189 int sumlen; 1190 1191 usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL); 1192 1193 if (ch->end == ch->start) { 1194 DPRINTF("no buffer!\n"); 1195 return; 1196 } 1197 1198 switch (USB_GET_STATE(xfer)) { 1199 case USB_ST_TRANSFERRED: 1200 tr_transferred: 1201 if (actlen < sumlen) { 1202 DPRINTF("short transfer, " 1203 "%d of %d bytes\n", actlen, sumlen); 1204 } 1205 chn_intr(ch->pcm_ch); 1206 1207 case USB_ST_SETUP: 1208 if (ch->bytes_per_frame[1] > usbd_xfer_max_framelen(xfer)) { 1209 DPRINTF("bytes per transfer, %d, " 1210 "exceeds maximum, %d!\n", 1211 ch->bytes_per_frame[1], 1212 usbd_xfer_max_framelen(xfer)); 1213 break; 1214 } 1215 1216 blockcount = ch->intr_frames; 1217 1218 /* setup number of frames */ 1219 usbd_xfer_set_frames(xfer, blockcount); 1220 1221 /* reset total length */ 1222 total = 0; 1223 1224 /* setup frame lengths */ 1225 for (n = 0; n != blockcount; n++) { 1226 ch->sample_curr += ch->sample_rem; 1227 if (ch->sample_curr >= ch->frames_per_second) { 1228 ch->sample_curr -= ch->frames_per_second; 1229 usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[1]); 1230 total += ch->bytes_per_frame[1]; 1231 } else { 1232 usbd_xfer_set_frame_len(xfer, n, ch->bytes_per_frame[0]); 1233 total += ch->bytes_per_frame[0]; 1234 } 1235 } 1236 1237 DPRINTFN(6, "transfer %d bytes\n", total); 1238 1239 offset = 0; 1240 1241 pc = usbd_xfer_get_frame(xfer, 0); 1242 while (total > 0) { 1243 1244 n = (ch->end - ch->cur); 1245 if (n > total) { 1246 n = total; 1247 } 1248 usbd_copy_in(pc, offset, ch->cur, n); 1249 1250 total -= n; 1251 ch->cur += n; 1252 offset += n; 1253 1254 if (ch->cur >= ch->end) { 1255 ch->cur = ch->start; 1256 } 1257 } 1258 1259 usbd_transfer_submit(xfer); 1260 break; 1261 1262 default: /* Error */ 1263 if (error == USB_ERR_CANCELLED) { 1264 break; 1265 } 1266 goto tr_transferred; 1267 } 1268 } 1269 1270 static void 1271 uaudio_chan_record_callback(struct usb_xfer *xfer, usb_error_t error) 1272 { 1273 struct uaudio_chan *ch = usbd_xfer_softc(xfer); 1274 struct usb_page_cache *pc; 1275 uint32_t offset0; 1276 uint32_t offset1; 1277 uint32_t mfl; 1278 int m; 1279 int n; 1280 int len; 1281 int actlen; 1282 int nframes; 1283 int blockcount; 1284 1285 usbd_xfer_status(xfer, &actlen, NULL, NULL, &nframes); 1286 mfl = usbd_xfer_max_framelen(xfer); 1287 1288 if (ch->end == ch->start) { 1289 DPRINTF("no buffer!\n"); 1290 return; 1291 } 1292 1293 switch (USB_GET_STATE(xfer)) { 1294 case USB_ST_TRANSFERRED: 1295 1296 DPRINTFN(6, "transferred %d bytes\n", actlen); 1297 1298 offset0 = 0; 1299 pc = usbd_xfer_get_frame(xfer, 0); 1300 1301 for (n = 0; n != nframes; n++) { 1302 1303 offset1 = offset0; 1304 len = usbd_xfer_frame_len(xfer, n); 1305 1306 while (len > 0) { 1307 1308 m = (ch->end - ch->cur); 1309 1310 if (m > len) 1311 m = len; 1312 1313 usbd_copy_out(pc, offset1, ch->cur, m); 1314 1315 len -= m; 1316 offset1 += m; 1317 ch->cur += m; 1318 1319 if (ch->cur >= ch->end) { 1320 ch->cur = ch->start; 1321 } 1322 } 1323 1324 offset0 += mfl; 1325 } 1326 1327 chn_intr(ch->pcm_ch); 1328 1329 case USB_ST_SETUP: 1330 tr_setup: 1331 blockcount = ch->intr_frames; 1332 1333 usbd_xfer_set_frames(xfer, blockcount); 1334 for (n = 0; n < blockcount; n++) { 1335 usbd_xfer_set_frame_len(xfer, n, mfl); 1336 } 1337 1338 usbd_transfer_submit(xfer); 1339 break; 1340 1341 default: /* Error */ 1342 if (error == USB_ERR_CANCELLED) { 1343 break; 1344 } 1345 goto tr_setup; 1346 } 1347 } 1348 1349 void * 1350 uaudio_chan_init(struct uaudio_softc *sc, struct snd_dbuf *b, 1351 struct pcm_channel *c, int dir) 1352 { 1353 struct uaudio_chan *ch = ((dir == PCMDIR_PLAY) ? 1354 &sc->sc_play_chan : &sc->sc_rec_chan); 1355 uint32_t buf_size; 1356 uint32_t frames; 1357 uint32_t format; 1358 uint16_t fps; 1359 uint8_t endpoint; 1360 uint8_t blocks; 1361 uint8_t iface_index; 1362 uint8_t alt_index; 1363 uint8_t fps_shift; 1364 usb_error_t err; 1365 1366 fps = usbd_get_isoc_fps(sc->sc_udev); 1367 1368 if (fps < 8000) { 1369 /* FULL speed USB */ 1370 frames = 8; 1371 } else { 1372 /* HIGH speed USB */ 1373 frames = UAUDIO_NFRAMES; 1374 } 1375 1376 /* setup play/record format */ 1377 1378 ch->pcm_cap.fmtlist = ch->pcm_format; 1379 1380 ch->pcm_format[0] = 0; 1381 ch->pcm_format[1] = 0; 1382 1383 ch->pcm_cap.minspeed = ch->sample_rate; 1384 ch->pcm_cap.maxspeed = ch->sample_rate; 1385 1386 /* setup mutex and PCM channel */ 1387 1388 ch->pcm_ch = c; 1389 ch->pcm_mtx = c->lock; 1390 1391 format = ch->p_fmt->freebsd_fmt; 1392 1393 switch (ch->p_asf1d->bNrChannels) { 1394 case 2: 1395 /* stereo */ 1396 format = SND_FORMAT(format, 2, 0); 1397 break; 1398 case 1: 1399 /* mono */ 1400 format = SND_FORMAT(format, 1, 0); 1401 break; 1402 default: 1403 /* surround and more */ 1404 format = feeder_matrix_default_format( 1405 SND_FORMAT(format, ch->p_asf1d->bNrChannels, 0)); 1406 break; 1407 } 1408 1409 ch->pcm_cap.fmtlist[0] = format; 1410 ch->pcm_cap.fmtlist[1] = 0; 1411 1412 /* check if format is not supported */ 1413 1414 if (format == 0) { 1415 DPRINTF("The selected audio format is not supported\n"); 1416 goto error; 1417 } 1418 1419 /* set alternate interface corresponding to the mode */ 1420 1421 endpoint = ch->p_ed1->bEndpointAddress; 1422 iface_index = ch->iface_index; 1423 alt_index = ch->iface_alt_index; 1424 1425 DPRINTF("endpoint=0x%02x, speed=%d, iface=%d alt=%d\n", 1426 endpoint, ch->sample_rate, iface_index, alt_index); 1427 1428 err = usbd_set_alt_interface_index(sc->sc_udev, iface_index, alt_index); 1429 if (err) { 1430 DPRINTF("setting of alternate index failed: %s!\n", 1431 usbd_errstr(err)); 1432 goto error; 1433 } 1434 usbd_set_parent_iface(sc->sc_udev, iface_index, 1435 sc->sc_mixer_iface_index); 1436 1437 /* 1438 * Only set the sample rate if the channel reports that it 1439 * supports the frequency control. 1440 */ 1441 if (ch->p_sed->bmAttributes & UA_SED_FREQ_CONTROL) { 1442 if (uaudio_set_speed(sc->sc_udev, endpoint, ch->sample_rate)) { 1443 /* 1444 * If the endpoint is adaptive setting the speed may 1445 * fail. 1446 */ 1447 DPRINTF("setting of sample rate failed! (continuing anyway)\n"); 1448 } 1449 } 1450 if (usbd_transfer_setup(sc->sc_udev, &iface_index, ch->xfer, 1451 ch->usb_cfg, UAUDIO_NCHANBUFS, ch, ch->pcm_mtx)) { 1452 DPRINTF("could not allocate USB transfers!\n"); 1453 goto error; 1454 } 1455 1456 fps_shift = usbd_xfer_get_fps_shift(ch->xfer[0]); 1457 1458 /* down shift number of frames per second, if any */ 1459 fps >>= fps_shift; 1460 frames >>= fps_shift; 1461 1462 /* bytes per frame should not be zero */ 1463 ch->bytes_per_frame[0] = ((ch->sample_rate / fps) * ch->sample_size); 1464 ch->bytes_per_frame[1] = (((ch->sample_rate + fps - 1) / fps) * ch->sample_size); 1465 1466 /* setup data rate dithering, if any */ 1467 ch->frames_per_second = fps; 1468 ch->sample_rem = ch->sample_rate % fps; 1469 ch->sample_curr = 0; 1470 ch->frames_per_second = fps; 1471 1472 /* compute required buffer size */ 1473 buf_size = (ch->bytes_per_frame[1] * frames); 1474 1475 ch->intr_size = buf_size; 1476 ch->intr_frames = frames; 1477 1478 DPRINTF("fps=%d sample_rem=%d\n", fps, ch->sample_rem); 1479 1480 if (ch->intr_frames == 0) { 1481 DPRINTF("frame shift is too high!\n"); 1482 goto error; 1483 } 1484 1485 /* setup double buffering */ 1486 buf_size *= 2; 1487 blocks = 2; 1488 1489 ch->buf = malloc(buf_size, M_DEVBUF, M_WAITOK | M_ZERO); 1490 if (ch->buf == NULL) 1491 goto error; 1492 if (sndbuf_setup(b, ch->buf, buf_size) != 0) 1493 goto error; 1494 if (sndbuf_resize(b, blocks, ch->intr_size)) 1495 goto error; 1496 1497 ch->start = ch->buf; 1498 ch->end = ch->buf + buf_size; 1499 ch->cur = ch->buf; 1500 ch->pcm_buf = b; 1501 1502 if (ch->pcm_mtx == NULL) { 1503 DPRINTF("ERROR: PCM channels does not have a mutex!\n"); 1504 goto error; 1505 } 1506 1507 return (ch); 1508 1509 error: 1510 uaudio_chan_free(ch); 1511 return (NULL); 1512 } 1513 1514 int 1515 uaudio_chan_free(struct uaudio_chan *ch) 1516 { 1517 if (ch->buf != NULL) { 1518 free(ch->buf, M_DEVBUF); 1519 ch->buf = NULL; 1520 } 1521 usbd_transfer_unsetup(ch->xfer, UAUDIO_NCHANBUFS); 1522 1523 ch->valid = 0; 1524 1525 return (0); 1526 } 1527 1528 int 1529 uaudio_chan_set_param_blocksize(struct uaudio_chan *ch, uint32_t blocksize) 1530 { 1531 return (ch->intr_size); 1532 } 1533 1534 int 1535 uaudio_chan_set_param_fragments(struct uaudio_chan *ch, uint32_t blocksize, 1536 uint32_t blockcount) 1537 { 1538 return (1); 1539 } 1540 1541 int 1542 uaudio_chan_set_param_speed(struct uaudio_chan *ch, uint32_t speed) 1543 { 1544 if (speed != ch->sample_rate) { 1545 DPRINTF("rate conversion required\n"); 1546 } 1547 return (ch->sample_rate); 1548 } 1549 1550 int 1551 uaudio_chan_getptr(struct uaudio_chan *ch) 1552 { 1553 return (ch->cur - ch->start); 1554 } 1555 1556 struct pcmchan_caps * 1557 uaudio_chan_getcaps(struct uaudio_chan *ch) 1558 { 1559 return (&ch->pcm_cap); 1560 } 1561 1562 static struct pcmchan_matrix uaudio_chan_matrix_swap_2_0 = { 1563 .id = SND_CHN_MATRIX_DRV, 1564 .channels = 2, 1565 .ext = 0, 1566 .map = { 1567 /* Right */ 1568 [0] = { 1569 .type = SND_CHN_T_FR, 1570 .members = 1571 SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FC | 1572 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BR | 1573 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SR 1574 }, 1575 /* Left */ 1576 [1] = { 1577 .type = SND_CHN_T_FL, 1578 .members = 1579 SND_CHN_T_MASK_FL | SND_CHN_T_MASK_FC | 1580 SND_CHN_T_MASK_LF | SND_CHN_T_MASK_BL | 1581 SND_CHN_T_MASK_BC | SND_CHN_T_MASK_SL 1582 }, 1583 [2] = { 1584 .type = SND_CHN_T_MAX, 1585 .members = 0 1586 } 1587 }, 1588 .mask = SND_CHN_T_MASK_FR | SND_CHN_T_MASK_FL, 1589 .offset = { 1, 0, -1, -1, -1, -1, -1, -1, -1, 1590 -1, -1, -1, -1, -1, -1, -1, -1, -1 } 1591 }; 1592 1593 struct pcmchan_matrix * 1594 uaudio_chan_getmatrix(struct uaudio_chan *ch, uint32_t format) 1595 { 1596 struct uaudio_softc *sc; 1597 1598 sc = ch->priv_sc; 1599 1600 if (sc != NULL && sc->sc_uq_audio_swap_lr != 0 && 1601 AFMT_CHANNEL(format) == 2) 1602 return (&uaudio_chan_matrix_swap_2_0); 1603 1604 return (feeder_matrix_format_map(format)); 1605 } 1606 1607 int 1608 uaudio_chan_set_param_format(struct uaudio_chan *ch, uint32_t format) 1609 { 1610 ch->format = format; 1611 return (0); 1612 } 1613 1614 int 1615 uaudio_chan_start(struct uaudio_chan *ch) 1616 { 1617 ch->cur = ch->start; 1618 1619 #if (UAUDIO_NCHANBUFS != 2) 1620 #error "please update code" 1621 #endif 1622 if (ch->xfer[0]) { 1623 usbd_transfer_start(ch->xfer[0]); 1624 } 1625 if (ch->xfer[1]) { 1626 usbd_transfer_start(ch->xfer[1]); 1627 } 1628 return (0); 1629 } 1630 1631 int 1632 uaudio_chan_stop(struct uaudio_chan *ch) 1633 { 1634 #if (UAUDIO_NCHANBUFS != 2) 1635 #error "please update code" 1636 #endif 1637 usbd_transfer_stop(ch->xfer[0]); 1638 usbd_transfer_stop(ch->xfer[1]); 1639 return (0); 1640 } 1641 1642 /*========================================================================* 1643 * AC - Audio Controller - routines 1644 *========================================================================*/ 1645 1646 static void 1647 uaudio_mixer_add_ctl_sub(struct uaudio_softc *sc, struct uaudio_mixer_node *mc) 1648 { 1649 struct uaudio_mixer_node *p_mc_new = 1650 malloc(sizeof(*p_mc_new), M_USBDEV, M_WAITOK); 1651 1652 if (p_mc_new != NULL) { 1653 memcpy(p_mc_new, mc, sizeof(*p_mc_new)); 1654 p_mc_new->next = sc->sc_mixer_root; 1655 sc->sc_mixer_root = p_mc_new; 1656 sc->sc_mixer_count++; 1657 } else { 1658 DPRINTF("out of memory\n"); 1659 } 1660 } 1661 1662 static void 1663 uaudio_mixer_add_ctl(struct uaudio_softc *sc, struct uaudio_mixer_node *mc) 1664 { 1665 int32_t res; 1666 1667 if (mc->class < UAC_NCLASSES) { 1668 DPRINTF("adding %s.%d\n", 1669 uac_names[mc->class], mc->ctl); 1670 } else { 1671 DPRINTF("adding %d\n", mc->ctl); 1672 } 1673 1674 if (mc->type == MIX_ON_OFF) { 1675 mc->minval = 0; 1676 mc->maxval = 1; 1677 } else if (mc->type == MIX_SELECTOR) { 1678 } else { 1679 1680 /* determine min and max values */ 1681 1682 mc->minval = uaudio_mixer_get(sc->sc_udev, GET_MIN, mc); 1683 1684 mc->minval = uaudio_mixer_signext(mc->type, mc->minval); 1685 1686 mc->maxval = uaudio_mixer_get(sc->sc_udev, GET_MAX, mc); 1687 1688 mc->maxval = uaudio_mixer_signext(mc->type, mc->maxval); 1689 1690 /* check if max and min was swapped */ 1691 1692 if (mc->maxval < mc->minval) { 1693 res = mc->maxval; 1694 mc->maxval = mc->minval; 1695 mc->minval = res; 1696 } 1697 1698 /* compute value range */ 1699 mc->mul = mc->maxval - mc->minval; 1700 if (mc->mul == 0) 1701 mc->mul = 1; 1702 1703 /* compute value alignment */ 1704 res = uaudio_mixer_get(sc->sc_udev, GET_RES, mc); 1705 1706 DPRINTF("Resolution = %d\n", (int)res); 1707 } 1708 1709 uaudio_mixer_add_ctl_sub(sc, mc); 1710 1711 #ifdef USB_DEBUG 1712 if (uaudio_debug > 2) { 1713 uint8_t i; 1714 1715 for (i = 0; i < mc->nchan; i++) { 1716 DPRINTF("[mix] wValue=%04x\n", mc->wValue[0]); 1717 } 1718 DPRINTF("[mix] wIndex=%04x type=%d ctl='%d' " 1719 "min=%d max=%d\n", 1720 mc->wIndex, mc->type, mc->ctl, 1721 mc->minval, mc->maxval); 1722 } 1723 #endif 1724 } 1725 1726 static void 1727 uaudio_mixer_add_input(struct uaudio_softc *sc, 1728 const struct uaudio_terminal_node *iot, int id) 1729 { 1730 #ifdef USB_DEBUG 1731 const struct usb_audio_input_terminal *d = iot[id].u.it; 1732 1733 DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x " 1734 "bAssocTerminal=%d bNrChannels=%d wChannelConfig=%d " 1735 "iChannelNames=%d\n", 1736 d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal, 1737 d->bNrChannels, UGETW(d->wChannelConfig), 1738 d->iChannelNames); 1739 #endif 1740 } 1741 1742 static void 1743 uaudio_mixer_add_output(struct uaudio_softc *sc, 1744 const struct uaudio_terminal_node *iot, int id) 1745 { 1746 #ifdef USB_DEBUG 1747 const struct usb_audio_output_terminal *d = iot[id].u.ot; 1748 1749 DPRINTFN(3, "bTerminalId=%d wTerminalType=0x%04x " 1750 "bAssocTerminal=%d bSourceId=%d iTerminal=%d\n", 1751 d->bTerminalId, UGETW(d->wTerminalType), d->bAssocTerminal, 1752 d->bSourceId, d->iTerminal); 1753 #endif 1754 } 1755 1756 static void 1757 uaudio_mixer_add_mixer(struct uaudio_softc *sc, 1758 const struct uaudio_terminal_node *iot, int id) 1759 { 1760 struct uaudio_mixer_node mix; 1761 1762 const struct usb_audio_mixer_unit_0 *d0 = iot[id].u.mu; 1763 const struct usb_audio_mixer_unit_1 *d1; 1764 1765 uint32_t bno; /* bit number */ 1766 uint32_t p; /* bit number accumulator */ 1767 uint32_t mo; /* matching outputs */ 1768 uint32_t mc; /* matching channels */ 1769 uint32_t ichs; /* input channels */ 1770 uint32_t ochs; /* output channels */ 1771 uint32_t c; 1772 uint32_t chs; /* channels */ 1773 uint32_t i; 1774 uint32_t o; 1775 1776 DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n", 1777 d0->bUnitId, d0->bNrInPins); 1778 1779 /* compute the number of input channels */ 1780 1781 ichs = 0; 1782 for (i = 0; i < d0->bNrInPins; i++) { 1783 ichs += (uaudio_mixer_get_cluster(d0->baSourceId[i], iot) 1784 .bNrChannels); 1785 } 1786 1787 d1 = (const void *)(d0->baSourceId + d0->bNrInPins); 1788 1789 /* and the number of output channels */ 1790 1791 ochs = d1->bNrChannels; 1792 1793 DPRINTFN(3, "ichs=%d ochs=%d\n", ichs, ochs); 1794 1795 memset(&mix, 0, sizeof(mix)); 1796 1797 mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no); 1798 uaudio_mixer_determine_class(&iot[id], &mix); 1799 mix.type = MIX_SIGNED_16; 1800 1801 if (uaudio_mixer_verify_desc(d0, ((ichs * ochs) + 7) / 8) == NULL) { 1802 return; 1803 } 1804 for (p = i = 0; i < d0->bNrInPins; i++) { 1805 chs = uaudio_mixer_get_cluster(d0->baSourceId[i], iot).bNrChannels; 1806 mc = 0; 1807 for (c = 0; c < chs; c++) { 1808 mo = 0; 1809 for (o = 0; o < ochs; o++) { 1810 bno = ((p + c) * ochs) + o; 1811 if (BIT_TEST(d1->bmControls, bno)) { 1812 mo++; 1813 } 1814 } 1815 if (mo == 1) { 1816 mc++; 1817 } 1818 } 1819 if ((mc == chs) && (chs <= MIX_MAX_CHAN)) { 1820 1821 /* repeat bit-scan */ 1822 1823 mc = 0; 1824 for (c = 0; c < chs; c++) { 1825 for (o = 0; o < ochs; o++) { 1826 bno = ((p + c) * ochs) + o; 1827 if (BIT_TEST(d1->bmControls, bno)) { 1828 mix.wValue[mc++] = MAKE_WORD(p + c + 1, o + 1); 1829 } 1830 } 1831 } 1832 mix.nchan = chs; 1833 uaudio_mixer_add_ctl(sc, &mix); 1834 } else { 1835 /* XXX */ 1836 } 1837 p += chs; 1838 } 1839 } 1840 1841 static void 1842 uaudio_mixer_add_selector(struct uaudio_softc *sc, 1843 const struct uaudio_terminal_node *iot, int id) 1844 { 1845 const struct usb_audio_selector_unit *d = iot[id].u.su; 1846 struct uaudio_mixer_node mix; 1847 uint16_t i; 1848 1849 DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n", 1850 d->bUnitId, d->bNrInPins); 1851 1852 if (d->bNrInPins == 0) { 1853 return; 1854 } 1855 memset(&mix, 0, sizeof(mix)); 1856 1857 mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no); 1858 mix.wValue[0] = MAKE_WORD(0, 0); 1859 uaudio_mixer_determine_class(&iot[id], &mix); 1860 mix.nchan = 1; 1861 mix.type = MIX_SELECTOR; 1862 1863 mix.ctl = SOUND_MIXER_NRDEVICES; 1864 mix.minval = 1; 1865 mix.maxval = d->bNrInPins; 1866 1867 if (mix.maxval > MAX_SELECTOR_INPUT_PIN) { 1868 mix.maxval = MAX_SELECTOR_INPUT_PIN; 1869 } 1870 mix.mul = (mix.maxval - mix.minval); 1871 for (i = 0; i < MAX_SELECTOR_INPUT_PIN; i++) { 1872 mix.slctrtype[i] = SOUND_MIXER_NRDEVICES; 1873 } 1874 1875 for (i = 0; i < mix.maxval; i++) { 1876 mix.slctrtype[i] = uaudio_mixer_feature_name 1877 (&iot[d->baSourceId[i]], &mix); 1878 } 1879 1880 mix.class = 0; /* not used */ 1881 1882 uaudio_mixer_add_ctl(sc, &mix); 1883 } 1884 1885 static uint32_t 1886 uaudio_mixer_feature_get_bmaControls(const struct usb_audio_feature_unit *d, 1887 uint8_t i) 1888 { 1889 uint32_t temp = 0; 1890 uint32_t offset = (i * d->bControlSize); 1891 1892 if (d->bControlSize > 0) { 1893 temp |= d->bmaControls[offset]; 1894 if (d->bControlSize > 1) { 1895 temp |= d->bmaControls[offset + 1] << 8; 1896 if (d->bControlSize > 2) { 1897 temp |= d->bmaControls[offset + 2] << 16; 1898 if (d->bControlSize > 3) { 1899 temp |= d->bmaControls[offset + 3] << 24; 1900 } 1901 } 1902 } 1903 } 1904 return (temp); 1905 } 1906 1907 static void 1908 uaudio_mixer_add_feature(struct uaudio_softc *sc, 1909 const struct uaudio_terminal_node *iot, int id) 1910 { 1911 const struct usb_audio_feature_unit *d = iot[id].u.fu; 1912 struct uaudio_mixer_node mix; 1913 uint32_t fumask; 1914 uint32_t mmask; 1915 uint32_t cmask; 1916 uint16_t mixernumber; 1917 uint8_t nchan; 1918 uint8_t chan; 1919 uint8_t ctl; 1920 uint8_t i; 1921 1922 if (d->bControlSize == 0) { 1923 return; 1924 } 1925 memset(&mix, 0, sizeof(mix)); 1926 1927 nchan = (d->bLength - 7) / d->bControlSize; 1928 mmask = uaudio_mixer_feature_get_bmaControls(d, 0); 1929 cmask = 0; 1930 1931 if (nchan == 0) { 1932 return; 1933 } 1934 /* figure out what we can control */ 1935 1936 for (chan = 1; chan < nchan; chan++) { 1937 DPRINTFN(10, "chan=%d mask=%x\n", 1938 chan, uaudio_mixer_feature_get_bmaControls(d, chan)); 1939 1940 cmask |= uaudio_mixer_feature_get_bmaControls(d, chan); 1941 } 1942 1943 if (nchan > MIX_MAX_CHAN) { 1944 nchan = MIX_MAX_CHAN; 1945 } 1946 mix.wIndex = MAKE_WORD(d->bUnitId, sc->sc_mixer_iface_no); 1947 1948 for (ctl = 1; ctl <= LOUDNESS_CONTROL; ctl++) { 1949 1950 fumask = FU_MASK(ctl); 1951 1952 DPRINTFN(5, "ctl=%d fumask=0x%04x\n", 1953 ctl, fumask); 1954 1955 if (mmask & fumask) { 1956 mix.nchan = 1; 1957 mix.wValue[0] = MAKE_WORD(ctl, 0); 1958 } else if (cmask & fumask) { 1959 mix.nchan = nchan - 1; 1960 for (i = 1; i < nchan; i++) { 1961 if (uaudio_mixer_feature_get_bmaControls(d, i) & fumask) 1962 mix.wValue[i - 1] = MAKE_WORD(ctl, i); 1963 else 1964 mix.wValue[i - 1] = -1; 1965 } 1966 } else { 1967 continue; 1968 } 1969 1970 mixernumber = uaudio_mixer_feature_name(&iot[id], &mix); 1971 1972 switch (ctl) { 1973 case MUTE_CONTROL: 1974 mix.type = MIX_ON_OFF; 1975 mix.ctl = SOUND_MIXER_NRDEVICES; 1976 break; 1977 1978 case VOLUME_CONTROL: 1979 mix.type = MIX_SIGNED_16; 1980 mix.ctl = mixernumber; 1981 break; 1982 1983 case BASS_CONTROL: 1984 mix.type = MIX_SIGNED_8; 1985 mix.ctl = SOUND_MIXER_BASS; 1986 break; 1987 1988 case MID_CONTROL: 1989 mix.type = MIX_SIGNED_8; 1990 mix.ctl = SOUND_MIXER_NRDEVICES; /* XXXXX */ 1991 break; 1992 1993 case TREBLE_CONTROL: 1994 mix.type = MIX_SIGNED_8; 1995 mix.ctl = SOUND_MIXER_TREBLE; 1996 break; 1997 1998 case GRAPHIC_EQUALIZER_CONTROL: 1999 continue; /* XXX don't add anything */ 2000 break; 2001 2002 case AGC_CONTROL: 2003 mix.type = MIX_ON_OFF; 2004 mix.ctl = SOUND_MIXER_NRDEVICES; /* XXXXX */ 2005 break; 2006 2007 case DELAY_CONTROL: 2008 mix.type = MIX_UNSIGNED_16; 2009 mix.ctl = SOUND_MIXER_NRDEVICES; /* XXXXX */ 2010 break; 2011 2012 case BASS_BOOST_CONTROL: 2013 mix.type = MIX_ON_OFF; 2014 mix.ctl = SOUND_MIXER_NRDEVICES; /* XXXXX */ 2015 break; 2016 2017 case LOUDNESS_CONTROL: 2018 mix.type = MIX_ON_OFF; 2019 mix.ctl = SOUND_MIXER_LOUD; /* Is this correct ? */ 2020 break; 2021 2022 default: 2023 mix.type = MIX_UNKNOWN; 2024 break; 2025 } 2026 2027 if (mix.type != MIX_UNKNOWN) { 2028 uaudio_mixer_add_ctl(sc, &mix); 2029 } 2030 } 2031 } 2032 2033 static void 2034 uaudio_mixer_add_processing_updown(struct uaudio_softc *sc, 2035 const struct uaudio_terminal_node *iot, int id) 2036 { 2037 const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; 2038 const struct usb_audio_processing_unit_1 *d1 = 2039 (const void *)(d0->baSourceId + d0->bNrInPins); 2040 const struct usb_audio_processing_unit_updown *ud = 2041 (const void *)(d1->bmControls + d1->bControlSize); 2042 struct uaudio_mixer_node mix; 2043 uint8_t i; 2044 2045 if (uaudio_mixer_verify_desc(d0, sizeof(*ud)) == NULL) { 2046 return; 2047 } 2048 if (uaudio_mixer_verify_desc(d0, sizeof(*ud) + (2 * ud->bNrModes)) 2049 == NULL) { 2050 return; 2051 } 2052 DPRINTFN(3, "bUnitId=%d bNrModes=%d\n", 2053 d0->bUnitId, ud->bNrModes); 2054 2055 if (!(d1->bmControls[0] & UA_PROC_MASK(UD_MODE_SELECT_CONTROL))) { 2056 DPRINTF("no mode select\n"); 2057 return; 2058 } 2059 memset(&mix, 0, sizeof(mix)); 2060 2061 mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no); 2062 mix.nchan = 1; 2063 mix.wValue[0] = MAKE_WORD(UD_MODE_SELECT_CONTROL, 0); 2064 uaudio_mixer_determine_class(&iot[id], &mix); 2065 mix.type = MIX_ON_OFF; /* XXX */ 2066 2067 for (i = 0; i < ud->bNrModes; i++) { 2068 DPRINTFN(3, "i=%d bm=0x%x\n", i, UGETW(ud->waModes[i])); 2069 /* XXX */ 2070 } 2071 2072 uaudio_mixer_add_ctl(sc, &mix); 2073 } 2074 2075 static void 2076 uaudio_mixer_add_processing(struct uaudio_softc *sc, 2077 const struct uaudio_terminal_node *iot, int id) 2078 { 2079 const struct usb_audio_processing_unit_0 *d0 = iot[id].u.pu; 2080 const struct usb_audio_processing_unit_1 *d1 = 2081 (const void *)(d0->baSourceId + d0->bNrInPins); 2082 struct uaudio_mixer_node mix; 2083 uint16_t ptype; 2084 2085 memset(&mix, 0, sizeof(mix)); 2086 2087 ptype = UGETW(d0->wProcessType); 2088 2089 DPRINTFN(3, "wProcessType=%d bUnitId=%d " 2090 "bNrInPins=%d\n", ptype, d0->bUnitId, d0->bNrInPins); 2091 2092 if (d1->bControlSize == 0) { 2093 return; 2094 } 2095 if (d1->bmControls[0] & UA_PROC_ENABLE_MASK) { 2096 mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no); 2097 mix.nchan = 1; 2098 mix.wValue[0] = MAKE_WORD(XX_ENABLE_CONTROL, 0); 2099 uaudio_mixer_determine_class(&iot[id], &mix); 2100 mix.type = MIX_ON_OFF; 2101 uaudio_mixer_add_ctl(sc, &mix); 2102 } 2103 switch (ptype) { 2104 case UPDOWNMIX_PROCESS: 2105 uaudio_mixer_add_processing_updown(sc, iot, id); 2106 break; 2107 2108 case DOLBY_PROLOGIC_PROCESS: 2109 case P3D_STEREO_EXTENDER_PROCESS: 2110 case REVERBATION_PROCESS: 2111 case CHORUS_PROCESS: 2112 case DYN_RANGE_COMP_PROCESS: 2113 default: 2114 DPRINTF("unit %d, type=%d is not implemented\n", 2115 d0->bUnitId, ptype); 2116 break; 2117 } 2118 } 2119 2120 static void 2121 uaudio_mixer_add_extension(struct uaudio_softc *sc, 2122 const struct uaudio_terminal_node *iot, int id) 2123 { 2124 const struct usb_audio_extension_unit_0 *d0 = iot[id].u.eu; 2125 const struct usb_audio_extension_unit_1 *d1 = 2126 (const void *)(d0->baSourceId + d0->bNrInPins); 2127 struct uaudio_mixer_node mix; 2128 2129 DPRINTFN(3, "bUnitId=%d bNrInPins=%d\n", 2130 d0->bUnitId, d0->bNrInPins); 2131 2132 if (sc->sc_uq_au_no_xu) { 2133 return; 2134 } 2135 if (d1->bControlSize == 0) { 2136 return; 2137 } 2138 if (d1->bmControls[0] & UA_EXT_ENABLE_MASK) { 2139 2140 memset(&mix, 0, sizeof(mix)); 2141 2142 mix.wIndex = MAKE_WORD(d0->bUnitId, sc->sc_mixer_iface_no); 2143 mix.nchan = 1; 2144 mix.wValue[0] = MAKE_WORD(UA_EXT_ENABLE, 0); 2145 uaudio_mixer_determine_class(&iot[id], &mix); 2146 mix.type = MIX_ON_OFF; 2147 2148 uaudio_mixer_add_ctl(sc, &mix); 2149 } 2150 } 2151 2152 static const void * 2153 uaudio_mixer_verify_desc(const void *arg, uint32_t len) 2154 { 2155 const struct usb_audio_mixer_unit_1 *d1; 2156 const struct usb_audio_extension_unit_1 *e1; 2157 const struct usb_audio_processing_unit_1 *u1; 2158 2159 union { 2160 const struct usb_descriptor *desc; 2161 const struct usb_audio_input_terminal *it; 2162 const struct usb_audio_output_terminal *ot; 2163 const struct usb_audio_mixer_unit_0 *mu; 2164 const struct usb_audio_selector_unit *su; 2165 const struct usb_audio_feature_unit *fu; 2166 const struct usb_audio_processing_unit_0 *pu; 2167 const struct usb_audio_extension_unit_0 *eu; 2168 } u; 2169 2170 u.desc = arg; 2171 2172 if (u.desc == NULL) { 2173 goto error; 2174 } 2175 if (u.desc->bDescriptorType != UDESC_CS_INTERFACE) { 2176 goto error; 2177 } 2178 switch (u.desc->bDescriptorSubtype) { 2179 case UDESCSUB_AC_INPUT: 2180 len += sizeof(*u.it); 2181 break; 2182 2183 case UDESCSUB_AC_OUTPUT: 2184 len += sizeof(*u.ot); 2185 break; 2186 2187 case UDESCSUB_AC_MIXER: 2188 len += sizeof(*u.mu); 2189 2190 if (u.desc->bLength < len) { 2191 goto error; 2192 } 2193 len += u.mu->bNrInPins; 2194 2195 if (u.desc->bLength < len) { 2196 goto error; 2197 } 2198 d1 = (const void *)(u.mu->baSourceId + u.mu->bNrInPins); 2199 2200 len += sizeof(*d1); 2201 break; 2202 2203 case UDESCSUB_AC_SELECTOR: 2204 len += sizeof(*u.su); 2205 2206 if (u.desc->bLength < len) { 2207 goto error; 2208 } 2209 len += u.su->bNrInPins; 2210 break; 2211 2212 case UDESCSUB_AC_FEATURE: 2213 len += (sizeof(*u.fu) + 1); 2214 break; 2215 2216 case UDESCSUB_AC_PROCESSING: 2217 len += sizeof(*u.pu); 2218 2219 if (u.desc->bLength < len) { 2220 goto error; 2221 } 2222 len += u.pu->bNrInPins; 2223 2224 if (u.desc->bLength < len) { 2225 goto error; 2226 } 2227 u1 = (const void *)(u.pu->baSourceId + u.pu->bNrInPins); 2228 2229 len += sizeof(*u1); 2230 2231 if (u.desc->bLength < len) { 2232 goto error; 2233 } 2234 len += u1->bControlSize; 2235 2236 break; 2237 2238 case UDESCSUB_AC_EXTENSION: 2239 len += sizeof(*u.eu); 2240 2241 if (u.desc->bLength < len) { 2242 goto error; 2243 } 2244 len += u.eu->bNrInPins; 2245 2246 if (u.desc->bLength < len) { 2247 goto error; 2248 } 2249 e1 = (const void *)(u.eu->baSourceId + u.eu->bNrInPins); 2250 2251 len += sizeof(*e1); 2252 2253 if (u.desc->bLength < len) { 2254 goto error; 2255 } 2256 len += e1->bControlSize; 2257 break; 2258 2259 default: 2260 goto error; 2261 } 2262 2263 if (u.desc->bLength < len) { 2264 goto error; 2265 } 2266 return (u.desc); 2267 2268 error: 2269 if (u.desc) { 2270 DPRINTF("invalid descriptor, type=%d, " 2271 "sub_type=%d, len=%d of %d bytes\n", 2272 u.desc->bDescriptorType, 2273 u.desc->bDescriptorSubtype, 2274 u.desc->bLength, len); 2275 } 2276 return (NULL); 2277 } 2278 2279 #ifdef USB_DEBUG 2280 static void 2281 uaudio_mixer_dump_cluster(uint8_t id, const struct uaudio_terminal_node *iot) 2282 { 2283 static const char *channel_names[16] = { 2284 "LEFT", "RIGHT", "CENTER", "LFE", 2285 "LEFT_SURROUND", "RIGHT_SURROUND", "LEFT_CENTER", "RIGHT_CENTER", 2286 "SURROUND", "LEFT_SIDE", "RIGHT_SIDE", "TOP", 2287 "RESERVED12", "RESERVED13", "RESERVED14", "RESERVED15", 2288 }; 2289 uint16_t cc; 2290 uint8_t i; 2291 const struct usb_audio_cluster cl = uaudio_mixer_get_cluster(id, iot); 2292 2293 cc = UGETW(cl.wChannelConfig); 2294 2295 DPRINTF("cluster: bNrChannels=%u iChannelNames=%u wChannelConfig=" 2296 "0x%04x:\n", cl.iChannelNames, cl.bNrChannels, cc); 2297 2298 for (i = 0; cc; i++) { 2299 if (cc & 1) { 2300 DPRINTF(" - %s\n", channel_names[i]); 2301 } 2302 cc >>= 1; 2303 } 2304 } 2305 2306 #endif 2307 2308 static struct usb_audio_cluster 2309 uaudio_mixer_get_cluster(uint8_t id, const struct uaudio_terminal_node *iot) 2310 { 2311 struct usb_audio_cluster r; 2312 const struct usb_descriptor *dp; 2313 uint8_t i; 2314 2315 for (i = 0; i < UAUDIO_RECURSE_LIMIT; i++) { /* avoid infinite loops */ 2316 dp = iot[id].u.desc; 2317 if (dp == NULL) { 2318 goto error; 2319 } 2320 switch (dp->bDescriptorSubtype) { 2321 case UDESCSUB_AC_INPUT: 2322 r.bNrChannels = iot[id].u.it->bNrChannels; 2323 r.wChannelConfig[0] = iot[id].u.it->wChannelConfig[0]; 2324 r.wChannelConfig[1] = iot[id].u.it->wChannelConfig[1]; 2325 r.iChannelNames = iot[id].u.it->iChannelNames; 2326 goto done; 2327 2328 case UDESCSUB_AC_OUTPUT: 2329 id = iot[id].u.ot->bSourceId; 2330 break; 2331 2332 case UDESCSUB_AC_MIXER: 2333 r = *(const struct usb_audio_cluster *) 2334 &iot[id].u.mu->baSourceId[iot[id].u.mu-> 2335 bNrInPins]; 2336 goto done; 2337 2338 case UDESCSUB_AC_SELECTOR: 2339 if (iot[id].u.su->bNrInPins > 0) { 2340 /* XXX This is not really right */ 2341 id = iot[id].u.su->baSourceId[0]; 2342 } 2343 break; 2344 2345 case UDESCSUB_AC_FEATURE: 2346 id = iot[id].u.fu->bSourceId; 2347 break; 2348 2349 case UDESCSUB_AC_PROCESSING: 2350 r = *((const struct usb_audio_cluster *) 2351 &iot[id].u.pu->baSourceId[iot[id].u.pu-> 2352 bNrInPins]); 2353 goto done; 2354 2355 case UDESCSUB_AC_EXTENSION: 2356 r = *((const struct usb_audio_cluster *) 2357 &iot[id].u.eu->baSourceId[iot[id].u.eu-> 2358 bNrInPins]); 2359 goto done; 2360 2361 default: 2362 goto error; 2363 } 2364 } 2365 error: 2366 DPRINTF("bad data\n"); 2367 memset(&r, 0, sizeof(r)); 2368 done: 2369 return (r); 2370 } 2371 2372 #ifdef USB_DEBUG 2373 2374 struct uaudio_tt_to_string { 2375 uint16_t terminal_type; 2376 const char *desc; 2377 }; 2378 2379 static const struct uaudio_tt_to_string uaudio_tt_to_string[] = { 2380 2381 /* USB terminal types */ 2382 {UAT_UNDEFINED, "UAT_UNDEFINED"}, 2383 {UAT_STREAM, "UAT_STREAM"}, 2384 {UAT_VENDOR, "UAT_VENDOR"}, 2385 2386 /* input terminal types */ 2387 {UATI_UNDEFINED, "UATI_UNDEFINED"}, 2388 {UATI_MICROPHONE, "UATI_MICROPHONE"}, 2389 {UATI_DESKMICROPHONE, "UATI_DESKMICROPHONE"}, 2390 {UATI_PERSONALMICROPHONE, "UATI_PERSONALMICROPHONE"}, 2391 {UATI_OMNIMICROPHONE, "UATI_OMNIMICROPHONE"}, 2392 {UATI_MICROPHONEARRAY, "UATI_MICROPHONEARRAY"}, 2393 {UATI_PROCMICROPHONEARR, "UATI_PROCMICROPHONEARR"}, 2394 2395 /* output terminal types */ 2396 {UATO_UNDEFINED, "UATO_UNDEFINED"}, 2397 {UATO_SPEAKER, "UATO_SPEAKER"}, 2398 {UATO_HEADPHONES, "UATO_HEADPHONES"}, 2399 {UATO_DISPLAYAUDIO, "UATO_DISPLAYAUDIO"}, 2400 {UATO_DESKTOPSPEAKER, "UATO_DESKTOPSPEAKER"}, 2401 {UATO_ROOMSPEAKER, "UATO_ROOMSPEAKER"}, 2402 {UATO_COMMSPEAKER, "UATO_COMMSPEAKER"}, 2403 {UATO_SUBWOOFER, "UATO_SUBWOOFER"}, 2404 2405 /* bidir terminal types */ 2406 {UATB_UNDEFINED, "UATB_UNDEFINED"}, 2407 {UATB_HANDSET, "UATB_HANDSET"}, 2408 {UATB_HEADSET, "UATB_HEADSET"}, 2409 {UATB_SPEAKERPHONE, "UATB_SPEAKERPHONE"}, 2410 {UATB_SPEAKERPHONEESUP, "UATB_SPEAKERPHONEESUP"}, 2411 {UATB_SPEAKERPHONEECANC, "UATB_SPEAKERPHONEECANC"}, 2412 2413 /* telephony terminal types */ 2414 {UATT_UNDEFINED, "UATT_UNDEFINED"}, 2415 {UATT_PHONELINE, "UATT_PHONELINE"}, 2416 {UATT_TELEPHONE, "UATT_TELEPHONE"}, 2417 {UATT_DOWNLINEPHONE, "UATT_DOWNLINEPHONE"}, 2418 2419 /* external terminal types */ 2420 {UATE_UNDEFINED, "UATE_UNDEFINED"}, 2421 {UATE_ANALOGCONN, "UATE_ANALOGCONN"}, 2422 {UATE_LINECONN, "UATE_LINECONN"}, 2423 {UATE_LEGACYCONN, "UATE_LEGACYCONN"}, 2424 {UATE_DIGITALAUIFC, "UATE_DIGITALAUIFC"}, 2425 {UATE_SPDIF, "UATE_SPDIF"}, 2426 {UATE_1394DA, "UATE_1394DA"}, 2427 {UATE_1394DV, "UATE_1394DV"}, 2428 2429 /* embedded function terminal types */ 2430 {UATF_UNDEFINED, "UATF_UNDEFINED"}, 2431 {UATF_CALIBNOISE, "UATF_CALIBNOISE"}, 2432 {UATF_EQUNOISE, "UATF_EQUNOISE"}, 2433 {UATF_CDPLAYER, "UATF_CDPLAYER"}, 2434 {UATF_DAT, "UATF_DAT"}, 2435 {UATF_DCC, "UATF_DCC"}, 2436 {UATF_MINIDISK, "UATF_MINIDISK"}, 2437 {UATF_ANALOGTAPE, "UATF_ANALOGTAPE"}, 2438 {UATF_PHONOGRAPH, "UATF_PHONOGRAPH"}, 2439 {UATF_VCRAUDIO, "UATF_VCRAUDIO"}, 2440 {UATF_VIDEODISCAUDIO, "UATF_VIDEODISCAUDIO"}, 2441 {UATF_DVDAUDIO, "UATF_DVDAUDIO"}, 2442 {UATF_TVTUNERAUDIO, "UATF_TVTUNERAUDIO"}, 2443 {UATF_SATELLITE, "UATF_SATELLITE"}, 2444 {UATF_CABLETUNER, "UATF_CABLETUNER"}, 2445 {UATF_DSS, "UATF_DSS"}, 2446 {UATF_RADIORECV, "UATF_RADIORECV"}, 2447 {UATF_RADIOXMIT, "UATF_RADIOXMIT"}, 2448 {UATF_MULTITRACK, "UATF_MULTITRACK"}, 2449 {UATF_SYNTHESIZER, "UATF_SYNTHESIZER"}, 2450 2451 /* unknown */ 2452 {0x0000, "UNKNOWN"}, 2453 }; 2454 2455 static const char * 2456 uaudio_mixer_get_terminal_name(uint16_t terminal_type) 2457 { 2458 const struct uaudio_tt_to_string *uat = uaudio_tt_to_string; 2459 2460 while (uat->terminal_type) { 2461 if (uat->terminal_type == terminal_type) { 2462 break; 2463 } 2464 uat++; 2465 } 2466 if (uat->terminal_type == 0) { 2467 DPRINTF("unknown terminal type (0x%04x)", terminal_type); 2468 } 2469 return (uat->desc); 2470 } 2471 2472 #endif 2473 2474 static uint16_t 2475 uaudio_mixer_determine_class(const struct uaudio_terminal_node *iot, 2476 struct uaudio_mixer_node *mix) 2477 { 2478 uint16_t terminal_type = 0x0000; 2479 const struct uaudio_terminal_node *input[2]; 2480 const struct uaudio_terminal_node *output[2]; 2481 2482 input[0] = uaudio_mixer_get_input(iot, 0); 2483 input[1] = uaudio_mixer_get_input(iot, 1); 2484 2485 output[0] = uaudio_mixer_get_output(iot, 0); 2486 output[1] = uaudio_mixer_get_output(iot, 1); 2487 2488 /* 2489 * check if there is only 2490 * one output terminal: 2491 */ 2492 if (output[0] && (!output[1])) { 2493 terminal_type = UGETW(output[0]->u.ot->wTerminalType); 2494 } 2495 /* 2496 * If the only output terminal is USB, 2497 * the class is UAC_RECORD. 2498 */ 2499 if ((terminal_type & 0xff00) == (UAT_UNDEFINED & 0xff00)) { 2500 2501 mix->class = UAC_RECORD; 2502 if (input[0] && (!input[1])) { 2503 terminal_type = UGETW(input[0]->u.it->wTerminalType); 2504 } else { 2505 terminal_type = 0; 2506 } 2507 goto done; 2508 } 2509 /* 2510 * if the unit is connected to just 2511 * one input terminal, the 2512 * class is UAC_INPUT: 2513 */ 2514 if (input[0] && (!input[1])) { 2515 mix->class = UAC_INPUT; 2516 terminal_type = UGETW(input[0]->u.it->wTerminalType); 2517 goto done; 2518 } 2519 /* 2520 * Otherwise, the class is UAC_OUTPUT. 2521 */ 2522 mix->class = UAC_OUTPUT; 2523 done: 2524 return (terminal_type); 2525 } 2526 2527 struct uaudio_tt_to_feature { 2528 uint16_t terminal_type; 2529 uint16_t feature; 2530 }; 2531 2532 static const struct uaudio_tt_to_feature uaudio_tt_to_feature[] = { 2533 2534 {UAT_STREAM, SOUND_MIXER_PCM}, 2535 2536 {UATI_MICROPHONE, SOUND_MIXER_MIC}, 2537 {UATI_DESKMICROPHONE, SOUND_MIXER_MIC}, 2538 {UATI_PERSONALMICROPHONE, SOUND_MIXER_MIC}, 2539 {UATI_OMNIMICROPHONE, SOUND_MIXER_MIC}, 2540 {UATI_MICROPHONEARRAY, SOUND_MIXER_MIC}, 2541 {UATI_PROCMICROPHONEARR, SOUND_MIXER_MIC}, 2542 2543 {UATO_SPEAKER, SOUND_MIXER_SPEAKER}, 2544 {UATO_DESKTOPSPEAKER, SOUND_MIXER_SPEAKER}, 2545 {UATO_ROOMSPEAKER, SOUND_MIXER_SPEAKER}, 2546 {UATO_COMMSPEAKER, SOUND_MIXER_SPEAKER}, 2547 2548 {UATE_ANALOGCONN, SOUND_MIXER_LINE}, 2549 {UATE_LINECONN, SOUND_MIXER_LINE}, 2550 {UATE_LEGACYCONN, SOUND_MIXER_LINE}, 2551 2552 {UATE_DIGITALAUIFC, SOUND_MIXER_ALTPCM}, 2553 {UATE_SPDIF, SOUND_MIXER_ALTPCM}, 2554 {UATE_1394DA, SOUND_MIXER_ALTPCM}, 2555 {UATE_1394DV, SOUND_MIXER_ALTPCM}, 2556 2557 {UATF_CDPLAYER, SOUND_MIXER_CD}, 2558 2559 {UATF_SYNTHESIZER, SOUND_MIXER_SYNTH}, 2560 2561 {UATF_VIDEODISCAUDIO, SOUND_MIXER_VIDEO}, 2562 {UATF_DVDAUDIO, SOUND_MIXER_VIDEO}, 2563 {UATF_TVTUNERAUDIO, SOUND_MIXER_VIDEO}, 2564 2565 /* telephony terminal types */ 2566 {UATT_UNDEFINED, SOUND_MIXER_PHONEIN}, /* SOUND_MIXER_PHONEOUT */ 2567 {UATT_PHONELINE, SOUND_MIXER_PHONEIN}, /* SOUND_MIXER_PHONEOUT */ 2568 {UATT_TELEPHONE, SOUND_MIXER_PHONEIN}, /* SOUND_MIXER_PHONEOUT */ 2569 {UATT_DOWNLINEPHONE, SOUND_MIXER_PHONEIN}, /* SOUND_MIXER_PHONEOUT */ 2570 2571 {UATF_RADIORECV, SOUND_MIXER_RADIO}, 2572 {UATF_RADIOXMIT, SOUND_MIXER_RADIO}, 2573 2574 {UAT_UNDEFINED, SOUND_MIXER_VOLUME}, 2575 {UAT_VENDOR, SOUND_MIXER_VOLUME}, 2576 {UATI_UNDEFINED, SOUND_MIXER_VOLUME}, 2577 2578 /* output terminal types */ 2579 {UATO_UNDEFINED, SOUND_MIXER_VOLUME}, 2580 {UATO_DISPLAYAUDIO, SOUND_MIXER_VOLUME}, 2581 {UATO_SUBWOOFER, SOUND_MIXER_VOLUME}, 2582 {UATO_HEADPHONES, SOUND_MIXER_VOLUME}, 2583 2584 /* bidir terminal types */ 2585 {UATB_UNDEFINED, SOUND_MIXER_VOLUME}, 2586 {UATB_HANDSET, SOUND_MIXER_VOLUME}, 2587 {UATB_HEADSET, SOUND_MIXER_VOLUME}, 2588 {UATB_SPEAKERPHONE, SOUND_MIXER_VOLUME}, 2589 {UATB_SPEAKERPHONEESUP, SOUND_MIXER_VOLUME}, 2590 {UATB_SPEAKERPHONEECANC, SOUND_MIXER_VOLUME}, 2591 2592 /* external terminal types */ 2593 {UATE_UNDEFINED, SOUND_MIXER_VOLUME}, 2594 2595 /* embedded function terminal types */ 2596 {UATF_UNDEFINED, SOUND_MIXER_VOLUME}, 2597 {UATF_CALIBNOISE, SOUND_MIXER_VOLUME}, 2598 {UATF_EQUNOISE, SOUND_MIXER_VOLUME}, 2599 {UATF_DAT, SOUND_MIXER_VOLUME}, 2600 {UATF_DCC, SOUND_MIXER_VOLUME}, 2601 {UATF_MINIDISK, SOUND_MIXER_VOLUME}, 2602 {UATF_ANALOGTAPE, SOUND_MIXER_VOLUME}, 2603 {UATF_PHONOGRAPH, SOUND_MIXER_VOLUME}, 2604 {UATF_VCRAUDIO, SOUND_MIXER_VOLUME}, 2605 {UATF_SATELLITE, SOUND_MIXER_VOLUME}, 2606 {UATF_CABLETUNER, SOUND_MIXER_VOLUME}, 2607 {UATF_DSS, SOUND_MIXER_VOLUME}, 2608 {UATF_MULTITRACK, SOUND_MIXER_VOLUME}, 2609 {0xffff, SOUND_MIXER_VOLUME}, 2610 2611 /* default */ 2612 {0x0000, SOUND_MIXER_VOLUME}, 2613 }; 2614 2615 static uint16_t 2616 uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot, 2617 struct uaudio_mixer_node *mix) 2618 { 2619 const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature; 2620 uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix); 2621 2622 if ((mix->class == UAC_RECORD) && (terminal_type == 0)) { 2623 return (SOUND_MIXER_IMIX); 2624 } 2625 while (uat->terminal_type) { 2626 if (uat->terminal_type == terminal_type) { 2627 break; 2628 } 2629 uat++; 2630 } 2631 2632 DPRINTF("terminal_type=%s (0x%04x) -> %d\n", 2633 uaudio_mixer_get_terminal_name(terminal_type), 2634 terminal_type, uat->feature); 2635 2636 return (uat->feature); 2637 } 2638 2639 static const struct uaudio_terminal_node * 2640 uaudio_mixer_get_input(const struct uaudio_terminal_node *iot, uint8_t i) 2641 { 2642 struct uaudio_terminal_node *root = iot->root; 2643 uint8_t n; 2644 2645 n = iot->usr.id_max; 2646 do { 2647 if (iot->usr.bit_input[n / 8] & (1 << (n % 8))) { 2648 if (!i--) 2649 return (root + n); 2650 } 2651 } while (n--); 2652 2653 return (NULL); 2654 } 2655 2656 static const struct uaudio_terminal_node * 2657 uaudio_mixer_get_output(const struct uaudio_terminal_node *iot, uint8_t i) 2658 { 2659 struct uaudio_terminal_node *root = iot->root; 2660 uint8_t n; 2661 2662 n = iot->usr.id_max; 2663 do { 2664 if (iot->usr.bit_output[n / 8] & (1 << (n % 8))) { 2665 if (!i--) 2666 return (root + n); 2667 } 2668 } while (n--); 2669 2670 return (NULL); 2671 } 2672 2673 static void 2674 uaudio_mixer_find_inputs_sub(struct uaudio_terminal_node *root, 2675 const uint8_t *p_id, uint8_t n_id, 2676 struct uaudio_search_result *info) 2677 { 2678 struct uaudio_terminal_node *iot; 2679 uint8_t n; 2680 uint8_t i; 2681 2682 if (info->recurse_level >= UAUDIO_RECURSE_LIMIT) { 2683 return; 2684 } 2685 info->recurse_level++; 2686 2687 for (n = 0; n < n_id; n++) { 2688 2689 i = p_id[n]; 2690 2691 if (info->bit_visited[i / 8] & (1 << (i % 8))) { 2692 /* don't go into a circle */ 2693 DPRINTF("avoided going into a circle at id=%d!\n", i); 2694 continue; 2695 } else { 2696 info->bit_visited[i / 8] |= (1 << (i % 8)); 2697 } 2698 2699 iot = (root + i); 2700 2701 if (iot->u.desc == NULL) { 2702 continue; 2703 } 2704 switch (iot->u.desc->bDescriptorSubtype) { 2705 case UDESCSUB_AC_INPUT: 2706 info->bit_input[i / 8] |= (1 << (i % 8)); 2707 break; 2708 2709 case UDESCSUB_AC_FEATURE: 2710 uaudio_mixer_find_inputs_sub 2711 (root, &iot->u.fu->bSourceId, 1, info); 2712 break; 2713 2714 case UDESCSUB_AC_OUTPUT: 2715 uaudio_mixer_find_inputs_sub 2716 (root, &iot->u.ot->bSourceId, 1, info); 2717 break; 2718 2719 case UDESCSUB_AC_MIXER: 2720 uaudio_mixer_find_inputs_sub 2721 (root, iot->u.mu->baSourceId, 2722 iot->u.mu->bNrInPins, info); 2723 break; 2724 2725 case UDESCSUB_AC_SELECTOR: 2726 uaudio_mixer_find_inputs_sub 2727 (root, iot->u.su->baSourceId, 2728 iot->u.su->bNrInPins, info); 2729 break; 2730 2731 case UDESCSUB_AC_PROCESSING: 2732 uaudio_mixer_find_inputs_sub 2733 (root, iot->u.pu->baSourceId, 2734 iot->u.pu->bNrInPins, info); 2735 break; 2736 2737 case UDESCSUB_AC_EXTENSION: 2738 uaudio_mixer_find_inputs_sub 2739 (root, iot->u.eu->baSourceId, 2740 iot->u.eu->bNrInPins, info); 2741 break; 2742 2743 case UDESCSUB_AC_HEADER: 2744 default: 2745 break; 2746 } 2747 } 2748 info->recurse_level--; 2749 } 2750 2751 static void 2752 uaudio_mixer_find_outputs_sub(struct uaudio_terminal_node *root, uint8_t id, 2753 uint8_t n_id, struct uaudio_search_result *info) 2754 { 2755 struct uaudio_terminal_node *iot = (root + id); 2756 uint8_t j; 2757 2758 j = n_id; 2759 do { 2760 if ((j != id) && ((root + j)->u.desc) && 2761 ((root + j)->u.desc->bDescriptorSubtype == UDESCSUB_AC_OUTPUT)) { 2762 2763 /* 2764 * "j" (output) <--- virtual wire <--- "id" (input) 2765 * 2766 * if "j" has "id" on the input, then "id" have "j" on 2767 * the output, because they are connected: 2768 */ 2769 if ((root + j)->usr.bit_input[id / 8] & (1 << (id % 8))) { 2770 iot->usr.bit_output[j / 8] |= (1 << (j % 8)); 2771 } 2772 } 2773 } while (j--); 2774 } 2775 2776 static void 2777 uaudio_mixer_fill_info(struct uaudio_softc *sc, struct usb_device *udev, 2778 void *desc) 2779 { 2780 const struct usb_audio_control_descriptor *acdp; 2781 struct usb_config_descriptor *cd = usbd_get_config_descriptor(udev); 2782 const struct usb_descriptor *dp; 2783 const struct usb_audio_unit *au; 2784 struct uaudio_terminal_node *iot = NULL; 2785 uint16_t wTotalLen; 2786 uint8_t ID_max = 0; /* inclusive */ 2787 uint8_t i; 2788 2789 desc = usb_desc_foreach(cd, desc); 2790 2791 if (desc == NULL) { 2792 DPRINTF("no Audio Control header\n"); 2793 goto done; 2794 } 2795 acdp = desc; 2796 2797 if ((acdp->bLength < sizeof(*acdp)) || 2798 (acdp->bDescriptorType != UDESC_CS_INTERFACE) || 2799 (acdp->bDescriptorSubtype != UDESCSUB_AC_HEADER)) { 2800 DPRINTF("invalid Audio Control header\n"); 2801 goto done; 2802 } 2803 /* "wTotalLen" is allowed to be corrupt */ 2804 wTotalLen = UGETW(acdp->wTotalLength) - acdp->bLength; 2805 2806 /* get USB audio revision */ 2807 sc->sc_audio_rev = UGETW(acdp->bcdADC); 2808 2809 DPRINTFN(3, "found AC header, vers=%03x, len=%d\n", 2810 sc->sc_audio_rev, wTotalLen); 2811 2812 if (sc->sc_audio_rev != UAUDIO_VERSION) { 2813 2814 if (sc->sc_uq_bad_adc) { 2815 2816 } else { 2817 DPRINTF("invalid audio version\n"); 2818 goto done; 2819 } 2820 } 2821 iot = malloc(sizeof(struct uaudio_terminal_node) * 256, M_TEMP, 2822 M_WAITOK | M_ZERO); 2823 2824 if (iot == NULL) { 2825 DPRINTF("no memory!\n"); 2826 goto done; 2827 } 2828 while ((desc = usb_desc_foreach(cd, desc))) { 2829 2830 dp = desc; 2831 2832 if (dp->bLength > wTotalLen) { 2833 break; 2834 } else { 2835 wTotalLen -= dp->bLength; 2836 } 2837 2838 au = uaudio_mixer_verify_desc(dp, 0); 2839 2840 if (au) { 2841 iot[au->bUnitId].u.desc = (const void *)au; 2842 if (au->bUnitId > ID_max) { 2843 ID_max = au->bUnitId; 2844 } 2845 } 2846 } 2847 2848 DPRINTF("Maximum ID=%d\n", ID_max); 2849 2850 /* 2851 * determine sourcing inputs for 2852 * all nodes in the tree: 2853 */ 2854 i = ID_max; 2855 do { 2856 uaudio_mixer_find_inputs_sub(iot, &i, 1, &((iot + i)->usr)); 2857 } while (i--); 2858 2859 /* 2860 * determine outputs for 2861 * all nodes in the tree: 2862 */ 2863 i = ID_max; 2864 do { 2865 uaudio_mixer_find_outputs_sub(iot, i, ID_max, &((iot + i)->usr)); 2866 } while (i--); 2867 2868 /* set "id_max" and "root" */ 2869 2870 i = ID_max; 2871 do { 2872 (iot + i)->usr.id_max = ID_max; 2873 (iot + i)->root = iot; 2874 } while (i--); 2875 2876 #ifdef USB_DEBUG 2877 i = ID_max; 2878 do { 2879 uint8_t j; 2880 2881 if (iot[i].u.desc == NULL) { 2882 continue; 2883 } 2884 DPRINTF("id %d:\n", i); 2885 2886 switch (iot[i].u.desc->bDescriptorSubtype) { 2887 case UDESCSUB_AC_INPUT: 2888 DPRINTF(" - AC_INPUT type=%s\n", 2889 uaudio_mixer_get_terminal_name 2890 (UGETW(iot[i].u.it->wTerminalType))); 2891 uaudio_mixer_dump_cluster(i, iot); 2892 break; 2893 2894 case UDESCSUB_AC_OUTPUT: 2895 DPRINTF(" - AC_OUTPUT type=%s " 2896 "src=%d\n", uaudio_mixer_get_terminal_name 2897 (UGETW(iot[i].u.ot->wTerminalType)), 2898 iot[i].u.ot->bSourceId); 2899 break; 2900 2901 case UDESCSUB_AC_MIXER: 2902 DPRINTF(" - AC_MIXER src:\n"); 2903 for (j = 0; j < iot[i].u.mu->bNrInPins; j++) { 2904 DPRINTF(" - %d\n", iot[i].u.mu->baSourceId[j]); 2905 } 2906 uaudio_mixer_dump_cluster(i, iot); 2907 break; 2908 2909 case UDESCSUB_AC_SELECTOR: 2910 DPRINTF(" - AC_SELECTOR src:\n"); 2911 for (j = 0; j < iot[i].u.su->bNrInPins; j++) { 2912 DPRINTF(" - %d\n", iot[i].u.su->baSourceId[j]); 2913 } 2914 break; 2915 2916 case UDESCSUB_AC_FEATURE: 2917 DPRINTF(" - AC_FEATURE src=%d\n", iot[i].u.fu->bSourceId); 2918 break; 2919 2920 case UDESCSUB_AC_PROCESSING: 2921 DPRINTF(" - AC_PROCESSING src:\n"); 2922 for (j = 0; j < iot[i].u.pu->bNrInPins; j++) { 2923 DPRINTF(" - %d\n", iot[i].u.pu->baSourceId[j]); 2924 } 2925 uaudio_mixer_dump_cluster(i, iot); 2926 break; 2927 2928 case UDESCSUB_AC_EXTENSION: 2929 DPRINTF(" - AC_EXTENSION src:\n"); 2930 for (j = 0; j < iot[i].u.eu->bNrInPins; j++) { 2931 DPRINTF("%d ", iot[i].u.eu->baSourceId[j]); 2932 } 2933 uaudio_mixer_dump_cluster(i, iot); 2934 break; 2935 2936 default: 2937 DPRINTF("unknown audio control (subtype=%d)\n", 2938 iot[i].u.desc->bDescriptorSubtype); 2939 } 2940 2941 DPRINTF("Inputs to this ID are:\n"); 2942 2943 j = ID_max; 2944 do { 2945 if (iot[i].usr.bit_input[j / 8] & (1 << (j % 8))) { 2946 DPRINTF(" -- ID=%d\n", j); 2947 } 2948 } while (j--); 2949 2950 DPRINTF("Outputs from this ID are:\n"); 2951 2952 j = ID_max; 2953 do { 2954 if (iot[i].usr.bit_output[j / 8] & (1 << (j % 8))) { 2955 DPRINTF(" -- ID=%d\n", j); 2956 } 2957 } while (j--); 2958 2959 } while (i--); 2960 #endif 2961 2962 /* 2963 * scan the config to create a linked 2964 * list of "mixer" nodes: 2965 */ 2966 2967 i = ID_max; 2968 do { 2969 dp = iot[i].u.desc; 2970 2971 if (dp == NULL) { 2972 continue; 2973 } 2974 DPRINTFN(11, "id=%d subtype=%d\n", 2975 i, dp->bDescriptorSubtype); 2976 2977 switch (dp->bDescriptorSubtype) { 2978 case UDESCSUB_AC_HEADER: 2979 DPRINTF("unexpected AC header\n"); 2980 break; 2981 2982 case UDESCSUB_AC_INPUT: 2983 uaudio_mixer_add_input(sc, iot, i); 2984 break; 2985 2986 case UDESCSUB_AC_OUTPUT: 2987 uaudio_mixer_add_output(sc, iot, i); 2988 break; 2989 2990 case UDESCSUB_AC_MIXER: 2991 uaudio_mixer_add_mixer(sc, iot, i); 2992 break; 2993 2994 case UDESCSUB_AC_SELECTOR: 2995 uaudio_mixer_add_selector(sc, iot, i); 2996 break; 2997 2998 case UDESCSUB_AC_FEATURE: 2999 uaudio_mixer_add_feature(sc, iot, i); 3000 break; 3001 3002 case UDESCSUB_AC_PROCESSING: 3003 uaudio_mixer_add_processing(sc, iot, i); 3004 break; 3005 3006 case UDESCSUB_AC_EXTENSION: 3007 uaudio_mixer_add_extension(sc, iot, i); 3008 break; 3009 3010 default: 3011 DPRINTF("bad AC desc subtype=0x%02x\n", 3012 dp->bDescriptorSubtype); 3013 break; 3014 } 3015 3016 } while (i--); 3017 3018 done: 3019 if (iot) { 3020 free(iot, M_TEMP); 3021 } 3022 } 3023 3024 static uint16_t 3025 uaudio_mixer_get(struct usb_device *udev, uint8_t what, 3026 struct uaudio_mixer_node *mc) 3027 { 3028 struct usb_device_request req; 3029 uint16_t val; 3030 uint16_t len = MIX_SIZE(mc->type); 3031 uint8_t data[4]; 3032 usb_error_t err; 3033 3034 if (mc->wValue[0] == -1) { 3035 return (0); 3036 } 3037 req.bmRequestType = UT_READ_CLASS_INTERFACE; 3038 req.bRequest = what; 3039 USETW(req.wValue, mc->wValue[0]); 3040 USETW(req.wIndex, mc->wIndex); 3041 USETW(req.wLength, len); 3042 3043 err = usbd_do_request(udev, NULL, &req, data); 3044 if (err) { 3045 DPRINTF("err=%s\n", usbd_errstr(err)); 3046 return (0); 3047 } 3048 if (len < 1) { 3049 data[0] = 0; 3050 } 3051 if (len < 2) { 3052 data[1] = 0; 3053 } 3054 val = (data[0] | (data[1] << 8)); 3055 3056 DPRINTFN(3, "val=%d\n", val); 3057 3058 return (val); 3059 } 3060 3061 static void 3062 uaudio_mixer_write_cfg_callback(struct usb_xfer *xfer, usb_error_t error) 3063 { 3064 struct usb_device_request req; 3065 struct uaudio_softc *sc = usbd_xfer_softc(xfer); 3066 struct uaudio_mixer_node *mc = sc->sc_mixer_curr; 3067 struct usb_page_cache *pc; 3068 uint16_t len; 3069 uint8_t repeat = 1; 3070 uint8_t update; 3071 uint8_t chan; 3072 uint8_t buf[2]; 3073 3074 DPRINTF("\n"); 3075 3076 switch (USB_GET_STATE(xfer)) { 3077 case USB_ST_TRANSFERRED: 3078 tr_transferred: 3079 case USB_ST_SETUP: 3080 tr_setup: 3081 3082 if (mc == NULL) { 3083 mc = sc->sc_mixer_root; 3084 sc->sc_mixer_curr = mc; 3085 sc->sc_mixer_chan = 0; 3086 repeat = 0; 3087 } 3088 while (mc) { 3089 while (sc->sc_mixer_chan < mc->nchan) { 3090 3091 len = MIX_SIZE(mc->type); 3092 3093 chan = sc->sc_mixer_chan; 3094 3095 sc->sc_mixer_chan++; 3096 3097 update = ((mc->update[chan / 8] & (1 << (chan % 8))) && 3098 (mc->wValue[chan] != -1)); 3099 3100 mc->update[chan / 8] &= ~(1 << (chan % 8)); 3101 3102 if (update) { 3103 3104 req.bmRequestType = UT_WRITE_CLASS_INTERFACE; 3105 req.bRequest = SET_CUR; 3106 USETW(req.wValue, mc->wValue[chan]); 3107 USETW(req.wIndex, mc->wIndex); 3108 USETW(req.wLength, len); 3109 3110 if (len > 0) { 3111 buf[0] = (mc->wData[chan] & 0xFF); 3112 } 3113 if (len > 1) { 3114 buf[1] = (mc->wData[chan] >> 8) & 0xFF; 3115 } 3116 pc = usbd_xfer_get_frame(xfer, 0); 3117 usbd_copy_in(pc, 0, &req, sizeof(req)); 3118 pc = usbd_xfer_get_frame(xfer, 1); 3119 usbd_copy_in(pc, 0, buf, len); 3120 3121 usbd_xfer_set_frame_len(xfer, 0, sizeof(req)); 3122 usbd_xfer_set_frame_len(xfer, 1, len); 3123 usbd_xfer_set_frames(xfer, len ? 2 : 1); 3124 usbd_transfer_submit(xfer); 3125 return; 3126 } 3127 } 3128 3129 mc = mc->next; 3130 sc->sc_mixer_curr = mc; 3131 sc->sc_mixer_chan = 0; 3132 } 3133 3134 if (repeat) { 3135 goto tr_setup; 3136 } 3137 break; 3138 3139 default: /* Error */ 3140 DPRINTF("error=%s\n", usbd_errstr(error)); 3141 if (error == USB_ERR_CANCELLED) { 3142 /* do nothing - we are detaching */ 3143 break; 3144 } 3145 goto tr_transferred; 3146 } 3147 } 3148 3149 static usb_error_t 3150 uaudio_set_speed(struct usb_device *udev, uint8_t endpt, uint32_t speed) 3151 { 3152 struct usb_device_request req; 3153 uint8_t data[3]; 3154 3155 DPRINTFN(6, "endpt=%d speed=%u\n", endpt, speed); 3156 3157 req.bmRequestType = UT_WRITE_CLASS_ENDPOINT; 3158 req.bRequest = SET_CUR; 3159 USETW2(req.wValue, SAMPLING_FREQ_CONTROL, 0); 3160 USETW(req.wIndex, endpt); 3161 USETW(req.wLength, 3); 3162 data[0] = speed; 3163 data[1] = speed >> 8; 3164 data[2] = speed >> 16; 3165 3166 return (usbd_do_request(udev, NULL, &req, data)); 3167 } 3168 3169 static int 3170 uaudio_mixer_signext(uint8_t type, int val) 3171 { 3172 if (!MIX_UNSIGNED(type)) { 3173 if (MIX_SIZE(type) == 2) { 3174 val = (int16_t)val; 3175 } else { 3176 val = (int8_t)val; 3177 } 3178 } 3179 return (val); 3180 } 3181 3182 static int 3183 uaudio_mixer_bsd2value(struct uaudio_mixer_node *mc, int32_t val) 3184 { 3185 if (mc->type == MIX_ON_OFF) { 3186 val = (val != 0); 3187 } else if (mc->type == MIX_SELECTOR) { 3188 if ((val < mc->minval) || 3189 (val > mc->maxval)) { 3190 val = mc->minval; 3191 } 3192 } else { 3193 3194 /* compute actual volume */ 3195 val = (val * mc->mul) / 255; 3196 3197 /* add lower offset */ 3198 val = val + mc->minval; 3199 3200 /* make sure we don't write a value out of range */ 3201 if (val > mc->maxval) 3202 val = mc->maxval; 3203 else if (val < mc->minval) 3204 val = mc->minval; 3205 } 3206 3207 DPRINTFN(6, "type=0x%03x val=%d min=%d max=%d val=%d\n", 3208 mc->type, val, mc->minval, mc->maxval, val); 3209 return (val); 3210 } 3211 3212 static void 3213 uaudio_mixer_ctl_set(struct uaudio_softc *sc, struct uaudio_mixer_node *mc, 3214 uint8_t chan, int32_t val) 3215 { 3216 val = uaudio_mixer_bsd2value(mc, val); 3217 3218 mc->update[chan / 8] |= (1 << (chan % 8)); 3219 mc->wData[chan] = val; 3220 3221 /* start the transfer, if not already started */ 3222 3223 usbd_transfer_start(sc->sc_mixer_xfer[0]); 3224 } 3225 3226 static void 3227 uaudio_mixer_init(struct uaudio_softc *sc) 3228 { 3229 struct uaudio_mixer_node *mc; 3230 int32_t i; 3231 3232 for (mc = sc->sc_mixer_root; mc; 3233 mc = mc->next) { 3234 3235 if (mc->ctl != SOUND_MIXER_NRDEVICES) { 3236 /* 3237 * Set device mask bits. See 3238 * /usr/include/machine/soundcard.h 3239 */ 3240 sc->sc_mix_info |= (1 << mc->ctl); 3241 } 3242 if ((mc->ctl == SOUND_MIXER_NRDEVICES) && 3243 (mc->type == MIX_SELECTOR)) { 3244 3245 for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { 3246 if (mc->slctrtype[i - 1] == SOUND_MIXER_NRDEVICES) { 3247 continue; 3248 } 3249 sc->sc_recsrc_info |= 1 << mc->slctrtype[i - 1]; 3250 } 3251 } 3252 } 3253 } 3254 3255 int 3256 uaudio_mixer_init_sub(struct uaudio_softc *sc, struct snd_mixer *m) 3257 { 3258 DPRINTF("\n"); 3259 3260 if (usbd_transfer_setup(sc->sc_udev, &sc->sc_mixer_iface_index, 3261 sc->sc_mixer_xfer, uaudio_mixer_config, 1, sc, 3262 mixer_get_lock(m))) { 3263 DPRINTFN(0, "could not allocate USB " 3264 "transfer for audio mixer!\n"); 3265 return (ENOMEM); 3266 } 3267 if (!(sc->sc_mix_info & SOUND_MASK_VOLUME)) { 3268 mix_setparentchild(m, SOUND_MIXER_VOLUME, SOUND_MASK_PCM); 3269 mix_setrealdev(m, SOUND_MIXER_VOLUME, SOUND_MIXER_NONE); 3270 } 3271 mix_setdevs(m, sc->sc_mix_info); 3272 mix_setrecdevs(m, sc->sc_recsrc_info); 3273 return (0); 3274 } 3275 3276 int 3277 uaudio_mixer_uninit_sub(struct uaudio_softc *sc) 3278 { 3279 DPRINTF("\n"); 3280 3281 usbd_transfer_unsetup(sc->sc_mixer_xfer, 1); 3282 3283 return (0); 3284 } 3285 3286 void 3287 uaudio_mixer_set(struct uaudio_softc *sc, unsigned type, 3288 unsigned left, unsigned right) 3289 { 3290 struct uaudio_mixer_node *mc; 3291 3292 for (mc = sc->sc_mixer_root; mc; 3293 mc = mc->next) { 3294 3295 if (mc->ctl == type) { 3296 if (mc->nchan == 2) { 3297 /* set Right */ 3298 uaudio_mixer_ctl_set(sc, mc, 1, (int)(right * 255) / 100); 3299 } 3300 /* set Left or Mono */ 3301 uaudio_mixer_ctl_set(sc, mc, 0, (int)(left * 255) / 100); 3302 } 3303 } 3304 } 3305 3306 uint32_t 3307 uaudio_mixer_setrecsrc(struct uaudio_softc *sc, uint32_t src) 3308 { 3309 struct uaudio_mixer_node *mc; 3310 uint32_t mask; 3311 uint32_t temp; 3312 int32_t i; 3313 3314 for (mc = sc->sc_mixer_root; mc; 3315 mc = mc->next) { 3316 3317 if ((mc->ctl == SOUND_MIXER_NRDEVICES) && 3318 (mc->type == MIX_SELECTOR)) { 3319 3320 /* compute selector mask */ 3321 3322 mask = 0; 3323 for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { 3324 mask |= (1 << mc->slctrtype[i - 1]); 3325 } 3326 3327 temp = mask & src; 3328 if (temp == 0) { 3329 continue; 3330 } 3331 /* find the first set bit */ 3332 temp = (-temp) & temp; 3333 3334 /* update "src" */ 3335 src &= ~mask; 3336 src |= temp; 3337 3338 for (i = mc->minval; (i > 0) && (i <= mc->maxval); i++) { 3339 if (temp != (1 << mc->slctrtype[i - 1])) { 3340 continue; 3341 } 3342 uaudio_mixer_ctl_set(sc, mc, 0, i); 3343 break; 3344 } 3345 } 3346 } 3347 return (src); 3348 } 3349 3350 /*========================================================================* 3351 * MIDI support routines 3352 *========================================================================*/ 3353 3354 static void 3355 umidi_bulk_read_callback(struct usb_xfer *xfer, usb_error_t error) 3356 { 3357 struct umidi_chan *chan = usbd_xfer_softc(xfer); 3358 struct umidi_sub_chan *sub; 3359 struct usb_page_cache *pc; 3360 uint8_t buf[4]; 3361 uint8_t cmd_len; 3362 uint8_t cn; 3363 uint16_t pos; 3364 int actlen; 3365 3366 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL); 3367 3368 switch (USB_GET_STATE(xfer)) { 3369 case USB_ST_TRANSFERRED: 3370 3371 DPRINTF("actlen=%d bytes\n", actlen); 3372 3373 pos = 0; 3374 pc = usbd_xfer_get_frame(xfer, 0); 3375 3376 while (actlen >= 4) { 3377 3378 /* copy out the MIDI data */ 3379 usbd_copy_out(pc, pos, buf, 4); 3380 /* command length */ 3381 cmd_len = umidi_cmd_to_len[buf[0] & 0xF]; 3382 /* cable number */ 3383 cn = buf[0] >> 4; 3384 /* 3385 * Lookup sub-channel. The index is range 3386 * checked below. 3387 */ 3388 sub = &chan->sub[cn]; 3389 3390 if ((cmd_len != 0) && 3391 (cn < chan->max_cable) && 3392 (sub->read_open != 0)) { 3393 3394 /* Send data to the application */ 3395 usb_fifo_put_data_linear( 3396 sub->fifo.fp[USB_FIFO_RX], 3397 buf + 1, cmd_len, 1); 3398 } 3399 actlen -= 4; 3400 pos += 4; 3401 } 3402 3403 case USB_ST_SETUP: 3404 DPRINTF("start\n"); 3405 tr_setup: 3406 usbd_xfer_set_frame_len(xfer, 0, usbd_xfer_max_len(xfer)); 3407 usbd_transfer_submit(xfer); 3408 break; 3409 3410 default: 3411 DPRINTF("error=%s\n", usbd_errstr(error)); 3412 3413 if (error != USB_ERR_CANCELLED) { 3414 /* try to clear stall first */ 3415 usbd_xfer_set_stall(xfer); 3416 goto tr_setup; 3417 } 3418 break; 3419 } 3420 } 3421 3422 /* 3423 * The following statemachine, that converts MIDI commands to 3424 * USB MIDI packets, derives from Linux's usbmidi.c, which 3425 * was written by "Clemens Ladisch": 3426 * 3427 * Returns: 3428 * 0: No command 3429 * Else: Command is complete 3430 */ 3431 static uint8_t 3432 umidi_convert_to_usb(struct umidi_sub_chan *sub, uint8_t cn, uint8_t b) 3433 { 3434 uint8_t p0 = (cn << 4); 3435 3436 if (b >= 0xf8) { 3437 sub->temp_0[0] = p0 | 0x0f; 3438 sub->temp_0[1] = b; 3439 sub->temp_0[2] = 0; 3440 sub->temp_0[3] = 0; 3441 sub->temp_cmd = sub->temp_0; 3442 return (1); 3443 3444 } else if (b >= 0xf0) { 3445 switch (b) { 3446 case 0xf0: /* system exclusive begin */ 3447 sub->temp_1[1] = b; 3448 sub->state = UMIDI_ST_SYSEX_1; 3449 break; 3450 case 0xf1: /* MIDI time code */ 3451 case 0xf3: /* song select */ 3452 sub->temp_1[1] = b; 3453 sub->state = UMIDI_ST_1PARAM; 3454 break; 3455 case 0xf2: /* song position pointer */ 3456 sub->temp_1[1] = b; 3457 sub->state = UMIDI_ST_2PARAM_1; 3458 break; 3459 case 0xf4: /* unknown */ 3460 case 0xf5: /* unknown */ 3461 sub->state = UMIDI_ST_UNKNOWN; 3462 break; 3463 case 0xf6: /* tune request */ 3464 sub->temp_1[0] = p0 | 0x05; 3465 sub->temp_1[1] = 0xf6; 3466 sub->temp_1[2] = 0; 3467 sub->temp_1[3] = 0; 3468 sub->temp_cmd = sub->temp_1; 3469 sub->state = UMIDI_ST_UNKNOWN; 3470 return (1); 3471 3472 case 0xf7: /* system exclusive end */ 3473 switch (sub->state) { 3474 case UMIDI_ST_SYSEX_0: 3475 sub->temp_1[0] = p0 | 0x05; 3476 sub->temp_1[1] = 0xf7; 3477 sub->temp_1[2] = 0; 3478 sub->temp_1[3] = 0; 3479 sub->temp_cmd = sub->temp_1; 3480 sub->state = UMIDI_ST_UNKNOWN; 3481 return (1); 3482 case UMIDI_ST_SYSEX_1: 3483 sub->temp_1[0] = p0 | 0x06; 3484 sub->temp_1[2] = 0xf7; 3485 sub->temp_1[3] = 0; 3486 sub->temp_cmd = sub->temp_1; 3487 sub->state = UMIDI_ST_UNKNOWN; 3488 return (1); 3489 case UMIDI_ST_SYSEX_2: 3490 sub->temp_1[0] = p0 | 0x07; 3491 sub->temp_1[3] = 0xf7; 3492 sub->temp_cmd = sub->temp_1; 3493 sub->state = UMIDI_ST_UNKNOWN; 3494 return (1); 3495 } 3496 sub->state = UMIDI_ST_UNKNOWN; 3497 break; 3498 } 3499 } else if (b >= 0x80) { 3500 sub->temp_1[1] = b; 3501 if ((b >= 0xc0) && (b <= 0xdf)) { 3502 sub->state = UMIDI_ST_1PARAM; 3503 } else { 3504 sub->state = UMIDI_ST_2PARAM_1; 3505 } 3506 } else { /* b < 0x80 */ 3507 switch (sub->state) { 3508 case UMIDI_ST_1PARAM: 3509 if (sub->temp_1[1] < 0xf0) { 3510 p0 |= sub->temp_1[1] >> 4; 3511 } else { 3512 p0 |= 0x02; 3513 sub->state = UMIDI_ST_UNKNOWN; 3514 } 3515 sub->temp_1[0] = p0; 3516 sub->temp_1[2] = b; 3517 sub->temp_1[3] = 0; 3518 sub->temp_cmd = sub->temp_1; 3519 return (1); 3520 case UMIDI_ST_2PARAM_1: 3521 sub->temp_1[2] = b; 3522 sub->state = UMIDI_ST_2PARAM_2; 3523 break; 3524 case UMIDI_ST_2PARAM_2: 3525 if (sub->temp_1[1] < 0xf0) { 3526 p0 |= sub->temp_1[1] >> 4; 3527 sub->state = UMIDI_ST_2PARAM_1; 3528 } else { 3529 p0 |= 0x03; 3530 sub->state = UMIDI_ST_UNKNOWN; 3531 } 3532 sub->temp_1[0] = p0; 3533 sub->temp_1[3] = b; 3534 sub->temp_cmd = sub->temp_1; 3535 return (1); 3536 case UMIDI_ST_SYSEX_0: 3537 sub->temp_1[1] = b; 3538 sub->state = UMIDI_ST_SYSEX_1; 3539 break; 3540 case UMIDI_ST_SYSEX_1: 3541 sub->temp_1[2] = b; 3542 sub->state = UMIDI_ST_SYSEX_2; 3543 break; 3544 case UMIDI_ST_SYSEX_2: 3545 sub->temp_1[0] = p0 | 0x04; 3546 sub->temp_1[3] = b; 3547 sub->temp_cmd = sub->temp_1; 3548 sub->state = UMIDI_ST_SYSEX_0; 3549 return (1); 3550 default: 3551 break; 3552 } 3553 } 3554 return (0); 3555 } 3556 3557 static void 3558 umidi_bulk_write_callback(struct usb_xfer *xfer, usb_error_t error) 3559 { 3560 struct umidi_chan *chan = usbd_xfer_softc(xfer); 3561 struct umidi_sub_chan *sub; 3562 struct usb_page_cache *pc; 3563 uint32_t actlen; 3564 uint16_t nframes; 3565 uint8_t buf; 3566 uint8_t start_cable; 3567 uint8_t tr_any; 3568 int len; 3569 3570 usbd_xfer_status(xfer, &len, NULL, NULL, NULL); 3571 3572 /* 3573 * NOTE: Some MIDI devices only accept 4 bytes of data per 3574 * short terminated USB transfer. 3575 */ 3576 switch (USB_GET_STATE(xfer)) { 3577 case USB_ST_TRANSFERRED: 3578 DPRINTF("actlen=%d bytes\n", len); 3579 3580 case USB_ST_SETUP: 3581 tr_setup: 3582 DPRINTF("start\n"); 3583 3584 nframes = 0; /* reset */ 3585 start_cable = chan->curr_cable; 3586 tr_any = 0; 3587 pc = usbd_xfer_get_frame(xfer, 0); 3588 3589 while (1) { 3590 3591 /* round robin de-queueing */ 3592 3593 sub = &chan->sub[chan->curr_cable]; 3594 3595 if (sub->write_open) { 3596 usb_fifo_get_data_linear(sub->fifo.fp[USB_FIFO_TX], 3597 &buf, 1, &actlen, 0); 3598 } else { 3599 actlen = 0; 3600 } 3601 3602 if (actlen) { 3603 3604 tr_any = 1; 3605 3606 DPRINTF("byte=0x%02x from FIFO %u\n", buf, 3607 (unsigned int)chan->curr_cable); 3608 3609 if (umidi_convert_to_usb(sub, chan->curr_cable, buf)) { 3610 3611 DPRINTF("sub=0x%02x 0x%02x 0x%02x 0x%02x\n", 3612 sub->temp_cmd[0], sub->temp_cmd[1], 3613 sub->temp_cmd[2], sub->temp_cmd[3]); 3614 3615 usbd_copy_in(pc, nframes * 4, sub->temp_cmd, 4); 3616 3617 nframes++; 3618 3619 if ((nframes >= UMIDI_TX_FRAMES) || (chan->single_command != 0)) 3620 break; 3621 } else { 3622 continue; 3623 } 3624 } 3625 3626 chan->curr_cable++; 3627 if (chan->curr_cable >= chan->max_cable) 3628 chan->curr_cable = 0; 3629 3630 if (chan->curr_cable == start_cable) { 3631 if (tr_any == 0) 3632 break; 3633 tr_any = 0; 3634 } 3635 } 3636 3637 if (nframes != 0) { 3638 DPRINTF("Transferring %d frames\n", (int)nframes); 3639 usbd_xfer_set_frame_len(xfer, 0, 4 * nframes); 3640 usbd_transfer_submit(xfer); 3641 } 3642 break; 3643 3644 default: /* Error */ 3645 3646 DPRINTF("error=%s\n", usbd_errstr(error)); 3647 3648 if (error != USB_ERR_CANCELLED) { 3649 /* try to clear stall first */ 3650 usbd_xfer_set_stall(xfer); 3651 goto tr_setup; 3652 } 3653 break; 3654 } 3655 } 3656 3657 static struct umidi_sub_chan * 3658 umidi_sub_by_fifo(struct usb_fifo *fifo) 3659 { 3660 struct umidi_chan *chan = usb_fifo_softc(fifo); 3661 struct umidi_sub_chan *sub; 3662 uint32_t n; 3663 3664 for (n = 0; n < UMIDI_CABLES_MAX; n++) { 3665 sub = &chan->sub[n]; 3666 if ((sub->fifo.fp[USB_FIFO_RX] == fifo) || 3667 (sub->fifo.fp[USB_FIFO_TX] == fifo)) { 3668 return (sub); 3669 } 3670 } 3671 3672 panic("%s:%d cannot find usb_fifo!\n", 3673 __FILE__, __LINE__); 3674 3675 return (NULL); 3676 } 3677 3678 static void 3679 umidi_start_read(struct usb_fifo *fifo) 3680 { 3681 struct umidi_chan *chan = usb_fifo_softc(fifo); 3682 3683 usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]); 3684 } 3685 3686 static void 3687 umidi_stop_read(struct usb_fifo *fifo) 3688 { 3689 struct umidi_chan *chan = usb_fifo_softc(fifo); 3690 struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo); 3691 3692 DPRINTF("\n"); 3693 3694 sub->read_open = 0; 3695 3696 if (--(chan->read_open_refcount) == 0) { 3697 /* 3698 * XXX don't stop the read transfer here, hence that causes 3699 * problems with some MIDI adapters 3700 */ 3701 DPRINTF("(stopping read transfer)\n"); 3702 } 3703 } 3704 3705 static void 3706 umidi_start_write(struct usb_fifo *fifo) 3707 { 3708 struct umidi_chan *chan = usb_fifo_softc(fifo); 3709 3710 usbd_transfer_start(chan->xfer[UMIDI_TX_TRANSFER]); 3711 } 3712 3713 static void 3714 umidi_stop_write(struct usb_fifo *fifo) 3715 { 3716 struct umidi_chan *chan = usb_fifo_softc(fifo); 3717 struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo); 3718 3719 DPRINTF("\n"); 3720 3721 sub->write_open = 0; 3722 3723 if (--(chan->write_open_refcount) == 0) { 3724 DPRINTF("(stopping write transfer)\n"); 3725 usbd_transfer_stop(chan->xfer[UMIDI_TX_TRANSFER]); 3726 } 3727 } 3728 3729 static int 3730 umidi_open(struct usb_fifo *fifo, int fflags) 3731 { 3732 struct umidi_chan *chan = usb_fifo_softc(fifo); 3733 struct umidi_sub_chan *sub = umidi_sub_by_fifo(fifo); 3734 3735 if (fflags & FREAD) { 3736 if (usb_fifo_alloc_buffer(fifo, 4, (1024 / 4))) { 3737 return (ENOMEM); 3738 } 3739 mtx_lock(&chan->mtx); 3740 chan->read_open_refcount++; 3741 sub->read_open = 1; 3742 mtx_unlock(&chan->mtx); 3743 } 3744 if (fflags & FWRITE) { 3745 if (usb_fifo_alloc_buffer(fifo, 32, (1024 / 32))) { 3746 return (ENOMEM); 3747 } 3748 /* clear stall first */ 3749 mtx_lock(&chan->mtx); 3750 usbd_xfer_set_stall(chan->xfer[UMIDI_TX_TRANSFER]); 3751 chan->write_open_refcount++; 3752 sub->write_open = 1; 3753 3754 /* reset */ 3755 sub->state = UMIDI_ST_UNKNOWN; 3756 mtx_unlock(&chan->mtx); 3757 } 3758 return (0); /* success */ 3759 } 3760 3761 static void 3762 umidi_close(struct usb_fifo *fifo, int fflags) 3763 { 3764 if (fflags & FREAD) { 3765 usb_fifo_free_buffer(fifo); 3766 } 3767 if (fflags & FWRITE) { 3768 usb_fifo_free_buffer(fifo); 3769 } 3770 } 3771 3772 3773 static int 3774 umidi_ioctl(struct usb_fifo *fifo, u_long cmd, void *data, 3775 int fflags) 3776 { 3777 return (ENODEV); 3778 } 3779 3780 static void 3781 umidi_init(device_t dev) 3782 { 3783 struct uaudio_softc *sc = device_get_softc(dev); 3784 struct umidi_chan *chan = &sc->sc_midi_chan; 3785 3786 mtx_init(&chan->mtx, "umidi lock", NULL, MTX_DEF | MTX_RECURSE); 3787 } 3788 3789 static struct usb_fifo_methods umidi_fifo_methods = { 3790 .f_start_read = &umidi_start_read, 3791 .f_start_write = &umidi_start_write, 3792 .f_stop_read = &umidi_stop_read, 3793 .f_stop_write = &umidi_stop_write, 3794 .f_open = &umidi_open, 3795 .f_close = &umidi_close, 3796 .f_ioctl = &umidi_ioctl, 3797 .basename[0] = "umidi", 3798 }; 3799 3800 static int 3801 umidi_probe(device_t dev) 3802 { 3803 struct uaudio_softc *sc = device_get_softc(dev); 3804 struct usb_attach_arg *uaa = device_get_ivars(dev); 3805 struct umidi_chan *chan = &sc->sc_midi_chan; 3806 struct umidi_sub_chan *sub; 3807 int unit = device_get_unit(dev); 3808 int error; 3809 uint32_t n; 3810 3811 if (usb_test_quirk(uaa, UQ_SINGLE_CMD_MIDI)) 3812 chan->single_command = 1; 3813 3814 if (usbd_set_alt_interface_index(sc->sc_udev, chan->iface_index, 3815 chan->iface_alt_index)) { 3816 DPRINTF("setting of alternate index failed!\n"); 3817 goto detach; 3818 } 3819 usbd_set_parent_iface(sc->sc_udev, chan->iface_index, 3820 sc->sc_mixer_iface_index); 3821 3822 error = usbd_transfer_setup(uaa->device, &chan->iface_index, 3823 chan->xfer, umidi_config, UMIDI_N_TRANSFER, 3824 chan, &chan->mtx); 3825 if (error) { 3826 DPRINTF("error=%s\n", usbd_errstr(error)); 3827 goto detach; 3828 } 3829 if ((chan->max_cable > UMIDI_CABLES_MAX) || 3830 (chan->max_cable == 0)) { 3831 chan->max_cable = UMIDI_CABLES_MAX; 3832 } 3833 3834 for (n = 0; n < chan->max_cable; n++) { 3835 3836 sub = &chan->sub[n]; 3837 3838 error = usb_fifo_attach(sc->sc_udev, chan, &chan->mtx, 3839 &umidi_fifo_methods, &sub->fifo, unit, n, 3840 chan->iface_index, 3841 UID_ROOT, GID_OPERATOR, 0644); 3842 if (error) { 3843 goto detach; 3844 } 3845 } 3846 3847 mtx_lock(&chan->mtx); 3848 3849 /* clear stall first */ 3850 usbd_xfer_set_stall(chan->xfer[UMIDI_RX_TRANSFER]); 3851 3852 /* 3853 * NOTE: At least one device will not work properly unless the 3854 * BULK IN pipe is open all the time. This might have to do 3855 * about that the internal queues of the device overflow if we 3856 * don't read them regularly. 3857 */ 3858 usbd_transfer_start(chan->xfer[UMIDI_RX_TRANSFER]); 3859 3860 mtx_unlock(&chan->mtx); 3861 3862 return (0); /* success */ 3863 3864 detach: 3865 return (ENXIO); /* failure */ 3866 } 3867 3868 static int 3869 umidi_detach(device_t dev) 3870 { 3871 struct uaudio_softc *sc = device_get_softc(dev); 3872 struct umidi_chan *chan = &sc->sc_midi_chan; 3873 uint32_t n; 3874 3875 for (n = 0; n < UMIDI_CABLES_MAX; n++) { 3876 usb_fifo_detach(&chan->sub[n].fifo); 3877 } 3878 3879 mtx_lock(&chan->mtx); 3880 3881 usbd_transfer_stop(chan->xfer[UMIDI_RX_TRANSFER]); 3882 3883 mtx_unlock(&chan->mtx); 3884 3885 usbd_transfer_unsetup(chan->xfer, UMIDI_N_TRANSFER); 3886 3887 mtx_destroy(&chan->mtx); 3888 3889 return (0); 3890 } 3891 3892 DRIVER_MODULE(uaudio, uhub, uaudio_driver, uaudio_devclass, NULL, 0); 3893 MODULE_DEPEND(uaudio, usb, 1, 1, 1); 3894 MODULE_DEPEND(uaudio, sound, SOUND_MINVER, SOUND_PREFVER, SOUND_MAXVER); 3895 MODULE_VERSION(uaudio, 1); 3896