mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-05 14:40:12 -04:00
ALSA: emu10k1: don't forget to reset reclaimed synth voices
The subsequent allocation may still fail after freeing some voices, so we shouldn't leave them in their programmed state. Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Link: https://lore.kernel.org/r/20230518140947.3725394-3-oswald.buddenhagen@gmx.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
committed by
Takashi Iwai
parent
f26a4cf087
commit
3eb5b1d0a1
@@ -98,6 +98,15 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void voice_free(struct snd_emu10k1 *emu,
|
||||
struct snd_emu10k1_voice *pvoice)
|
||||
{
|
||||
snd_emu10k1_voice_init(emu, pvoice->number);
|
||||
pvoice->interrupt = NULL;
|
||||
pvoice->use = pvoice->pcm = pvoice->synth = pvoice->midi = pvoice->efx = 0;
|
||||
pvoice->epcm = NULL;
|
||||
}
|
||||
|
||||
int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int number,
|
||||
struct snd_emu10k1_voice **rvoice)
|
||||
{
|
||||
@@ -118,12 +127,8 @@ int snd_emu10k1_voice_alloc(struct snd_emu10k1 *emu, int type, int number,
|
||||
/* free a voice from synth */
|
||||
if (emu->get_synth_voice) {
|
||||
result = emu->get_synth_voice(emu);
|
||||
if (result >= 0) {
|
||||
struct snd_emu10k1_voice *pvoice = &emu->voices[result];
|
||||
pvoice->interrupt = NULL;
|
||||
pvoice->use = pvoice->pcm = pvoice->synth = pvoice->midi = pvoice->efx = 0;
|
||||
pvoice->epcm = NULL;
|
||||
}
|
||||
if (result >= 0)
|
||||
voice_free(emu, &emu->voices[result]);
|
||||
}
|
||||
if (result < 0)
|
||||
break;
|
||||
@@ -143,10 +148,7 @@ int snd_emu10k1_voice_free(struct snd_emu10k1 *emu,
|
||||
if (snd_BUG_ON(!pvoice))
|
||||
return -EINVAL;
|
||||
spin_lock_irqsave(&emu->voice_lock, flags);
|
||||
pvoice->interrupt = NULL;
|
||||
pvoice->use = pvoice->pcm = pvoice->synth = pvoice->midi = pvoice->efx = 0;
|
||||
pvoice->epcm = NULL;
|
||||
snd_emu10k1_voice_init(emu, pvoice->number);
|
||||
voice_free(emu, pvoice);
|
||||
spin_unlock_irqrestore(&emu->voice_lock, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user