diff options
author | Alan Young <consult.awy@gmail.com> | 2022-12-30 16:48:14 +0000 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2022-12-30 20:12:42 +0100 |
commit | 2e82060ebcd68f5ea1fe3dccc5a6518008132a54 (patch) | |
tree | 750a3af3ac33bd5a1ac3c2e6210bc54c2adf465a | |
parent | 9f2c68cef716aa45942b502a42d94b84289f23bc (diff) | |
download | alsa-lib-2e82060ebcd68f5ea1fe3dccc5a6518008132a54.tar.gz |
pcm: rate: fix last_commit_ptr boundary wrapping
Wrap last_commit_ptr using boundary. Was just wrapped to 0, which is
correct only if the buffer size, and hence the boundary, is an integer
multiple of the period size.
Fixes: 467d69c5bc1 ("Fix CPU hog with combination of rate plugin")
Fixes: 29041c52207 ("fix infinite draining of the rate plugin in SND_PCM_NONBLOCK mode")
Link: https://lore.kernel.org/alsa-devel/20221230164814.901457-1-consult.awy@gmail.com/
Signed-off-by: Alan Young <consult.awy@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
-rw-r--r-- | src/pcm/pcm_rate.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/src/pcm/pcm_rate.c b/src/pcm/pcm_rate.c index e5d8eddd..c8076859 100644 --- a/src/pcm/pcm_rate.c +++ b/src/pcm/pcm_rate.c @@ -1018,7 +1018,7 @@ static int snd_pcm_rate_sync_playback_area(snd_pcm_t *pcm, snd_pcm_uframes_t app slave_size -= rate->gen.slave->period_size; rate->last_commit_ptr += pcm->period_size; if (rate->last_commit_ptr >= pcm->boundary) - rate->last_commit_ptr = 0; + rate->last_commit_ptr -= pcm->boundary; } return 0; } @@ -1163,7 +1163,7 @@ static int snd_pcm_rate_drain(snd_pcm_t *pcm) if (commit_err == 1) { rate->last_commit_ptr += psize; if (rate->last_commit_ptr >= pcm->boundary) - rate->last_commit_ptr = 0; + rate->last_commit_ptr -= pcm->boundary; } else if (commit_err == 0) { if (pcm->mode & SND_PCM_NONBLOCK) { commit_err = -EAGAIN; |