]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: rate: fix last_commit_ptr boundary wrapping
authorAlan Young <consult.awy@gmail.com>
Fri, 30 Dec 2022 16:48:14 +0000 (16:48 +0000)
committerJaroslav Kysela <perex@perex.cz>
Fri, 30 Dec 2022 19:12:42 +0000 (20:12 +0100)
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>
src/pcm/pcm_rate.c

index e5d8eddd13f9ed964c3ad1e7578275c684b26ffa..c807685909cb05dc642d66d1f8376c21a0640094 100644 (file)
@@ -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;