Commit 6d8d56db authored by Jaroslav Kysela's avatar Jaroslav Kysela Committed by Takashi Iwai

ALSA: pcm: playback silence - move silence variable updates to separate function

The code tracking the added samples in thresholded mode and the code
tracking the just played samples in top-up mode are semantically
identical, so factor it out to a common function to enhance readability.
Co-developed-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Signed-off-by: default avatarOswald Buddenhagen <oswald.buddenhagen@gmx.de>
Signed-off-by: default avatarJaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230505155244.2312199-5-oswald.buddenhagen@gmx.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 190cb66a
......@@ -33,6 +33,25 @@
static int fill_silence_frames(struct snd_pcm_substream *substream,
snd_pcm_uframes_t off, snd_pcm_uframes_t frames);
static inline void update_silence_vars(struct snd_pcm_runtime *runtime,
snd_pcm_uframes_t ptr,
snd_pcm_uframes_t new_ptr)
{
snd_pcm_sframes_t delta;
delta = new_ptr - ptr;
if (delta == 0)
return;
if (delta < 0)
delta += runtime->boundary;
if ((snd_pcm_uframes_t)delta < runtime->silence_filled)
runtime->silence_filled -= delta;
else
runtime->silence_filled = 0;
runtime->silence_start = new_ptr;
}
/*
* fill ring buffer with silence
* runtime->silence_start: starting pointer to silence area
......@@ -49,18 +68,9 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram
int err;
if (runtime->silence_size < runtime->boundary) {
snd_pcm_sframes_t noise_dist, n;
snd_pcm_sframes_t noise_dist;
snd_pcm_uframes_t appl_ptr = READ_ONCE(runtime->control->appl_ptr);
if (runtime->silence_start != appl_ptr) {
n = appl_ptr - runtime->silence_start;
if (n < 0)
n += runtime->boundary;
if ((snd_pcm_uframes_t)n < runtime->silence_filled)
runtime->silence_filled -= n;
else
runtime->silence_filled = 0;
runtime->silence_start = appl_ptr;
}
update_silence_vars(runtime, runtime->silence_start, appl_ptr);
/* initialization outside pointer updates */
if (new_hw_ptr == ULONG_MAX)
new_hw_ptr = runtime->status->hw_ptr;
......@@ -87,15 +97,7 @@ void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram
runtime->silence_filled = avail > 0 ? avail : 0;
runtime->silence_start = runtime->status->hw_ptr;
} else {
ofs = runtime->status->hw_ptr;
frames = new_hw_ptr - ofs;
if ((snd_pcm_sframes_t)frames < 0)
frames += runtime->boundary;
runtime->silence_filled -= frames;
if ((snd_pcm_sframes_t)runtime->silence_filled < 0) {
runtime->silence_filled = 0;
}
runtime->silence_start = new_hw_ptr;
update_silence_vars(runtime, runtime->status->hw_ptr, new_hw_ptr);
}
frames = runtime->buffer_size - runtime->silence_filled;
}
......
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