ALSA: emu10k1: fix playback of 8-bit wavetable samples
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Sat, 6 Apr 2024 06:48:23 +0000 (08:48 +0200)
committerTakashi Iwai <tiwai@suse.de>
Sun, 7 Apr 2024 06:35:50 +0000 (08:35 +0200)
Samples are byte-sized in this mode, and thus the offset calculation
needs no shifting.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Message-ID: <20240406064830.1029573-11-oswald.buddenhagen@gmx.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emu10k1_callback.c

index 941bfbf812ed305bbfb368771d66134703ba8bea..5f6c47cbb809b1fcc4290cb71ab231d31a68e549 100644 (file)
@@ -310,6 +310,7 @@ start_voice(struct snd_emux_voice *vp)
 {
        unsigned int temp;
        int ch;
+       bool w_16;
        u32 psst, dsl, map, ccca, vtarget;
        unsigned int addr, mapped_offset;
        struct snd_midi_channel *chan;
@@ -321,6 +322,7 @@ start_voice(struct snd_emux_voice *vp)
        if (snd_BUG_ON(ch < 0))
                return -EINVAL;
        chan = vp->chan;
+       w_16 = !(vp->reg.sample_mode & SNDRV_SFNT_SAMPLE_8BITS);
 
        emem = (struct snd_emu10k1_memblk *)vp->block;
        if (emem == NULL)
@@ -330,7 +332,7 @@ start_voice(struct snd_emux_voice *vp)
                /* dev_err(hw->card->devK, "emu: cannot map!\n"); */
                return -ENOMEM;
        }
-       mapped_offset = snd_emu10k1_memblk_offset(emem) >> 1;
+       mapped_offset = snd_emu10k1_memblk_offset(emem) >> w_16;
        vp->reg.start += mapped_offset;
        vp->reg.end += mapped_offset;
        vp->reg.loopstart += mapped_offset;
@@ -371,7 +373,7 @@ start_voice(struct snd_emux_voice *vp)
                unsigned int shift = (vp->apitch - 0xe000) >> 10;
                ccca |= shift << 25;
        }
-       if (vp->reg.sample_mode & SNDRV_SFNT_SAMPLE_8BITS)
+       if (!w_16)
                ccca |= CCCA_8BITSELECT;
 
        vtarget = (unsigned int)vp->vtarget << 16;