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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxx>
---
 sound/core/pcm_lib.c | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)

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;
 	}
-- 
2.39.2




[Index of Archives]     [ALSA User]     [Linux Audio Users]     [Pulse Audio]     [Kernel Archive]     [Asterisk PBX]     [Photo Sharing]     [Linux Sound]     [Video 4 Linux]     [Gimp]     [Yosemite News]

  Powered by Linux