mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 04:23:35 +02:00
ALSA: emu10k1: refactor PCM playback cache filling
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>
This commit is contained in:
parent
9e72666b9e
commit
9581128a21
|
|
@ -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:
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user