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

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.de


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent b840f8d8
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1453,6 +1453,7 @@ struct snd_emu10k1;
struct snd_emu10k1_voice {
	unsigned char number;
	unsigned char use;
	unsigned char dirty;
	void (*interrupt)(struct snd_emu10k1 *emu, struct snd_emu10k1_voice *pvoice);

	struct snd_emu10k1_pcm *epcm;
+1 −0
Original line number Diff line number Diff line
@@ -437,6 +437,7 @@ start_voice(struct snd_emux_voice *vp)

		REGLIST_END);

	hw->voices[ch].dirty = 1;
	return 0;
}

+2 −11
Original line number Diff line number Diff line
@@ -80,17 +80,6 @@ static int snd_emu10k1_pcm_channel_alloc(struct snd_emu10k1_pcm * epcm, int voic
{
	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++) {
		if (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,
				      snd_emu10k1_compose_send_routing(send_routing));
	}

	emu->voices[voice].dirty = 1;

	spin_unlock_irqrestore(&emu->reg_lock, flags);
}

+3 −2
Original line number Diff line number Diff line
@@ -372,11 +372,12 @@ static void snd_emu10k1_proc_voices_read(struct snd_info_entry *entry,
	};
	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++) {
		voice = &emu->voices[idx];
		snd_iprintf(buffer, "%i\t%s\n",
		snd_iprintf(buffer, "%i\t%u\t%s\n",
			idx,
			voice->dirty,
			types[voice->use]);
	}
}
+3 −2
Original line number Diff line number Diff line
@@ -87,9 +87,10 @@ static int voice_alloc(struct snd_emu10k1 *emu, int type, int number,
static void voice_free(struct snd_emu10k1 *emu,
		       struct snd_emu10k1_voice *pvoice)
{
	if (pvoice->dirty)
		snd_emu10k1_voice_init(emu, pvoice->number);
	pvoice->interrupt = NULL;
	pvoice->use = 0;
	pvoice->use = pvoice->dirty = 0;
	pvoice->epcm = NULL;
}