]> git.itanic.dy.fi Git - linux-stable/commitdiff
ALSA: aloop: Fix random zeros in capture data when using jiffies timer
authorPattara Teerapong <pteerapong@chromium.org>
Thu, 1 Sep 2022 14:40:36 +0000 (14:40 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 15 Sep 2022 10:39:46 +0000 (12:39 +0200)
commit 3e48940abee88b8dbbeeaf8a07e7b2b6be1271b3 upstream.

In loopback_jiffies_timer_pos_update(), we are getting jiffies twice.
First time for playback, second time for capture. Jiffies can be updated
between these two calls and if the capture jiffies is larger, extra zeros
will be filled in the capture buffer.

Change to get jiffies once and use it for both playback and capture.

Signed-off-by: Pattara Teerapong <pteerapong@chromium.org>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20220901144036.4049060-1-pteerapong@chromium.org
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
sound/drivers/aloop.c

index cc600aa0f6c78df64f143c9ed6f6cfc86766f9ac..fa13df5d4f5c970d47ca14db86fb0eacce2e2005 100644 (file)
@@ -477,17 +477,18 @@ static unsigned int loopback_pos_update(struct loopback_cable *cable)
                        cable->streams[SNDRV_PCM_STREAM_PLAYBACK];
        struct loopback_pcm *dpcm_capt =
                        cable->streams[SNDRV_PCM_STREAM_CAPTURE];
-       unsigned long delta_play = 0, delta_capt = 0;
+       unsigned long delta_play = 0, delta_capt = 0, cur_jiffies;
        unsigned int running, count1, count2;
 
+       cur_jiffies = jiffies;
        running = cable->running ^ cable->pause;
        if (running & (1 << SNDRV_PCM_STREAM_PLAYBACK)) {
-               delta_play = jiffies - dpcm_play->last_jiffies;
+               delta_play = cur_jiffies - dpcm_play->last_jiffies;
                dpcm_play->last_jiffies += delta_play;
        }
 
        if (running & (1 << SNDRV_PCM_STREAM_CAPTURE)) {
-               delta_capt = jiffies - dpcm_capt->last_jiffies;
+               delta_capt = cur_jiffies - dpcm_capt->last_jiffies;
                dpcm_capt->last_jiffies += delta_capt;
        }