]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ALSA: usb-audio: Avoid false E-MU sample-rate notifications
authorCássio Gabriel <cassiogabrielcontato@gmail.com>
Wed, 22 Apr 2026 00:53:52 +0000 (21:53 -0300)
committerTakashi Iwai <tiwai@suse.de>
Wed, 22 Apr 2026 15:51:42 +0000 (17:51 +0200)
snd_emuusb_set_samplerate() unconditionally notifies the E-MU
SampleRate Extension Unit control after issuing SET_CUR.

If snd_usb_mixer_set_ctl_value() fails, the control value has not
changed, yet snd_usb_mixer_notify_id() still invalidates the cache and
emits a value-change event to userspace.

Notify the control only after a successful write.

Fixes: 7d2b451e65d2 ("ALSA: usb-audio - Added functionality for E-mu 0404USB/0202USB/TrackerPre")
Cc: stable@vger.kernel.org
Signed-off-by: Cássio Gabriel <cassiogabrielcontato@gmail.com>
Link: https://patch.msgid.link/20260421-alsa-emuusb-samplerate-notify-v1-1-8b63bbc1d7f1@gmail.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/mixer_quirks.c

index a01510a855c247504cc0ed3ea596aeddb9187460..5194a2ac1ea8bb4c67301f4073b25de7eddcb52e 100644 (file)
@@ -1538,15 +1538,17 @@ void snd_emuusb_set_samplerate(struct snd_usb_audio *chip,
 {
        struct usb_mixer_interface *mixer;
        struct usb_mixer_elem_info *cval;
+       int err;
        int unitid = 12; /* SampleRate ExtensionUnit ID */
 
        list_for_each_entry(mixer, &chip->mixer_list, list) {
                if (mixer->id_elems[unitid]) {
                        cval = mixer_elem_list_to_info(mixer->id_elems[unitid]);
-                       snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR,
-                                                   cval->control << 8,
-                                                   samplerate_id);
-                       snd_usb_mixer_notify_id(mixer, unitid);
+                       err = snd_usb_mixer_set_ctl_value(cval, UAC_SET_CUR,
+                                                         cval->control << 8,
+                                                         samplerate_id);
+                       if (!err)
+                               snd_usb_mixer_notify_id(mixer, unitid);
                        break;
                }
        }