Lines Matching refs:mixer
5 * Quirks and vendor-specific extensions for mixer interfaces
32 #include "mixer.h"
54 static int snd_create_std_mono_ctl_offset(struct usb_mixer_interface *mixer,
70 snd_usb_mixer_elem_init_std(&cval->head, mixer, unitid);
103 /* Add control to mixer */
107 static int snd_create_std_mono_ctl(struct usb_mixer_interface *mixer,
115 return snd_create_std_mono_ctl_offset(mixer, unitid, control, cmask,
122 static int snd_create_std_mono_table(struct usb_mixer_interface *mixer,
128 err = snd_create_std_mono_ctl(mixer, t->unitid, t->control,
138 static int add_single_ctl_with_resume(struct usb_mixer_interface *mixer,
152 list->mixer = mixer;
194 struct usb_mixer_interface *mixer = urb->context;
195 const struct rc_config *rc = mixer->rc_cfg;
201 code = mixer->rc_buffer[rc->offset];
203 code |= mixer->rc_buffer[rc->offset + 1] << 8;
205 /* the Mute button actually changes the mixer control */
207 snd_usb_mixer_notify_id(mixer, rc->mute_mixer_id);
208 mixer->rc_code = code;
210 wake_up(&mixer->rc_waitq);
216 struct usb_mixer_interface *mixer = hw->private_data;
222 err = wait_event_interruptible(mixer->rc_waitq,
223 (rc_code = xchg(&mixer->rc_code, 0)) != 0);
236 struct usb_mixer_interface *mixer = hw->private_data;
238 poll_wait(file, &mixer->rc_waitq, wait);
239 return mixer->rc_code ? EPOLLIN | EPOLLRDNORM : 0;
242 static int snd_usb_soundblaster_remote_init(struct usb_mixer_interface *mixer)
248 if (rc_configs[i].usb_id == mixer->chip->usb_id)
252 mixer->rc_cfg = &rc_configs[i];
254 len = mixer->rc_cfg->packet_length;
256 init_waitqueue_head(&mixer->rc_waitq);
257 err = snd_hwdep_new(mixer->chip->card, "SB remote control", 0, &hwdep);
261 "%s remote control", mixer->chip->card->shortname);
263 hwdep->private_data = mixer;
268 mixer->rc_urb = usb_alloc_urb(0, GFP_KERNEL);
269 if (!mixer->rc_urb)
271 mixer->rc_setup_packet = kmalloc(sizeof(*mixer->rc_setup_packet), GFP_KERNEL);
272 if (!mixer->rc_setup_packet) {
273 usb_free_urb(mixer->rc_urb);
274 mixer->rc_urb = NULL;
277 mixer->rc_setup_packet->bRequestType =
279 mixer->rc_setup_packet->bRequest = UAC_GET_MEM;
280 mixer->rc_setup_packet->wValue = cpu_to_le16(0);
281 mixer->rc_setup_packet->wIndex = cpu_to_le16(0);
282 mixer->rc_setup_packet->wLength = cpu_to_le16(len);
283 usb_fill_control_urb(mixer->rc_urb, mixer->chip->dev,
284 usb_rcvctrlpipe(mixer->chip->dev, 0),
285 (u8*)mixer->rc_setup_packet, mixer->rc_buffer, len,
286 snd_usb_soundblaster_remote_complete, mixer);
298 static int snd_audigy2nx_led_update(struct usb_mixer_interface *mixer,
301 struct snd_usb_audio *chip = mixer->chip;
332 struct usb_mixer_interface *mixer = list->mixer;
343 err = snd_audigy2nx_led_update(mixer, value, index);
351 return snd_audigy2nx_led_update(list->mixer, priv_value >> 8,
369 static int snd_audigy2nx_controls_create(struct usb_mixer_interface *mixer)
377 if ((mixer->chip->usb_id == USB_ID(0x041e, 0x3042)) && i == 0)
380 if ((mixer->chip->usb_id == USB_ID(0x041e, 0x30df)) && i == 0)
383 (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
384 mixer->chip->usb_id == USB_ID(0x041e, 0x3042) ||
385 mixer->chip->usb_id == USB_ID(0x041e, 0x30df) ||
386 mixer->chip->usb_id == USB_ID(0x041e, 0x3048)))
392 err = add_single_ctl_with_resume(mixer, 0,
420 struct usb_mixer_interface *mixer = entry->private_data;
424 snd_iprintf(buffer, "%s jacks\n\n", mixer->chip->card->shortname);
425 if (mixer->chip->usb_id == USB_ID(0x041e, 0x3020))
427 else if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
428 mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
435 err = snd_usb_lock_shutdown(mixer->chip);
438 err = snd_usb_ctl_msg(mixer->chip->dev,
439 usb_rcvctrlpipe(mixer->chip->dev, 0),
443 snd_usb_unlock_shutdown(mixer->chip);
467 static int snd_emu0204_ch_switch_update(struct usb_mixer_interface *mixer,
470 struct snd_usb_audio *chip = mixer->chip;
492 struct usb_mixer_interface *mixer = list->mixer;
503 err = snd_emu0204_ch_switch_update(mixer, value);
509 return snd_emu0204_ch_switch_update(list->mixer,
522 static int snd_emu0204_controls_create(struct usb_mixer_interface *mixer)
524 return add_single_ctl_with_resume(mixer, 0,
538 static int snd_xonar_u1_switch_update(struct usb_mixer_interface *mixer,
541 struct snd_usb_audio *chip = mixer->chip;
571 err = snd_xonar_u1_switch_update(list->mixer, new_status);
577 return snd_xonar_u1_switch_update(list->mixer,
590 static int snd_xonar_u1_controls_create(struct usb_mixer_interface *mixer)
592 return add_single_ctl_with_resume(mixer, 0,
606 static int snd_mbox1_switch_update(struct usb_mixer_interface *mixer, int val)
608 struct snd_usb_audio *chip = mixer->chip;
678 struct usb_mixer_interface *mixer = list->mixer;
688 err = snd_mbox1_switch_update(mixer, new_val);
705 return snd_mbox1_switch_update(list->mixer, list->kctl->private_value);
719 static int snd_mbox1_create_sync_switch(struct usb_mixer_interface *mixer)
721 return add_single_ctl_with_resume(mixer, 0,
730 static int snd_ni_control_init_val(struct usb_mixer_interface *mixer,
733 struct usb_device *dev = mixer->chip->dev;
761 struct snd_usb_audio *chip = list->mixer->chip;
847 static int snd_nativeinstruments_create_mixer(struct usb_mixer_interface *mixer,
866 err = add_single_ctl_with_resume(mixer, 0,
871 snd_ni_control_init_val(mixer, list->kctl);
890 static int snd_ftu_eff_switch_init(struct usb_mixer_interface *mixer,
893 struct usb_device *dev = mixer->chip->dev;
904 snd_usb_ctrl_intf(mixer->chip) | ((pval & 0xff) << 8),
922 struct snd_usb_audio *chip = list->mixer->chip;
962 static int snd_ftu_create_effect_switch(struct usb_mixer_interface *mixer,
977 err = add_single_ctl_with_resume(mixer, bUnitID,
983 snd_ftu_eff_switch_init(mixer, list->kctl);
988 static int snd_ftu_create_volume_ctls(struct usb_mixer_interface *mixer)
1004 err = snd_create_std_mono_ctl(mixer, id, control,
1015 err = snd_create_std_mono_ctl(mixer, id, control,
1026 /* This control needs a volume quirk, see mixer.c */
1027 static int snd_ftu_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
1035 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1039 /* This control needs a volume quirk, see mixer.c */
1040 static int snd_ftu_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
1048 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1052 /* This control needs a volume quirk, see mixer.c */
1053 static int snd_ftu_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1061 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1065 static int snd_ftu_create_effect_return_ctls(struct usb_mixer_interface *mixer)
1079 err = snd_create_std_mono_ctl(mixer, id, control,
1089 static int snd_ftu_create_effect_send_ctls(struct usb_mixer_interface *mixer)
1103 err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1113 err = snd_create_std_mono_ctl(mixer, id, control, cmask,
1122 static int snd_ftu_create_mixer(struct usb_mixer_interface *mixer)
1126 err = snd_ftu_create_volume_ctls(mixer);
1130 err = snd_ftu_create_effect_switch(mixer, 1, 6);
1134 err = snd_ftu_create_effect_volume_ctl(mixer);
1138 err = snd_ftu_create_effect_duration_ctl(mixer);
1142 err = snd_ftu_create_effect_feedback_ctl(mixer);
1146 err = snd_ftu_create_effect_return_ctls(mixer);
1150 err = snd_ftu_create_effect_send_ctls(mixer);
1160 struct usb_mixer_interface *mixer;
1164 list_for_each_entry(mixer, &chip->mixer_list, list) {
1165 if (mixer->id_elems[unitid]) {
1166 cval = mixer_elem_list_to_info(mixer->id_elems[unitid]);
1170 snd_usb_mixer_notify_id(mixer, unitid);
1177 /* C400/C600 volume controls, this control needs a volume quirk, see mixer.c */
1178 static int snd_c400_create_vol_ctls(struct usb_mixer_interface *mixer)
1190 switch (mixer->chip->usb_id) {
1215 err = snd_create_std_mono_ctl_offset(mixer, id, control,
1226 /* This control needs a volume quirk, see mixer.c */
1227 static int snd_c400_create_effect_volume_ctl(struct usb_mixer_interface *mixer)
1235 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1239 /* This control needs a volume quirk, see mixer.c */
1240 static int snd_c400_create_effect_duration_ctl(struct usb_mixer_interface *mixer)
1248 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1252 /* This control needs a volume quirk, see mixer.c */
1253 static int snd_c400_create_effect_feedback_ctl(struct usb_mixer_interface *mixer)
1261 return snd_create_std_mono_ctl(mixer, id, control, cmask, val_type,
1265 static int snd_c400_create_effect_vol_ctls(struct usb_mixer_interface *mixer)
1277 switch (mixer->chip->usb_id) {
1300 err = snd_create_std_mono_ctl(mixer, id, control,
1310 static int snd_c400_create_effect_ret_vol_ctls(struct usb_mixer_interface *mixer)
1322 switch (mixer->chip->usb_id) {
1342 err = snd_create_std_mono_ctl_offset(mixer, id, control,
1352 static int snd_c400_create_mixer(struct usb_mixer_interface *mixer)
1356 err = snd_c400_create_vol_ctls(mixer);
1360 err = snd_c400_create_effect_vol_ctls(mixer);
1364 err = snd_c400_create_effect_ret_vol_ctls(mixer);
1368 err = snd_ftu_create_effect_switch(mixer, 2, 0x43);
1372 err = snd_c400_create_effect_volume_ctl(mixer);
1376 err = snd_c400_create_effect_duration_ctl(mixer);
1380 err = snd_c400_create_effect_feedback_ctl(mixer);
1388 * The mixer units for Ebox-44 are corrupt, and even where they
1390 * stereo. So we provide a good mixer here.
1496 struct snd_usb_audio *chip = list->mixer->chip;
1548 struct snd_usb_audio *chip = list->mixer->chip;
1635 struct snd_usb_audio *chip = list->mixer->chip;
1698 static int snd_microii_controls_create(struct usb_mixer_interface *mixer)
1708 err = add_single_ctl_with_resume(mixer, 0,
1728 static int snd_soundblaster_e1_switch_update(struct usb_mixer_interface *mixer,
1731 struct snd_usb_audio *chip = mixer->chip;
1759 err = snd_soundblaster_e1_switch_update(list->mixer, value);
1765 return snd_soundblaster_e1_switch_update(list->mixer,
1788 static int snd_soundblaster_e1_switch_create(struct usb_mixer_interface *mixer)
1790 return add_single_ctl_with_resume(mixer, 0,
1806 static int dell_dock_mixer_init(struct usb_mixer_interface *mixer)
1809 dell_dock_init_vol(mixer->chip, 1, 16);
1810 dell_dock_init_vol(mixer->chip, 2, 16);
1811 dell_dock_init_vol(mixer->chip, 1, 19);
1812 dell_dock_init_vol(mixer->chip, 2, 19);
1896 struct snd_usb_audio *chip = list->mixer->chip;
2014 struct snd_usb_audio *chip = list->mixer->chip;
2174 static int snd_rme_controls_create(struct usb_mixer_interface *mixer)
2179 err = add_single_ctl_with_resume(mixer, 0,
2231 static int snd_bbfpro_ctl_update(struct usb_mixer_interface *mixer, u8 reg,
2236 struct snd_usb_audio *chip = mixer->chip;
2331 struct usb_mixer_interface *mixer = list->mixer;
2358 err = snd_bbfpro_ctl_update(mixer, reg, idx, val);
2372 return snd_bbfpro_ctl_update(list->mixer, reg, idx, value);
2375 static int snd_bbfpro_vol_update(struct usb_mixer_interface *mixer, u16 index,
2378 struct snd_usb_audio *chip = mixer->chip;
2430 struct usb_mixer_interface *mixer = list->mixer;
2447 err = snd_bbfpro_vol_update(mixer, idx, new_val);
2457 return snd_bbfpro_vol_update(list->mixer, idx, val);
2479 static int snd_bbfpro_ctl_add(struct usb_mixer_interface *mixer, u8 reg,
2489 return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_ctl_resume,
2493 static int snd_bbfpro_vol_add(struct usb_mixer_interface *mixer, u16 index,
2501 return add_single_ctl_with_resume(mixer, 0, snd_bbfpro_vol_resume,
2505 static int snd_bbfpro_controls_create(struct usb_mixer_interface *mixer)
2525 err = snd_bbfpro_vol_add(mixer, (26 * o + i), name);
2533 err = snd_bbfpro_vol_add(mixer, (26 * o + 12 + i),
2541 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2547 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2553 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2559 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG1,
2566 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2572 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2578 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2584 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2590 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2596 err = snd_bbfpro_ctl_add(mixer, SND_BBFPRO_CTL_REG2,
2844 static int snd_djm_controls_update(struct usb_mixer_interface *mixer,
2853 err = snd_usb_lock_shutdown(mixer->chip);
2858 mixer->chip->dev, usb_sndctrlpipe(mixer->chip->dev, 0),
2865 snd_usb_unlock_shutdown(mixer->chip);
2879 struct usb_mixer_interface *mixer = list->mixer;
2890 return snd_djm_controls_update(mixer, device, group, value);
2900 return snd_djm_controls_update(list->mixer, device, group, value);
2903 static int snd_djm_controls_create(struct usb_mixer_interface *mixer,
2927 err = snd_djm_controls_update(mixer, device_idx, i, value);
2930 err = add_single_ctl_with_resume(mixer, 0, snd_djm_controls_resume,
2938 int snd_usb_mixer_apply_create_quirk(struct usb_mixer_interface *mixer)
2942 err = snd_usb_soundblaster_remote_init(mixer);
2946 switch (mixer->chip->usb_id) {
2949 err = snd_us16x08_controls_create(mixer);
2956 err = snd_audigy2nx_controls_create(mixer);
2959 snd_card_ro_proc_new(mixer->chip->card, "audigy2nx",
2960 mixer, snd_audigy2nx_proc_read);
2965 err = snd_emu0204_controls_create(mixer);
2970 err = snd_c400_create_mixer(mixer);
2975 err = snd_ftu_create_mixer(mixer);
2981 err = snd_xonar_u1_controls_create(mixer);
2985 err = snd_microii_controls_create(mixer);
2989 err = snd_mbox1_create_sync_switch(mixer);
2993 err = snd_nativeinstruments_create_mixer(mixer,
2999 err = snd_nativeinstruments_create_mixer(mixer,
3006 err = snd_create_std_mono_table(mixer, ebox44_table);
3014 err = snd_scarlett_controls_create(mixer);
3020 err = snd_scarlett_gen2_init(mixer);
3024 err = snd_soundblaster_e1_switch_create(mixer);
3027 err = dell_dock_mixer_init(mixer);
3033 err = snd_rme_controls_create(mixer);
3037 err = snd_sc1810_init_mixer(mixer);
3040 err = snd_bbfpro_controls_create(mixer);
3043 err = snd_djm_controls_create(mixer, SND_DJM_250MK2_IDX);
3046 err = snd_djm_controls_create(mixer, SND_DJM_750_IDX);
3049 err = snd_djm_controls_create(mixer, SND_DJM_900NXS2_IDX);
3057 void snd_usb_mixer_resume_quirk(struct usb_mixer_interface *mixer)
3059 switch (mixer->chip->usb_id) {
3061 dell_dock_mixer_init(mixer);
3067 void snd_usb_mixer_rc_memory_change(struct usb_mixer_interface *mixer,
3070 if (!mixer->rc_cfg)
3075 mixer->rc_urb->dev = mixer->chip->dev;
3076 usb_submit_urb(mixer->rc_urb, GFP_ATOMIC);
3085 if (mixer->chip->usb_id == USB_ID(0x041e, 0x3040) ||
3086 mixer->chip->usb_id == USB_ID(0x041e, 0x3048))
3087 snd_usb_mixer_notify_id(mixer, mixer->rc_cfg->mute_mixer_id);
3090 usb_audio_dbg(mixer->chip, "memory change in unknown unit %d\n", unitid);
3095 static void snd_dragonfly_quirk_db_scale(struct usb_mixer_interface *mixer,
3115 usb_audio_info(mixer->chip, "applying DragonFly dB scale quirk (0-50 variant)\n");
3124 usb_audio_info(mixer->chip, "ignoring too narrow dB range on a DragonFly device");
3129 void snd_usb_mixer_fu_apply_quirk(struct usb_mixer_interface *mixer,
3133 switch (mixer->chip->usb_id) {
3136 snd_dragonfly_quirk_db_scale(mixer, cval, kctl);