ALSA: emu10k1: fix handling of half-loop interrupts
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Thu, 18 May 2023 09:30:47 +0000 (11:30 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 18 May 2023 11:07:13 +0000 (13:07 +0200)
We'd try to iterate the voices twice without resetting the pointer.
This went unnoticed, because the code isn't actually in use.

Amends commit 27ae958cf6 ("emu10k1 driver - add multichannel device
hw:x,3 [2-8/8]").

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230518093047.3697887-4-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/irq.c

index 7dc803a..a813ef8 100644 (file)
@@ -47,12 +47,13 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id)
                        status &= ~(IPR_VOLINCR|IPR_VOLDECR|IPR_MUTE);
                }
                if (status & IPR_CHANNELLOOP) {
+                       struct snd_emu10k1_voice *pvoice;
                        int voice;
                        int voice_max = status & IPR_CHANNELNUMBERMASK;
                        u32 val;
-                       struct snd_emu10k1_voice *pvoice = emu->voices;
 
                        val = snd_emu10k1_ptr_read(emu, CLIPL, 0);
+                       pvoice = emu->voices;
                        for (voice = 0; voice <= voice_max; voice++) {
                                if (voice == 0x20)
                                        val = snd_emu10k1_ptr_read(emu, CLIPH, 0);
@@ -68,6 +69,7 @@ irqreturn_t snd_emu10k1_interrupt(int irq, void *dev_id)
                                pvoice++;
                        }
                        val = snd_emu10k1_ptr_read(emu, HLIPL, 0);
+                       pvoice = emu->voices;
                        for (voice = 0; voice <= voice_max; voice++) {
                                if (voice == 0x20)
                                        val = snd_emu10k1_ptr_read(emu, HLIPH, 0);