summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPattara Teerapong <pteerapong@chromium.org>2022-09-01 14:40:36 +0000
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2022-09-15 12:23:52 +0200
commit35d1ac9863636dcb0042b0cf3dbc14bc23b07757 (patch)
tree3618527c996d4f006ec74bd99a8f334dd45eecad
parent6b0e260ac3cf289e38446552461caa65e6dab275 (diff)
downloadlinux-stable-35d1ac9863636dcb0042b0cf3dbc14bc23b07757.tar.gz
linux-stable-35d1ac9863636dcb0042b0cf3dbc14bc23b07757.tar.bz2
linux-stable-35d1ac9863636dcb0042b0cf3dbc14bc23b07757.zip
ALSA: aloop: Fix random zeros in capture data when using jiffies timer
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>
-rw-r--r--sound/drivers/aloop.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sound/drivers/aloop.c b/sound/drivers/aloop.c
index 8a32a276bd70..1a8a992d8e4a 100644
--- a/sound/drivers/aloop.c
+++ b/sound/drivers/aloop.c
@@ -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;
}