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

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


Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 190cb66a
Loading
Loading
Loading
Loading
+22 −20
Original line number Diff line number Diff line
@@ -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;
	}