|
@@ -2801,6 +2801,48 @@ static int snd_usb_mixer_status_create(struct usb_mixer_interface *mixer)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int keep_iface_ctl_get(struct snd_kcontrol *kcontrol,
|
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
|
+{
|
|
|
|
+ struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
|
|
|
|
+
|
|
|
|
+ ucontrol->value.integer.value[0] = mixer->chip->keep_iface;
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static int keep_iface_ctl_put(struct snd_kcontrol *kcontrol,
|
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
|
+{
|
|
|
|
+ struct usb_mixer_interface *mixer = snd_kcontrol_chip(kcontrol);
|
|
|
|
+ bool keep_iface = !!ucontrol->value.integer.value[0];
|
|
|
|
+
|
|
|
|
+ if (mixer->chip->keep_iface == keep_iface)
|
|
|
|
+ return 0;
|
|
|
|
+ mixer->chip->keep_iface = keep_iface;
|
|
|
|
+ return 1;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static const struct snd_kcontrol_new keep_iface_ctl = {
|
|
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_CARD,
|
|
|
|
+ .name = "Keep Interface",
|
|
|
|
+ .info = snd_ctl_boolean_mono_info,
|
|
|
|
+ .get = keep_iface_ctl_get,
|
|
|
|
+ .put = keep_iface_ctl_put,
|
|
|
|
+};
|
|
|
|
+
|
|
|
|
+static int create_keep_iface_ctl(struct usb_mixer_interface *mixer)
|
|
|
|
+{
|
|
|
|
+ struct snd_kcontrol *kctl = snd_ctl_new1(&keep_iface_ctl, mixer);
|
|
|
|
+
|
|
|
|
+ /* need only one control per card */
|
|
|
|
+ if (snd_ctl_find_id(mixer->chip->card, &kctl->id)) {
|
|
|
|
+ snd_ctl_free_one(kctl);
|
|
|
|
+ return 0;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return snd_ctl_add(mixer->chip->card, kctl);
|
|
|
|
+}
|
|
|
|
+
|
|
int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|
int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|
int ignore_error)
|
|
int ignore_error)
|
|
{
|
|
{
|
|
@@ -2842,6 +2884,9 @@ int snd_usb_create_mixer(struct snd_usb_audio *chip, int ctrlif,
|
|
if ((err = snd_usb_mixer_controls(mixer)) < 0 ||
|
|
if ((err = snd_usb_mixer_controls(mixer)) < 0 ||
|
|
(err = snd_usb_mixer_status_create(mixer)) < 0)
|
|
(err = snd_usb_mixer_status_create(mixer)) < 0)
|
|
goto _error;
|
|
goto _error;
|
|
|
|
+ err = create_keep_iface_ctl(mixer);
|
|
|
|
+ if (err < 0)
|
|
|
|
+ goto _error;
|
|
|
|
|
|
snd_usb_mixer_apply_create_quirk(mixer);
|
|
snd_usb_mixer_apply_create_quirk(mixer);
|
|
|
|
|