ALSA: emu10k1: fix terminating synthesizer voices
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Thu, 18 May 2023 14:03:39 +0000 (16:03 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 18 May 2023 14:40:22 +0000 (16:40 +0200)
Make terminate_voice() actually do at all what it's supposed to do:
instantly and completely shut down the note.

The bogus behavior was mostly harmless, as usually the voice is freed
right afterwards, which implicitly terminates it anyway.

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

index aab8d64..dcd7be2 100644 (file)
@@ -136,8 +136,13 @@ terminate_voice(struct snd_emux_voice *vp)
        if (snd_BUG_ON(!vp))
                return;
        hw = vp->hw;
-       snd_emu10k1_ptr_write(hw, DCYSUSV, vp->ch,
-               DCYSUSV_PHASE1_MASK | DCYSUSV_DECAYTIME_MASK | DCYSUSV_CHANNELENABLE_MASK);
+       snd_emu10k1_ptr_write_multiple(hw, vp->ch,
+               DCYSUSV, 0,
+               VTFT, VTFT_FILTERTARGET_MASK,
+               CVCF, CVCF_CURRENTFILTER_MASK,
+               PTRX, 0,
+               CPF, 0,
+               REGLIST_END);
        if (vp->block) {
                struct snd_emu10k1_memblk *emem;
                emem = (struct snd_emu10k1_memblk *)vp->block;