Commit bdb3b567 authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai

ALSA: emu10k1: centralize freeing PCM voices

This saves some code duplication; no functional change.
Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230519184122.3808185-1-oswald.buddenhagen@gmx.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 82a9fa6e
...@@ -76,16 +76,22 @@ static void snd_emu10k1_pcm_efx_interrupt(struct snd_emu10k1 *emu, ...@@ -76,16 +76,22 @@ static void snd_emu10k1_pcm_efx_interrupt(struct snd_emu10k1 *emu,
snd_pcm_period_elapsed(emu->pcm_capture_efx_substream); snd_pcm_period_elapsed(emu->pcm_capture_efx_substream);
} }
static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voices) static void snd_emu10k1_pcm_free_voices(struct snd_emu10k1_pcm *epcm)
{ {
int err, i; for (unsigned i = 0; i < ARRAY_SIZE(epcm->voices); i++) {
for (i = 0; i < ARRAY_SIZE(epcm->voices); i++) {
if (epcm->voices[i]) { if (epcm->voices[i]) {
snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]); snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]);
epcm->voices[i] = NULL; epcm->voices[i] = NULL;
} }
} }
}
static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voices)
{
int err, i;
snd_emu10k1_pcm_free_voices(epcm);
err = snd_emu10k1_voice_alloc(epcm->emu, err = snd_emu10k1_voice_alloc(epcm->emu,
epcm->type == PLAYBACK_EMUVOICE ? EMU10K1_PCM : EMU10K1_EFX, epcm->type == PLAYBACK_EMUVOICE ? EMU10K1_PCM : EMU10K1_EFX,
voices, voices,
...@@ -115,15 +121,13 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic ...@@ -115,15 +121,13 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic
"failed extra: voices=%d, frame=%d\n", "failed extra: voices=%d, frame=%d\n",
voices, frame); voices, frame);
*/ */
for (i = 0; i < voices; i++) { snd_emu10k1_pcm_free_voices(epcm);
snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]);
epcm->voices[i] = NULL;
}
return err; return err;
} }
epcm->extra->epcm = epcm; epcm->extra->epcm = epcm;
epcm->extra->interrupt = snd_emu10k1_pcm_interrupt; epcm->extra->interrupt = snd_emu10k1_pcm_interrupt;
} }
return 0; return 0;
} }
...@@ -359,7 +363,6 @@ static int snd_emu10k1_playback_hw_free(struct snd_pcm_substream *substream) ...@@ -359,7 +363,6 @@ static int snd_emu10k1_playback_hw_free(struct snd_pcm_substream *substream)
struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream); struct snd_emu10k1 *emu = snd_pcm_substream_chip(substream);
struct snd_pcm_runtime *runtime = substream->runtime; struct snd_pcm_runtime *runtime = substream->runtime;
struct snd_emu10k1_pcm *epcm; struct snd_emu10k1_pcm *epcm;
int i;
if (runtime->private_data == NULL) if (runtime->private_data == NULL)
return 0; return 0;
...@@ -368,12 +371,7 @@ static int snd_emu10k1_playback_hw_free(struct snd_pcm_substream *substream) ...@@ -368,12 +371,7 @@ static int snd_emu10k1_playback_hw_free(struct snd_pcm_substream *substream)
snd_emu10k1_voice_free(epcm->emu, epcm->extra); snd_emu10k1_voice_free(epcm->emu, epcm->extra);
epcm->extra = NULL; epcm->extra = NULL;
} }
for (i = 0; i < NUM_EFX_PLAYBACK; i++) { snd_emu10k1_pcm_free_voices(epcm);
if (epcm->voices[i]) {
snd_emu10k1_voice_free(epcm->emu, epcm->voices[i]);
epcm->voices[i] = NULL;
}
}
if (epcm->memblk) { if (epcm->memblk) {
snd_emu10k1_free_pages(emu, epcm->memblk); snd_emu10k1_free_pages(emu, epcm->memblk);
epcm->memblk = NULL; epcm->memblk = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment