Lines Matching +full:clock +full:- +full:output +full:- +full:names
25 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
32 * - support for UAC2 effect units
33 * - support for graphical equalizers
34 * - RANGE and MEM set commands (UAC2)
35 * - RANGE and MEM interrupt dispatchers (UAC2)
36 * - audio channel clustering (UAC2)
37 * - audio sample rate converter units (UAC2)
38 * - proper handling of clock multipliers (UAC2)
39 * - dispatch clock change notifications (UAC2)
40 * - stop PCM streams which use a clock that became invalid
41 * - stop PCM streams which use a clock selector that has changed
42 * - parse available sample rates again when clock sources changed
52 #include <linux/usb/audio-v2.h>
89 /*E-mu 0202/0404/0204 eXtension Unit(XU) control*/
99 USB_XU_CLOCK_SOURCE_SELECTOR = 0x02, /* clock source*/
100 USB_XU_CLOCK_RATE_SELECTOR = 0x03, /* clock rate */
106 * manual mapping of mixer names
107 * if the mixer topology is too complicated and the parsed names are
115 const struct usbmix_name_map *p = state->map; in find_map()
120 for (p = state->map; p->id; p++) { in find_map()
121 if (p->id == unitid && in find_map()
122 (!control || !p->control || control == p->control)) in find_map()
132 if (!p || !p->name) in check_mapped_name()
135 buflen--; in check_mapped_name()
136 return strlcpy(buf, p->name, buflen); in check_mapped_name()
143 if (!p || p->name || p->dB) in check_ignored_ctl()
152 if (p && p->dB) { in check_mapped_dB()
153 cval->dBmin = p->dB->min; in check_mapped_dB()
154 cval->dBmax = p->dB->max; in check_mapped_dB()
155 cval->initialized = 1; in check_mapped_dB()
165 if (! state->selector_map) in check_mapped_selector_name()
167 for (p = state->selector_map; p->id; p++) { in check_mapped_selector_name()
168 if (p->id == unitid && index < p->count) in check_mapped_selector_name()
169 return strlcpy(buf, p->names[index], buflen); in check_mapped_selector_name()
182 while ((hdr = snd_usb_find_desc(state->buffer, state->buflen, hdr, in find_audio_control_unit()
184 if (hdr->bLength >= 4 && in find_audio_control_unit()
185 hdr->bDescriptorSubtype >= UAC_INPUT_TERMINAL && in find_audio_control_unit()
186 hdr->bDescriptorSubtype <= UAC2_SAMPLE_RATE_CONVERTER && in find_audio_control_unit()
187 hdr->bUnitID == unit) in find_audio_control_unit()
199 int len = usb_string(state->chip->dev, index, buf, maxlen - 1); in snd_usb_copy_string_desc()
205 * convert from the byte/word on usb descriptor to the zero-based integer
209 switch (cval->val_type) { in convert_signed_value()
220 val -= 0x100; in convert_signed_value()
228 val -= 0x10000; in convert_signed_value()
235 * convert from the zero-based int to the byte/word for usb descriptor
239 switch (cval->val_type) { in convert_bytes_value()
256 if (! cval->res) in get_relative_value()
257 cval->res = 1; in get_relative_value()
258 if (val < cval->min) in get_relative_value()
260 else if (val >= cval->max) in get_relative_value()
261 return (cval->max - cval->min + cval->res - 1) / cval->res; in get_relative_value()
263 return (val - cval->min) / cval->res; in get_relative_value()
269 return cval->min; in get_abs_value()
270 if (! cval->res) in get_abs_value()
271 cval->res = 1; in get_abs_value()
272 val *= cval->res; in get_abs_value()
273 val += cval->min; in get_abs_value()
274 if (val > cval->max) in get_abs_value()
275 return cval->max; in get_abs_value()
286 struct snd_usb_audio *chip = cval->mixer->chip; in get_ctl_value_v1()
288 int val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; in get_ctl_value_v1()
292 err = snd_usb_autoresume(cval->mixer->chip); in get_ctl_value_v1()
294 return -EIO; in get_ctl_value_v1()
295 while (timeout-- > 0) { in get_ctl_value_v1()
296 if (snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), request, in get_ctl_value_v1()
298 validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), in get_ctl_value_v1()
301 snd_usb_autosuspend(cval->mixer->chip); in get_ctl_value_v1()
305 snd_usb_autosuspend(cval->mixer->chip); in get_ctl_value_v1()
307 request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type); in get_ctl_value_v1()
308 return -EINVAL; in get_ctl_value_v1()
313 struct snd_usb_audio *chip = cval->mixer->chip; in get_ctl_value_v2()
329 ret = snd_usb_autoresume(chip) ? -EIO : 0; in get_ctl_value_v2()
333 ret = snd_usb_ctl_msg(chip->dev, usb_rcvctrlpipe(chip->dev, 0), bRequest, in get_ctl_value_v2()
335 validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), in get_ctl_value_v2()
342 request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type); in get_ctl_value_v2()
362 return -EINVAL; in get_ctl_value_v2()
372 return (cval->mixer->protocol == UAC_VERSION_1) ? in get_ctl_value()
386 return get_ctl_value(cval, UAC_GET_CUR, (cval->control << 8) | channel, value); in get_cur_mix_raw()
394 if (cval->cached & (1 << channel)) { in get_cur_mix_value()
395 *value = cval->cache_val[index]; in get_cur_mix_value()
400 if (!cval->mixer->ignore_ctl_error) in get_cur_mix_value()
402 cval->control, channel, err); in get_cur_mix_value()
405 cval->cached |= 1 << channel; in get_cur_mix_value()
406 cval->cache_val[index] = *value; in get_cur_mix_value()
418 struct snd_usb_audio *chip = cval->mixer->chip; in snd_usb_mixer_set_ctl_value()
422 if (cval->mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_set_ctl_value()
423 val_len = cval->val_type >= USB_MIXER_S16 ? 2 : 1; in snd_usb_mixer_set_ctl_value()
431 return -EINVAL; in snd_usb_mixer_set_ctl_value()
442 return -EIO; in snd_usb_mixer_set_ctl_value()
443 while (timeout-- > 0) in snd_usb_mixer_set_ctl_value()
444 if (snd_usb_ctl_msg(chip->dev, in snd_usb_mixer_set_ctl_value()
445 usb_sndctrlpipe(chip->dev, 0), request, in snd_usb_mixer_set_ctl_value()
447 validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), in snd_usb_mixer_set_ctl_value()
454 request, validx, snd_usb_ctrl_intf(chip) | (cval->id << 8), cval->val_type, buf[0], buf[1]); in snd_usb_mixer_set_ctl_value()
455 return -EINVAL; in snd_usb_mixer_set_ctl_value()
468 cval->master_readonly : in set_cur_mix_value()
469 cval->ch_readonly & (1 << (channel - 1)); in set_cur_mix_value()
473 __func__, channel, cval->control); in set_cur_mix_value()
477 err = snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR, (cval->control << 8) | channel, in set_cur_mix_value()
481 cval->cached |= 1 << channel; in set_cur_mix_value()
482 cval->cache_val[index] = value; in set_cur_mix_value()
492 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_vol_tlv()
496 return -ENOMEM; in mixer_vol_tlv()
497 scale[2] = cval->dBmin; in mixer_vol_tlv()
498 scale[3] = cval->dBmax; in mixer_vol_tlv()
500 return -EFAULT; in mixer_vol_tlv()
512 * check if the input/output channel routing is enabled on the given bitmap.
532 struct usb_mixer_elem_info *cval = kctl->private_data; in snd_usb_mixer_add_control()
535 while (snd_ctl_find_id(mixer->chip->card, &kctl->id)) in snd_usb_mixer_add_control()
536 kctl->id.index++; in snd_usb_mixer_add_control()
537 if ((err = snd_ctl_add(mixer->chip->card, kctl)) < 0) { in snd_usb_mixer_add_control()
541 cval->elem_id = &kctl->id; in snd_usb_mixer_add_control()
542 cval->next_id_elem = mixer->id_elems[cval->id]; in snd_usb_mixer_add_control()
543 mixer->id_elems[cval->id] = cval; in snd_usb_mixer_add_control()
556 { 0x0300, "Output" },
590 { 0x0712, "Multi-Track Recorder" },
598 struct iterm_name_combo *names; in get_term_name() local
600 if (iterm->name) in get_term_name()
601 return snd_usb_copy_string_desc(state, iterm->name, name, maxlen); in get_term_name()
603 /* virtual type - not a real terminal */ in get_term_name()
604 if (iterm->type >> 16) { in get_term_name()
607 switch (iterm->type >> 16) { in get_term_name()
617 return sprintf(name, "Unit %d", iterm->id); in get_term_name()
621 switch (iterm->type & 0xff00) { in get_term_name()
632 for (names = iterm_names; names->type; names++) in get_term_name()
633 if (names->type == iterm->type) { in get_term_name()
634 strcpy(name, names->name); in get_term_name()
635 return strlen(names->name); in get_term_name()
653 term->id = id; in check_input_term()
656 if (state->mixer->protocol == UAC_VERSION_1) { in check_input_term()
658 term->type = le16_to_cpu(d->wTerminalType); in check_input_term()
659 term->channels = d->bNrChannels; in check_input_term()
660 term->chconfig = le16_to_cpu(d->wChannelConfig); in check_input_term()
661 term->name = d->iTerminal; in check_input_term()
664 term->type = le16_to_cpu(d->wTerminalType); in check_input_term()
665 term->channels = d->bNrChannels; in check_input_term()
666 term->chconfig = le32_to_cpu(d->bmChannelConfig); in check_input_term()
667 term->name = d->iTerminal; in check_input_term()
669 /* call recursively to get the clock selectors */ in check_input_term()
670 err = check_input_term(state, d->bCSourceID, term); in check_input_term()
678 id = d->bSourceID; in check_input_term()
683 term->type = d->bDescriptorSubtype << 16; /* virtual type */ in check_input_term()
684 term->channels = uac_mixer_unit_bNrChannels(d); in check_input_term()
685 term->chconfig = uac_mixer_unit_wChannelConfig(d, state->mixer->protocol); in check_input_term()
686 term->name = uac_mixer_unit_iMixer(d); in check_input_term()
693 if (check_input_term(state, d->baSourceID[0], term) < 0) in check_input_term()
694 return -ENODEV; in check_input_term()
695 term->type = d->bDescriptorSubtype << 16; /* virtual type */ in check_input_term()
696 term->id = id; in check_input_term()
697 term->name = uac_selector_unit_iSelector(d); in check_input_term()
703 if (d->bNrInPins) { in check_input_term()
704 id = d->baSourceID[0]; in check_input_term()
707 term->type = d->bDescriptorSubtype << 16; /* virtual type */ in check_input_term()
708 term->channels = uac_processing_unit_bNrChannels(d); in check_input_term()
709 term->chconfig = uac_processing_unit_wChannelConfig(d, state->mixer->protocol); in check_input_term()
710 term->name = uac_processing_unit_iProcessing(d, state->mixer->protocol); in check_input_term()
715 term->type = d->bDescriptorSubtype << 16; /* virtual type */ in check_input_term()
716 term->id = id; in check_input_term()
717 term->name = d->iClockSource; in check_input_term()
721 return -ENODEV; in check_input_term()
724 return -ENODEV; in check_input_term()
741 { "Tone Control - Bass", USB_MIXER_S8 },
742 { "Tone Control - Mid", USB_MIXER_S8 },
743 { "Tone Control - Treble", USB_MIXER_S8 },
759 kfree(kctl->private_data); in usb_mixer_elem_free()
760 kctl->private_data = NULL; in usb_mixer_elem_free()
772 switch (cval->mixer->chip->usb_id) { in volume_control_quirks()
780 * I hope that the min value is -15360 for newer firmware --jk in volume_control_quirks()
782 if (!strcmp(kctl->id.name, "PCM Playback Volume") && in volume_control_quirks()
783 cval->min == -15616) { in volume_control_quirks()
786 cval->max = -256; in volume_control_quirks()
791 if (!strcmp(kctl->id.name, "Mic Capture Volume")) { in volume_control_quirks()
794 cval->min = 6080; in volume_control_quirks()
795 cval->max = 8768; in volume_control_quirks()
796 cval->res = 192; in volume_control_quirks()
806 * Proboly there is some logitech magic behind this number --fishor in volume_control_quirks()
808 if (!strcmp(kctl->id.name, "Mic Capture Volume")) { in volume_control_quirks()
810 "set resolution quirk: cval->res = 384\n"); in volume_control_quirks()
811 cval->res = 384; in volume_control_quirks()
825 cval->min = default_min; in get_min_max_with_quirks()
826 cval->max = cval->min + 1; in get_min_max_with_quirks()
827 cval->res = 1; in get_min_max_with_quirks()
828 cval->dBmin = cval->dBmax = 0; in get_min_max_with_quirks()
830 if (cval->val_type == USB_MIXER_BOOLEAN || in get_min_max_with_quirks()
831 cval->val_type == USB_MIXER_INV_BOOLEAN) { in get_min_max_with_quirks()
832 cval->initialized = 1; in get_min_max_with_quirks()
835 if (cval->cmask) { in get_min_max_with_quirks()
838 if (cval->cmask & (1 << i)) { in get_min_max_with_quirks()
843 if (get_ctl_value(cval, UAC_GET_MAX, (cval->control << 8) | minchn, &cval->max) < 0 || in get_min_max_with_quirks()
844 get_ctl_value(cval, UAC_GET_MIN, (cval->control << 8) | minchn, &cval->min) < 0) { in get_min_max_with_quirks()
846 cval->id, snd_usb_ctrl_intf(cval->mixer->chip), cval->control, cval->id); in get_min_max_with_quirks()
847 return -EINVAL; in get_min_max_with_quirks()
849 if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) { in get_min_max_with_quirks()
850 cval->res = 1; in get_min_max_with_quirks()
852 int last_valid_res = cval->res; in get_min_max_with_quirks()
854 while (cval->res > 1) { in get_min_max_with_quirks()
856 (cval->control << 8) | minchn, cval->res / 2) < 0) in get_min_max_with_quirks()
858 cval->res /= 2; in get_min_max_with_quirks()
860 if (get_ctl_value(cval, UAC_GET_RES, (cval->control << 8) | minchn, &cval->res) < 0) in get_min_max_with_quirks()
861 cval->res = last_valid_res; in get_min_max_with_quirks()
863 if (cval->res == 0) in get_min_max_with_quirks()
864 cval->res = 1; in get_min_max_with_quirks()
872 if (cval->min + cval->res < cval->max) { in get_min_max_with_quirks()
873 int last_valid_res = cval->res; in get_min_max_with_quirks()
878 if (test < cval->max) in get_min_max_with_quirks()
879 test += cval->res; in get_min_max_with_quirks()
881 test -= cval->res; in get_min_max_with_quirks()
882 if (test < cval->min || test > cval->max || in get_min_max_with_quirks()
885 cval->res = last_valid_res; in get_min_max_with_quirks()
890 cval->res *= 2; in get_min_max_with_quirks()
895 cval->initialized = 1; in get_min_max_with_quirks()
904 cval->dBmin = (convert_signed_value(cval, cval->min) * 100) / 256; in get_min_max_with_quirks()
905 cval->dBmax = (convert_signed_value(cval, cval->max) * 100) / 256; in get_min_max_with_quirks()
906 if (cval->dBmin > cval->dBmax) { in get_min_max_with_quirks()
908 if (cval->dBmin < 0) in get_min_max_with_quirks()
909 cval->dBmax = 0; in get_min_max_with_quirks()
910 else if (cval->dBmin > 0) in get_min_max_with_quirks()
911 cval->dBmin = 0; in get_min_max_with_quirks()
912 if (cval->dBmin > cval->dBmax) { in get_min_max_with_quirks()
914 return -EINVAL; in get_min_max_with_quirks()
926 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_info()
928 if (cval->val_type == USB_MIXER_BOOLEAN || in mixer_ctl_feature_info()
929 cval->val_type == USB_MIXER_INV_BOOLEAN) in mixer_ctl_feature_info()
930 uinfo->type = SNDRV_CTL_ELEM_TYPE_BOOLEAN; in mixer_ctl_feature_info()
932 uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; in mixer_ctl_feature_info()
933 uinfo->count = cval->channels; in mixer_ctl_feature_info()
934 if (cval->val_type == USB_MIXER_BOOLEAN || in mixer_ctl_feature_info()
935 cval->val_type == USB_MIXER_INV_BOOLEAN) { in mixer_ctl_feature_info()
936 uinfo->value.integer.min = 0; in mixer_ctl_feature_info()
937 uinfo->value.integer.max = 1; in mixer_ctl_feature_info()
939 if (!cval->initialized) { in mixer_ctl_feature_info()
941 if (cval->initialized && cval->dBmin >= cval->dBmax) { in mixer_ctl_feature_info()
942 kcontrol->vd[0].access &= in mixer_ctl_feature_info()
945 snd_ctl_notify(cval->mixer->chip->card, in mixer_ctl_feature_info()
947 &kcontrol->id); in mixer_ctl_feature_info()
950 uinfo->value.integer.min = 0; in mixer_ctl_feature_info()
951 uinfo->value.integer.max = in mixer_ctl_feature_info()
952 (cval->max - cval->min + cval->res - 1) / cval->res; in mixer_ctl_feature_info()
960 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_get()
963 ucontrol->value.integer.value[0] = cval->min; in mixer_ctl_feature_get()
964 if (cval->cmask) { in mixer_ctl_feature_get()
967 if (!(cval->cmask & (1 << c))) in mixer_ctl_feature_get()
971 return cval->mixer->ignore_ctl_error ? 0 : err; in mixer_ctl_feature_get()
973 ucontrol->value.integer.value[cnt] = val; in mixer_ctl_feature_get()
981 return cval->mixer->ignore_ctl_error ? 0 : err; in mixer_ctl_feature_get()
983 ucontrol->value.integer.value[0] = val; in mixer_ctl_feature_get()
991 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_feature_put()
995 if (cval->cmask) { in mixer_ctl_feature_put()
998 if (!(cval->cmask & (1 << c))) in mixer_ctl_feature_put()
1002 return cval->mixer->ignore_ctl_error ? 0 : err; in mixer_ctl_feature_put()
1003 val = ucontrol->value.integer.value[cnt]; in mixer_ctl_feature_put()
1015 return cval->mixer->ignore_ctl_error ? 0 : err; in mixer_ctl_feature_put()
1016 val = ucontrol->value.integer.value[0]; in mixer_ctl_feature_put()
1034 /* the read-only variant */
1053 return strlcat(kctl->id.name, str, sizeof(kctl->id.name)); in append_ctl_name()
1070 control++; /* change from zero-based to 1-based value */ in build_feature_ctl()
1086 cval->mixer = state->mixer; in build_feature_ctl()
1087 cval->id = unitid; in build_feature_ctl()
1088 cval->control = control; in build_feature_ctl()
1089 cval->cmask = ctl_mask; in build_feature_ctl()
1090 cval->val_type = audio_feature_info[control-1].type; in build_feature_ctl()
1092 cval->channels = 1; /* master channel */ in build_feature_ctl()
1093 cval->master_readonly = readonly_mask; in build_feature_ctl()
1099 cval->channels = c; in build_feature_ctl()
1100 cval->ch_readonly = readonly_mask; in build_feature_ctl()
1103 /* if all channels in the mask are marked read-only, make the control in build_feature_ctl()
1104 * read-only. set_cur_mix_value() will check the mask again and won't in build_feature_ctl()
1105 * issue write commands to read-only channels. */ in build_feature_ctl()
1106 if (cval->channels == readonly_mask) in build_feature_ctl()
1116 kctl->private_free = usb_mixer_elem_free; in build_feature_ctl()
1118 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in build_feature_ctl()
1122 kctl->id.name, sizeof(kctl->id.name)); in build_feature_ctl()
1131 * - if a name id is given in descriptor, use it. in build_feature_ctl()
1132 * - if the connected input can be determined, then use the name in build_feature_ctl()
1134 * - if the connected output can be determined, use it. in build_feature_ctl()
1135 * - otherwise, anonymous name. in build_feature_ctl()
1138 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 1); in build_feature_ctl()
1140 len = get_term_name(state, &state->oterm, kctl->id.name, sizeof(kctl->id.name), 1); in build_feature_ctl()
1142 len = snprintf(kctl->id.name, sizeof(kctl->id.name), in build_feature_ctl()
1146 * if the connected output is USB stream, then it's likely a in build_feature_ctl()
1149 if (! mapped_name && ! (state->oterm.type >> 16)) { in build_feature_ctl()
1150 if ((state->oterm.type & 0xff00) == 0x0100) { in build_feature_ctl()
1160 if (cval->dBmin < cval->dBmax || !cval->initialized) { in build_feature_ctl()
1161 kctl->tlv.c = mixer_vol_tlv; in build_feature_ctl()
1162 kctl->vd[0].access |= in build_feature_ctl()
1171 strlcpy(kctl->id.name, audio_feature_info[control-1].name, in build_feature_ctl()
1172 sizeof(kctl->id.name)); in build_feature_ctl()
1176 range = (cval->max - cval->min) / cval->res; in build_feature_ctl()
1183 "volume range (=%u), cval->res is probably wrong.", in build_feature_ctl()
1186 "val = %d/%d/%d", cval->id, in build_feature_ctl()
1187 kctl->id.name, cval->channels, in build_feature_ctl()
1188 cval->min, cval->max, cval->res); in build_feature_ctl()
1192 cval->id, kctl->id.name, cval->channels, cval->min, cval->max, cval->res); in build_feature_ctl()
1193 snd_usb_mixer_add_control(state->mixer, kctl); in build_feature_ctl()
1212 if (state->mixer->protocol == UAC_VERSION_1) { in parse_audio_feature_unit()
1213 csize = hdr->bControlSize; in parse_audio_feature_unit()
1217 return -EINVAL; in parse_audio_feature_unit()
1219 channels = (hdr->bLength - 7) / csize - 1; in parse_audio_feature_unit()
1220 bmaControls = hdr->bmaControls; in parse_audio_feature_unit()
1224 channels = (hdr->bLength - 6) / 4 - 1; in parse_audio_feature_unit()
1225 bmaControls = ftr->bmaControls; in parse_audio_feature_unit()
1228 if (hdr->bLength < 7 || !csize || hdr->bLength < 7 + csize) { in parse_audio_feature_unit()
1230 return -EINVAL; in parse_audio_feature_unit()
1234 if ((err = parse_audio_unit(state, hdr->bSourceID)) < 0) in parse_audio_feature_unit()
1238 if (check_input_term(state, hdr->bSourceID, &iterm) < 0) in parse_audio_feature_unit()
1239 return -EINVAL; in parse_audio_feature_unit()
1243 switch (state->chip->usb_id) { in parse_audio_feature_unit()
1247 /* disable non-functional volume control */ in parse_audio_feature_unit()
1256 if (state->mixer->protocol == UAC_VERSION_1) { in parse_audio_feature_unit()
1265 /* audio class v1 controls are never read-only */ in parse_audio_feature_unit()
1285 /* NOTE: build_feature_ctl() will mark the control read-only if all channels in parse_audio_feature_unit()
1286 * are marked read-only in the descriptors. Otherwise, the control will be in parse_audio_feature_unit()
1288 * command for read-only channels */ in parse_audio_feature_unit()
1331 cval->mixer = state->mixer; in build_mixer_unit_ctl()
1332 cval->id = unitid; in build_mixer_unit_ctl()
1333 cval->control = in_ch + 1; /* based on 1 */ in build_mixer_unit_ctl()
1334 cval->val_type = USB_MIXER_S16; in build_mixer_unit_ctl()
1336 …if (check_matrix_bitmap(uac_mixer_unit_bmControls(desc, state->mixer->protocol), in_ch, i, num_out… in build_mixer_unit_ctl()
1337 cval->cmask |= (1 << i); in build_mixer_unit_ctl()
1338 cval->channels++; in build_mixer_unit_ctl()
1351 kctl->private_free = usb_mixer_elem_free; in build_mixer_unit_ctl()
1353 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in build_mixer_unit_ctl()
1355 len = get_term_name(state, iterm, kctl->id.name, sizeof(kctl->id.name), 0); in build_mixer_unit_ctl()
1357 len = sprintf(kctl->id.name, "Mixer Source %d", in_ch + 1); in build_mixer_unit_ctl()
1361 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); in build_mixer_unit_ctl()
1362 snd_usb_mixer_add_control(state->mixer, kctl); in build_mixer_unit_ctl()
1376 …if (desc->bLength < 11 || ! (input_pins = desc->bNrInPins) || ! (num_outs = uac_mixer_unit_bNrChan… in parse_audio_mixer_unit()
1378 return -EINVAL; in parse_audio_mixer_unit()
1380 /* no bmControls field (e.g. Maya44) -> ignore */ in parse_audio_mixer_unit()
1381 if (desc->bLength <= 10 + input_pins) { in parse_audio_mixer_unit()
1389 err = parse_audio_unit(state, desc->baSourceID[pin]); in parse_audio_mixer_unit()
1392 err = check_input_term(state, desc->baSourceID[pin], &iterm); in parse_audio_mixer_unit()
1400 if (check_matrix_bitmap(uac_mixer_unit_bmControls(desc, state->mixer->protocol), in parse_audio_mixer_unit()
1422 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_procunit_get()
1425 err = get_cur_ctl_value(cval, cval->control << 8, &val); in mixer_ctl_procunit_get()
1426 if (err < 0 && cval->mixer->ignore_ctl_error) { in mixer_ctl_procunit_get()
1427 ucontrol->value.integer.value[0] = cval->min; in mixer_ctl_procunit_get()
1433 ucontrol->value.integer.value[0] = val; in mixer_ctl_procunit_get()
1440 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_procunit_put()
1443 err = get_cur_ctl_value(cval, cval->control << 8, &oval); in mixer_ctl_procunit_put()
1445 if (cval->mixer->ignore_ctl_error) in mixer_ctl_procunit_put()
1449 val = ucontrol->value.integer.value[0]; in mixer_ctl_procunit_put()
1452 set_cur_ctl_value(cval, cval->control << 8, val); in mixer_ctl_procunit_put()
1552 { USB_XU_CLOCK_RATE, "Clock rate", clock_rate_xu_info },
1564 int num_ins = desc->bNrInPins; in build_audio_procunit()
1579 if (desc->bLength < 13 || desc->bLength < 13 + num_ins || in build_audio_procunit()
1580 desc->bLength < num_ins + uac_processing_unit_bControlSize(desc, state->mixer->protocol)) { in build_audio_procunit()
1582 return -EINVAL; in build_audio_procunit()
1586 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0) in build_audio_procunit()
1590 type = le16_to_cpu(desc->wProcessType); in build_audio_procunit()
1591 for (info = list; info && info->type; info++) in build_audio_procunit()
1592 if (info->type == type) in build_audio_procunit()
1594 if (! info || ! info->type) in build_audio_procunit()
1597 for (valinfo = info->values; valinfo->control; valinfo++) { in build_audio_procunit()
1598 __u8 *controls = uac_processing_unit_bmControls(desc, state->mixer->protocol); in build_audio_procunit()
1600 if (! (controls[valinfo->control / 8] & (1 << ((valinfo->control % 8) - 1)))) in build_audio_procunit()
1602 map = find_map(state, unitid, valinfo->control); in build_audio_procunit()
1608 return -ENOMEM; in build_audio_procunit()
1610 cval->mixer = state->mixer; in build_audio_procunit()
1611 cval->id = unitid; in build_audio_procunit()
1612 cval->control = valinfo->control; in build_audio_procunit()
1613 cval->val_type = valinfo->val_type; in build_audio_procunit()
1614 cval->channels = 1; in build_audio_procunit()
1617 if (type == UAC_PROCESS_UP_DOWNMIX && cval->control == UAC_UD_MODE_SELECT) { in build_audio_procunit()
1618 __u8 *control_spec = uac_processing_unit_specific(desc, state->mixer->protocol); in build_audio_procunit()
1619 /* FIXME: hard-coded */ in build_audio_procunit()
1620 cval->min = 1; in build_audio_procunit()
1621 cval->max = control_spec[0]; in build_audio_procunit()
1622 cval->res = 1; in build_audio_procunit()
1623 cval->initialized = 1; in build_audio_procunit()
1626 /* E-Mu USB 0404/0202/TrackerPre/0204 in build_audio_procunit()
1629 cval->min = 0; in build_audio_procunit()
1630 cval->max = 5; in build_audio_procunit()
1631 cval->res = 1; in build_audio_procunit()
1632 cval->initialized = 1; in build_audio_procunit()
1634 get_min_max(cval, valinfo->min_value); in build_audio_procunit()
1641 return -ENOMEM; in build_audio_procunit()
1643 kctl->private_free = usb_mixer_elem_free; in build_audio_procunit()
1645 if (check_mapped_name(map, kctl->id.name, in build_audio_procunit()
1646 sizeof(kctl->id.name))) in build_audio_procunit()
1648 else if (info->name) in build_audio_procunit()
1649 strlcpy(kctl->id.name, info->name, sizeof(kctl->id.name)); in build_audio_procunit()
1651 nameid = uac_processing_unit_iProcessing(desc, state->mixer->protocol); in build_audio_procunit()
1654 len = snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name)); in build_audio_procunit()
1656 strlcpy(kctl->id.name, name, sizeof(kctl->id.name)); in build_audio_procunit()
1659 append_ctl_name(kctl, valinfo->suffix); in build_audio_procunit()
1662 cval->id, kctl->id.name, cval->channels, cval->min, cval->max); in build_audio_procunit()
1663 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0) in build_audio_procunit()
1692 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_info()
1693 const char **itemlist = (const char **)kcontrol->private_value; in mixer_ctl_selector_info()
1696 return -EINVAL; in mixer_ctl_selector_info()
1697 return snd_ctl_enum_info(uinfo, 1, cval->max, itemlist); in mixer_ctl_selector_info()
1703 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_get()
1706 err = get_cur_ctl_value(cval, cval->control << 8, &val); in mixer_ctl_selector_get()
1708 if (cval->mixer->ignore_ctl_error) { in mixer_ctl_selector_get()
1709 ucontrol->value.enumerated.item[0] = 0; in mixer_ctl_selector_get()
1715 ucontrol->value.enumerated.item[0] = val; in mixer_ctl_selector_get()
1722 struct usb_mixer_elem_info *cval = kcontrol->private_data; in mixer_ctl_selector_put()
1725 err = get_cur_ctl_value(cval, cval->control << 8, &oval); in mixer_ctl_selector_put()
1727 if (cval->mixer->ignore_ctl_error) in mixer_ctl_selector_put()
1731 val = ucontrol->value.enumerated.item[0]; in mixer_ctl_selector_put()
1734 set_cur_ctl_value(cval, cval->control << 8, val); in mixer_ctl_selector_put()
1757 if (kctl->private_data) { in usb_mixer_selector_elem_free()
1758 struct usb_mixer_elem_info *cval = kctl->private_data; in usb_mixer_selector_elem_free()
1759 num_ins = cval->max; in usb_mixer_selector_elem_free()
1761 kctl->private_data = NULL; in usb_mixer_selector_elem_free()
1763 if (kctl->private_value) { in usb_mixer_selector_elem_free()
1764 char **itemlist = (char **)kctl->private_value; in usb_mixer_selector_elem_free()
1768 kctl->private_value = 0; in usb_mixer_selector_elem_free()
1785 if (!desc->bNrInPins || desc->bLength < 5 + desc->bNrInPins) { in parse_audio_selector_unit()
1787 return -EINVAL; in parse_audio_selector_unit()
1790 for (i = 0; i < desc->bNrInPins; i++) { in parse_audio_selector_unit()
1791 if ((err = parse_audio_unit(state, desc->baSourceID[i])) < 0) in parse_audio_selector_unit()
1795 if (desc->bNrInPins == 1) /* only one ? nonsense! */ in parse_audio_selector_unit()
1805 return -ENOMEM; in parse_audio_selector_unit()
1807 cval->mixer = state->mixer; in parse_audio_selector_unit()
1808 cval->id = unitid; in parse_audio_selector_unit()
1809 cval->val_type = USB_MIXER_U8; in parse_audio_selector_unit()
1810 cval->channels = 1; in parse_audio_selector_unit()
1811 cval->min = 1; in parse_audio_selector_unit()
1812 cval->max = desc->bNrInPins; in parse_audio_selector_unit()
1813 cval->res = 1; in parse_audio_selector_unit()
1814 cval->initialized = 1; in parse_audio_selector_unit()
1816 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR) in parse_audio_selector_unit()
1817 cval->control = UAC2_CX_CLOCK_SELECTOR; in parse_audio_selector_unit()
1819 cval->control = 0; in parse_audio_selector_unit()
1821 namelist = kmalloc(sizeof(char *) * desc->bNrInPins, GFP_KERNEL); in parse_audio_selector_unit()
1825 return -ENOMEM; in parse_audio_selector_unit()
1828 for (i = 0; i < desc->bNrInPins; i++) { in parse_audio_selector_unit()
1834 while (i--) in parse_audio_selector_unit()
1838 return -ENOMEM; in parse_audio_selector_unit()
1842 if (! len && check_input_term(state, desc->baSourceID[i], &iterm) >= 0) in parse_audio_selector_unit()
1853 return -ENOMEM; in parse_audio_selector_unit()
1855 kctl->private_value = (unsigned long)namelist; in parse_audio_selector_unit()
1856 kctl->private_free = usb_mixer_selector_elem_free; in parse_audio_selector_unit()
1859 len = check_mapped_name(map, kctl->id.name, sizeof(kctl->id.name)); in parse_audio_selector_unit()
1863 snd_usb_copy_string_desc(state, nameid, kctl->id.name, sizeof(kctl->id.name)); in parse_audio_selector_unit()
1865 len = get_term_name(state, &state->oterm, in parse_audio_selector_unit()
1866 kctl->id.name, sizeof(kctl->id.name), 0); in parse_audio_selector_unit()
1868 strlcpy(kctl->id.name, "USB", sizeof(kctl->id.name)); in parse_audio_selector_unit()
1870 if (desc->bDescriptorSubtype == UAC2_CLOCK_SELECTOR) in parse_audio_selector_unit()
1871 append_ctl_name(kctl, " Clock Source"); in parse_audio_selector_unit()
1872 else if ((state->oterm.type & 0xff00) == 0x0100) in parse_audio_selector_unit()
1879 cval->id, kctl->id.name, desc->bNrInPins); in parse_audio_selector_unit()
1880 if ((err = snd_usb_mixer_add_control(state->mixer, kctl)) < 0) in parse_audio_selector_unit()
1895 if (test_and_set_bit(unitid, state->unitbitmap)) in parse_audio_unit()
1901 return -EINVAL; in parse_audio_unit()
1917 if (state->mixer->protocol == UAC_VERSION_1) in parse_audio_unit()
1920 return 0; /* FIXME - effect units not implemented yet */ in parse_audio_unit()
1923 if (state->mixer->protocol == UAC_VERSION_1) in parse_audio_unit()
1929 return -EINVAL; in parse_audio_unit()
1935 kfree(mixer->id_elems); in snd_usb_mixer_free()
1936 if (mixer->urb) { in snd_usb_mixer_free()
1937 kfree(mixer->urb->transfer_buffer); in snd_usb_mixer_free()
1938 usb_free_urb(mixer->urb); in snd_usb_mixer_free()
1940 usb_free_urb(mixer->rc_urb); in snd_usb_mixer_free()
1941 kfree(mixer->rc_setup_packet); in snd_usb_mixer_free()
1947 struct usb_mixer_interface *mixer = device->device_data; in snd_usb_mixer_dev_free()
1965 state.chip = mixer->chip; in snd_usb_mixer_controls()
1967 state.buffer = mixer->hostif->extra; in snd_usb_mixer_controls()
1968 state.buflen = mixer->hostif->extralen; in snd_usb_mixer_controls()
1971 for (map = usbmix_ctl_maps; map->id; map++) { in snd_usb_mixer_controls()
1972 if (map->id == state.chip->usb_id) { in snd_usb_mixer_controls()
1973 state.map = map->map; in snd_usb_mixer_controls()
1974 state.selector_map = map->selector_map; in snd_usb_mixer_controls()
1975 mixer->ignore_ctl_error = map->ignore_ctl_error; in snd_usb_mixer_controls()
1981 while ((p = snd_usb_find_csint_desc(mixer->hostif->extra, mixer->hostif->extralen, in snd_usb_mixer_controls()
1983 if (mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_controls()
1986 if (desc->bLength < sizeof(*desc)) in snd_usb_mixer_controls()
1988 set_bit(desc->bTerminalID, state.unitbitmap); /* mark terminal ID as visited */ in snd_usb_mixer_controls()
1989 state.oterm.id = desc->bTerminalID; in snd_usb_mixer_controls()
1990 state.oterm.type = le16_to_cpu(desc->wTerminalType); in snd_usb_mixer_controls()
1991 state.oterm.name = desc->iTerminal; in snd_usb_mixer_controls()
1992 err = parse_audio_unit(&state, desc->bSourceID); in snd_usb_mixer_controls()
1998 if (desc->bLength < sizeof(*desc)) in snd_usb_mixer_controls()
2000 set_bit(desc->bTerminalID, state.unitbitmap); /* mark terminal ID as visited */ in snd_usb_mixer_controls()
2001 state.oterm.id = desc->bTerminalID; in snd_usb_mixer_controls()
2002 state.oterm.type = le16_to_cpu(desc->wTerminalType); in snd_usb_mixer_controls()
2003 state.oterm.name = desc->iTerminal; in snd_usb_mixer_controls()
2004 err = parse_audio_unit(&state, desc->bSourceID); in snd_usb_mixer_controls()
2008 /* for UAC2, use the same approach to also add the clock selectors */ in snd_usb_mixer_controls()
2009 err = parse_audio_unit(&state, desc->bCSourceID); in snd_usb_mixer_controls()
2022 for (info = mixer->id_elems[unitid]; info; info = info->next_id_elem) in snd_usb_mixer_notify_id()
2023 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_usb_mixer_notify_id()
2024 info->elem_id); in snd_usb_mixer_notify_id()
2034 if (cval->elem_id) in snd_usb_mixer_dump_cval()
2036 cval->elem_id->name, cval->elem_id->index); in snd_usb_mixer_dump_cval()
2038 "channels=%i, type=\"%s\"\n", cval->id, in snd_usb_mixer_dump_cval()
2039 cval->control, cval->cmask, cval->channels, in snd_usb_mixer_dump_cval()
2040 val_types[cval->val_type]); in snd_usb_mixer_dump_cval()
2042 cval->min, cval->max, cval->dBmin, cval->dBmax); in snd_usb_mixer_dump_cval()
2048 struct snd_usb_audio *chip = entry->private_data; in snd_usb_mixer_proc_read()
2053 list_for_each_entry(mixer, &chip->mixer_list, list) { in snd_usb_mixer_proc_read()
2056 chip->usb_id, snd_usb_ctrl_intf(chip), in snd_usb_mixer_proc_read()
2057 mixer->ignore_ctl_error); in snd_usb_mixer_proc_read()
2058 snd_iprintf(buffer, "Card: %s\n", chip->card->longname); in snd_usb_mixer_proc_read()
2060 for (cval = mixer->id_elems[unitid]; cval; in snd_usb_mixer_proc_read()
2061 cval = cval->next_id_elem) in snd_usb_mixer_proc_read()
2081 for (info = mixer->id_elems[unitid]; info; info = info->next_id_elem) { in snd_usb_mixer_interrupt_v2()
2082 if (info->control != control) in snd_usb_mixer_interrupt_v2()
2089 info->cached &= ~(1 << channel); in snd_usb_mixer_interrupt_v2()
2091 info->cached = 0; in snd_usb_mixer_interrupt_v2()
2093 snd_ctl_notify(mixer->chip->card, SNDRV_CTL_EVENT_MASK_VALUE, in snd_usb_mixer_interrupt_v2()
2094 info->elem_id); in snd_usb_mixer_interrupt_v2()
2115 struct usb_mixer_interface *mixer = urb->context; in snd_usb_mixer_interrupt()
2116 int len = urb->actual_length; in snd_usb_mixer_interrupt()
2117 int ustatus = urb->status; in snd_usb_mixer_interrupt()
2122 if (mixer->protocol == UAC_VERSION_1) { in snd_usb_mixer_interrupt()
2125 for (status = urb->transfer_buffer; in snd_usb_mixer_interrupt()
2127 len -= sizeof(*status), status++) { in snd_usb_mixer_interrupt()
2129 status->bStatusType, in snd_usb_mixer_interrupt()
2130 status->bOriginator); in snd_usb_mixer_interrupt()
2133 if ((status->bStatusType & UAC1_STATUS_TYPE_ORIG_MASK) != in snd_usb_mixer_interrupt()
2137 if (status->bStatusType & UAC1_STATUS_TYPE_MEM_CHANGED) in snd_usb_mixer_interrupt()
2138 snd_usb_mixer_rc_memory_change(mixer, status->bOriginator); in snd_usb_mixer_interrupt()
2140 snd_usb_mixer_notify_id(mixer, status->bOriginator); in snd_usb_mixer_interrupt()
2145 for (msg = urb->transfer_buffer; in snd_usb_mixer_interrupt()
2147 len -= sizeof(*msg), msg++) { in snd_usb_mixer_interrupt()
2149 if ((msg->bInfo & UAC2_INTERRUPT_DATA_MSG_VENDOR) || in snd_usb_mixer_interrupt()
2150 (msg->bInfo & UAC2_INTERRUPT_DATA_MSG_EP)) in snd_usb_mixer_interrupt()
2153 snd_usb_mixer_interrupt_v2(mixer, msg->bAttribute, in snd_usb_mixer_interrupt()
2154 le16_to_cpu(msg->wValue), in snd_usb_mixer_interrupt()
2155 le16_to_cpu(msg->wIndex)); in snd_usb_mixer_interrupt()
2160 if (ustatus != -ENOENT && ustatus != -ECONNRESET && ustatus != -ESHUTDOWN) { in snd_usb_mixer_interrupt()
2161 urb->dev = mixer->chip->dev; in snd_usb_mixer_interrupt()
2169 usb_kill_urb(mixer->urb); in snd_usb_mixer_inactivate()
2170 usb_kill_urb(mixer->rc_urb); in snd_usb_mixer_inactivate()
2177 if (mixer->urb) { in snd_usb_mixer_activate()
2178 err = usb_submit_urb(mixer->urb, GFP_NOIO); in snd_usb_mixer_activate()
2195 if (get_iface_desc(mixer->hostif)->bNumEndpoints < 1) in snd_usb_mixer_status_create()
2197 ep = get_endpoint(mixer->hostif, 0); in snd_usb_mixer_status_create()
2202 buffer_length = le16_to_cpu(ep->wMaxPacketSize); in snd_usb_mixer_status_create()
2205 return -ENOMEM; in snd_usb_mixer_status_create()
2206 mixer->urb = usb_alloc_urb(0, GFP_KERNEL); in snd_usb_mixer_status_create()
2207 if (!mixer->urb) { in snd_usb_mixer_status_create()
2209 return -ENOMEM; in snd_usb_mixer_status_create()
2211 usb_fill_int_urb(mixer->urb, mixer->chip->dev, in snd_usb_mixer_status_create()
2212 usb_rcvintpipe(mixer->chip->dev, epnum), in snd_usb_mixer_status_create()
2214 snd_usb_mixer_interrupt, mixer, ep->bInterval); in snd_usb_mixer_status_create()
2215 usb_submit_urb(mixer->urb, GFP_KERNEL); in snd_usb_mixer_status_create()
2229 strcpy(chip->card->mixername, "USB Mixer"); in snd_usb_create_mixer()
2233 return -ENOMEM; in snd_usb_create_mixer()
2234 mixer->chip = chip; in snd_usb_create_mixer()
2235 mixer->ignore_ctl_error = ignore_error; in snd_usb_create_mixer()
2236 mixer->id_elems = kcalloc(MAX_ID_ELEMS, sizeof(*mixer->id_elems), in snd_usb_create_mixer()
2238 if (!mixer->id_elems) { in snd_usb_create_mixer()
2240 return -ENOMEM; in snd_usb_create_mixer()
2243 mixer->hostif = &usb_ifnum_to_if(chip->dev, ctrlif)->altsetting[0]; in snd_usb_create_mixer()
2244 switch (get_iface_desc(mixer->hostif)->bInterfaceProtocol) { in snd_usb_create_mixer()
2247 mixer->protocol = UAC_VERSION_1; in snd_usb_create_mixer()
2250 mixer->protocol = UAC_VERSION_2; in snd_usb_create_mixer()
2260 err = snd_device_new(chip->card, SNDRV_DEV_LOWLEVEL, mixer, &dev_ops); in snd_usb_create_mixer()
2264 if (list_empty(&chip->mixer_list) && in snd_usb_create_mixer()
2265 !snd_card_proc_new(chip->card, "usbmixer", &entry)) in snd_usb_create_mixer()
2268 list_add(&mixer->list, &chip->mixer_list); in snd_usb_create_mixer()
2281 usb_kill_urb(mixer->urb); in snd_usb_mixer_disconnect()
2282 usb_kill_urb(mixer->rc_urb); in snd_usb_mixer_disconnect()