summaryrefslogtreecommitdiff
path: root/sound/pci/emu10k1
diff options
context:
space:
mode:
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>2023-05-18 16:09:44 +0200
committerTakashi Iwai <tiwai@suse.de>2023-05-18 16:55:56 +0200
commit82a9fa6e9e3c769f7edc62810c9718997cada53d (patch)
treec6a70fb3b045f541c8419f9b6401a9a285a130f8 /sound/pci/emu10k1
parentb840f8d8fcb3df9e65bb6782a9072897b6ea117d (diff)
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: Oswald Buddenhagen <oswald.buddenhagen@gmx.de> Link: https://lore.kernel.org/r/20230518140947.3725394-5-oswald.buddenhagen@gmx.de Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/pci/emu10k1')
-rw-r--r--sound/pci/emu10k1/emu10k1_callback.c1
-rw-r--r--sound/pci/emu10k1/emupcm.c13
-rw-r--r--sound/pci/emu10k1/emuproc.c5
-rw-r--r--sound/pci/emu10k1/voice.c5
4 files changed, 9 insertions, 15 deletions
diff --git a/sound/pci/emu10k1/emu10k1_callback.c b/sound/pci/emu10k1/emu10k1_callback.c
index 6686ca8ce5fc..6d483bda46df 100644
--- a/sound/pci/emu10k1/emu10k1_callback.c
+++ b/sound/pci/emu10k1/emu10k1_callback.c
@@ -437,6 +437,7 @@ start_voice(struct snd_emux_voice *vp)
REGLIST_END);
+ hw->voices[ch].dirty = 1;
return 0;
}
diff --git a/sound/pci/emu10k1/emupcm.c b/sound/pci/emu10k1/emupcm.c
index 216b6cde326f..324db1141479 100644
--- a/sound/pci/emu10k1/emupcm.c
+++ b/sound/pci/emu10k1/emupcm.c
@@ -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);
}
diff --git a/sound/pci/emu10k1/emuproc.c b/sound/pci/emu10k1/emuproc.c
index c423a56ebf9e..abcec8a01760 100644
--- a/sound/pci/emu10k1/emuproc.c
+++ b/sound/pci/emu10k1/emuproc.c
@@ -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]);
}
}
diff --git a/sound/pci/emu10k1/voice.c b/sound/pci/emu10k1/voice.c
index ac89d09ed9bc..25e78fc188bf 100644
--- a/sound/pci/emu10k1/voice.c
+++ b/sound/pci/emu10k1/voice.c
@@ -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)
{
- snd_emu10k1_voice_init(emu, pvoice->number);
+ if (pvoice->dirty)
+ snd_emu10k1_voice_init(emu, pvoice->number);
pvoice->interrupt = NULL;
- pvoice->use = 0;
+ pvoice->use = pvoice->dirty = 0;
pvoice->epcm = NULL;
}