Commit 82a9fa6e authored by Oswald Buddenhagen's avatar Oswald Buddenhagen Committed by Takashi Iwai

ALSA: emu10k1: make freeing untouched playback voices cheap

This allows us to drop the code that tries to preserve already allocated
voices upon repeated hw_param callback invocations. Getting it right for
multi-channel voices would otherwise get a bit hairy.
Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230518140947.3725394-5-oswald.buddenhagen@gmx.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b840f8d8
...@@ -1453,6 +1453,7 @@ struct snd_emu10k1; ...@@ -1453,6 +1453,7 @@ struct snd_emu10k1;
struct snd_emu10k1_voice { struct snd_emu10k1_voice {
unsigned char number; unsigned char number;
unsigned char use; unsigned char use;
unsigned char dirty;
void (*interrupt)(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice); void (*interrupt)(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice);
struct snd_emu10k1_pcm *epcm; struct snd_emu10k1_pcm *epcm;
......
...@@ -437,6 +437,7 @@ start_voice(struct snd_emux_voice *vp) ...@@ -437,6 +437,7 @@ start_voice(struct snd_emux_voice *vp)
REGLIST_END); REGLIST_END);
hw->voices[ch].dirty = 1;
return 0; return 0;
} }
......
...@@ -80,17 +80,6 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic ...@@ -80,17 +80,6 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic
{ {
int err, i; int err, i;
if (epcm->voices[1] != NULL && voices < 2) {
snd_emu10k1_voice_free(epcm->emu, epcm->voices[1]);
epcm->voices[1] = NULL;
}
for (i = 0; i < voices; i++) {
if (epcm->voices[i] == NULL)
break;
}
if (i == voices)
return 0; /* already allocated */
for (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]);
...@@ -323,6 +312,8 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu, ...@@ -323,6 +312,8 @@ static void snd_emu10k1_pcm_init_voice(struct snd_emu10k1 *emu,
snd_emu10k1_compose_send_routing(send_routing)); snd_emu10k1_compose_send_routing(send_routing));
} }
emu->voices[voice].dirty = 1;
spin_unlock_irqrestore(&emu->reg_lock, flags); spin_unlock_irqrestore(&emu->reg_lock, flags);
} }
......
...@@ -372,11 +372,12 @@ static void snd_emu10k1_proc_voices_read(struct snd_info_entry *entry, ...@@ -372,11 +372,12 @@ static void snd_emu10k1_proc_voices_read(struct snd_info_entry *entry,
}; };
static_assert(ARRAY_SIZE(types) == EMU10K1_NUM_TYPES); static_assert(ARRAY_SIZE(types) == EMU10K1_NUM_TYPES);
snd_iprintf(buffer, "ch\tuse\n"); snd_iprintf(buffer, "ch\tdirty\tuse\n");
for (idx = 0; idx < NUM_G; idx++) { for (idx = 0; idx < NUM_G; idx++) {
voice = &emu->voices[idx]; voice = &emu->voices[idx];
snd_iprintf(buffer, "%i\t%s\n", snd_iprintf(buffer, "%i\t%u\t%s\n",
idx, idx,
voice->dirty,
types[voice->use]); types[voice->use]);
} }
} }
......
...@@ -87,9 +87,10 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number, ...@@ -87,9 +87,10 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number,
static void voice_free(struct snd_emu10k1 *emu, static void voice_free(struct snd_emu10k1 *emu,
struct snd_emu10k1_voice *pvoice) struct snd_emu10k1_voice *pvoice)
{ {
snd_emu10k1_voice_init(emu, pvoice->number); if (pvoice->dirty)
snd_emu10k1_voice_init(emu, pvoice->number);
pvoice->interrupt = NULL; pvoice->interrupt = NULL;
pvoice->use = 0; pvoice->use = pvoice->dirty = 0;
pvoice->epcm = NULL; pvoice->epcm = 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