diff mbox series

pcm: rate: fix last_commit_ptr boundary wrapping

Message ID 20221230164814.901457-1-consult.awy@gmail.com (mailing list archive)
State New, archived
Headers show
Series pcm: rate: fix last_commit_ptr boundary wrapping | expand

Commit Message

Alan Young Dec. 30, 2022, 4:48 p.m. UTC
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.

Signed-off-by: Alan Young <consult.awy@gmail.com>
Fixes: 467d69c5bc1 ("Fix CPU hog with combination of rate plugin")
Fixes: 29041c52207 ("fix infinite draining of the rate plugin in SND_PCM_NONBLOCK mode")
---
 src/pcm/pcm_rate.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

Comments

Jaroslav Kysela Dec. 30, 2022, 7:17 p.m. UTC | #1
On 30. 12. 22 17:48, Alan Young wrote:
> 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.
> 
> Signed-off-by: Alan Young <consult.awy@gmail.com>
> Fixes: 467d69c5bc1 ("Fix CPU hog with combination of rate plugin")
> Fixes: 29041c52207 ("fix infinite draining of the rate plugin in SND_PCM_NONBLOCK mode")

Thanks for this fix. Applied to the alsa-lib's repository.

					Jaroslav
diff mbox series

Patch

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;