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