ALSA: emu10k1: refactor PCM playback cache filling
authorOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Wed, 17 May 2023 17:42:55 +0000 (19:42 +0200)
committerTakashi Iwai <tiwai@suse.de>
Thu, 18 May 2023 05:31:01 +0000 (07:31 +0200)
Rename snd_emu10k1_playback_invalidate_cache() to the more apt
snd_emu10k1_playback_fill_cache(), and factor out
snd_emu10k1_playback_prepare_voices(), which calls the former for all
channels.

Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Link: https://lore.kernel.org/r/20230517174256.3657060-8-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/emu10k1/emupcm.c

index bbe054b..0639183 100644 (file)
@@ -511,16 +511,12 @@ static int snd_emu10k1_capture_prepare(struct snd_pcm_substream *substream)
        return 0;
 }
 
-static void snd_emu10k1_playback_invalidate_cache(struct snd_emu10k1 *emu,
-                                                 struct snd_emu10k1_voice *evoice,
-                                                 bool w_16, bool stereo)
+static void snd_emu10k1_playback_fill_cache(struct snd_emu10k1 *emu,
+                                           unsigned voice,
+                                           u32 sample, bool stereo)
 {
-       unsigned voice, sample;
        u32 ccr;
 
-       voice = evoice->number;
-       sample = w_16 ? 0 : 0x80808080;
-
        // We assume that the cache is resting at this point (i.e.,
        // CCR_CACHEINVALIDSIZE is very small).
 
@@ -539,6 +535,22 @@ static void snd_emu10k1_playback_invalidate_cache(struct snd_emu10k1 *emu,
        snd_emu10k1_ptr_write(emu, CCR, voice, ccr);
 }
 
+static void snd_emu10k1_playback_prepare_voices(struct snd_emu10k1 *emu,
+                                               struct snd_emu10k1_pcm *epcm,
+                                               bool w_16, bool stereo,
+                                               int channels)
+{
+       u32 sample = w_16 ? 0 : 0x80808080;
+
+       for (int i = 0; i < channels; i++) {
+               unsigned voice = epcm->voices[i]->number;
+               snd_emu10k1_playback_fill_cache(emu, voice, sample, stereo);
+       }
+
+       // It takes a moment until the cache fills complete,
+       // but the unmuting takes long enough for that.
+}
+
 static void snd_emu10k1_playback_commit_volume(struct snd_emu10k1 *emu,
                                               struct snd_emu10k1_voice *evoice,
                                               unsigned int vattn)
@@ -632,7 +644,7 @@ static int snd_emu10k1_playback_trigger(struct snd_pcm_substream *substream,
        spin_lock(&emu->reg_lock);
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
-               snd_emu10k1_playback_invalidate_cache(emu, epcm->voices[0], w_16, stereo);
+               snd_emu10k1_playback_prepare_voices(emu, epcm, w_16, stereo, 1);
                fallthrough;
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
        case SNDRV_PCM_TRIGGER_RESUME:
@@ -774,10 +786,7 @@ static int snd_emu10k1_efx_playback_trigger(struct snd_pcm_substream *substream,
        spin_lock(&emu->reg_lock);
        switch (cmd) {
        case SNDRV_PCM_TRIGGER_START:
-               /* prepare voices */
-               for (i = 0; i < NUM_EFX_PLAYBACK; i++) {        
-                       snd_emu10k1_playback_invalidate_cache(emu, epcm->voices[i], true, false);
-               }
+               snd_emu10k1_playback_prepare_voices(emu, epcm, true, false, NUM_EFX_PLAYBACK);
                fallthrough;
        case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
        case SNDRV_PCM_TRIGGER_RESUME: