ALSA: pcm: playback silence - move silence variable updates to separate function
authorJaroslav Kysela <perex@perex.cz>
Fri, 5 May 2023 15:52:42 +0000 (17:52 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 5 May 2023 16:23:52 +0000 (18:23 +0200)
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: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Signed-off-by: Oswald Buddenhagen <oswald.buddenhagen@gmx.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Link: https://lore.kernel.org/r/20230505155244.2312199-5-oswald.buddenhagen@gmx.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/core/pcm_lib.c

index a183813..670572c 100644 (file)
 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;
        }