ALSA: usb-audio: scarlett2: Update mux controls to allow updates
authorGeoffrey D. Bennett <g@b4.vu>
Tue, 22 Jun 2021 17:03:50 +0000 (02:33 +0930)
committerTakashi Iwai <tiwai@suse.de>
Tue, 22 Jun 2021 19:42:24 +0000 (21:42 +0200)
Enabling/disabling speaker switching will update the mux
configuration. To prepare for this, add a private->mux_updated flag
and update the scarlett2_mux_src_enum_ctl_get() callback to check it.

Signed-off-by: Geoffrey D. Bennett <g@b4.vu>
Link: https://lore.kernel.org/r/5ce3bb9fe4006b550d18c783c5ff640fe0bfbfcb.1624379707.git.g@b4.vu
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/mixer_scarlett_gen2.c

index b3e1cb943c3c48b28944636d1114cd9bf3347167..279196feb811108d2bab89c9f982da742c013e6a 100644 (file)
@@ -378,6 +378,7 @@ struct scarlett2_data {
        u8 vol_updated;
        u8 input_other_updated;
        u8 monitor_other_updated;
+       u8 mux_updated;
        u8 sync;
        u8 master_vol;
        u8 vol[SCARLETT2_ANALOGUE_MAX];
@@ -1446,6 +1447,8 @@ static int scarlett2_usb_get_mux(struct usb_mixer_interface *mixer)
 
        __le32 data[SCARLETT2_MUX_MAX];
 
+       private->mux_updated = 0;
+
        req.num = 0;
        req.count = cpu_to_le16(count);
 
@@ -2799,7 +2802,8 @@ static int scarlett2_mux_src_enum_ctl_get(struct snd_kcontrol *kctl,
                                          struct snd_ctl_elem_value *ucontrol)
 {
        struct usb_mixer_elem_info *elem = kctl->private_data;
-       struct scarlett2_data *private = elem->head.mixer->private_data;
+       struct usb_mixer_interface *mixer = elem->head.mixer;
+       struct scarlett2_data *private = mixer->private_data;
        const struct scarlett2_device_info *info = private->info;
        const int (*port_count)[SCARLETT2_PORT_DIRNS] = info->port_count;
        int line_out_count =
@@ -2809,7 +2813,12 @@ static int scarlett2_mux_src_enum_ctl_get(struct snd_kcontrol *kctl,
        if (index < line_out_count)
                index = line_out_remap(private, index);
 
+       mutex_lock(&private->data_mutex);
+       if (private->mux_updated)
+               scarlett2_usb_get_mux(mixer);
        ucontrol->value.enumerated.item[0] = private->mux[index];
+       mutex_unlock(&private->data_mutex);
+
        return 0;
 }