diff mbox series

[5/5] ALSA: pcm: playback silence - move silence variables updates to separate function

Message ID 20230505073813.1219175-6-perex@perex.cz
State New
Headers show
Series rewrite snd_pcm_playback_silence() again | expand

Commit Message

Jaroslav Kysela May 5, 2023, 7:38 a.m. UTC
There is a common code in the threshold and top-up mode tracking
the added (already silenced) samples. Move this code to one place
to enhance the readability.

Signed-off-by: Jaroslav Kysela <perex@perex.cz>
---
 sound/core/pcm_lib.c | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)
diff mbox series

Patch

diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
index 952f0d807124..6b0601fec832 100644
--- a/sound/core/pcm_lib.c
+++ b/sound/core/pcm_lib.c
@@ -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 silence_update(struct snd_pcm_runtime *runtime,
+				  snd_pcm_uframes_t ptr,
+				  snd_pcm_uframes_t new_ptr)
+{
+	snd_pcm_sframes_t n;
+
+	if (ptr == new_ptr)
+		return;
+	n = new_ptr - ptr;
+	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 = 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;
-		}
+		silence_update(runtime, runtime->silence_start, appl_ptr);
 		/* initialization outside pointer updates */
 		if (new_hw_ptr == ULONG_MAX)
 			new_hw_ptr = runtime->status->hw_ptr;
@@ -86,14 +96,7 @@  void snd_pcm_playback_silence(struct snd_pcm_substream *substream, snd_pcm_ufram
 		} else {
 			/* top-up mode (appl_ptr is not required) */
 			/* silence the played area immediately */
-			frames = new_hw_ptr - runtime->status->hw_ptr;
-			if ((snd_pcm_sframes_t)frames < 0)
-				frames += runtime->boundary;
-			if ((snd_pcm_uframes_t)frames < runtime->silence_filled)
-				runtime->silence_filled -= frames;
-			else
-				runtime->silence_filled = 0;
-			runtime->silence_start = new_hw_ptr;
+			silence_update(runtime, runtime->status->hw_ptr, new_hw_ptr);
 		}
 		frames = runtime->buffer_size - runtime->silence_filled;
 	}