]> git.alsa-project.org Git - alsa-lib.git/commitdiff
pcm: meter / s16 - add protection for the maximum copied frames
authorJaroslav Kysela <perex@perex.cz>
Tue, 13 Oct 2020 17:28:29 +0000 (19:28 +0200)
committerJaroslav Kysela <perex@perex.cz>
Tue, 13 Oct 2020 17:31:49 +0000 (19:31 +0200)
The rewind or forward may cause the stream pointer change. Although
this patch does not fix the real meter update issue, it breaks
the possible big loops when the stream pointers are desynced with
the meters. It does not make sense to copy more samples than the
pcm buffer contains.

Link: https://lore.kernel.org/alsa-devel/f56d6a67-014a-e562-c253-830c0ec03717@ivitera.com/
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
src/pcm/pcm_meter.c

index 20b41876d86806c32ac728ad28cc3be1a2964dd2..2dcf8e45b4d00643aab05cf492874db7642ff8ba 100644 (file)
@@ -79,6 +79,8 @@ static void snd_pcm_meter_add_frames(snd_pcm_t *pcm,
                                     snd_pcm_uframes_t frames)
 {
        snd_pcm_meter_t *meter = pcm->private_data;
+       if (frames > pcm->buffer_size)
+               frames = pcm->buffer_size;
        while (frames > 0) {
                snd_pcm_uframes_t n = frames;
                snd_pcm_uframes_t dst_offset = ptr % meter->buf_size;
@@ -1100,6 +1102,8 @@ static void s16_update(snd_pcm_scope_t *scope)
        size = meter->now - s16->old;
        if (size < 0)
                size += spcm->boundary;
+       if (size > (snd_pcm_sframes_t)s16->pcm->buffer_size)
+               size = s16->pcm->buffer_size;
        offset = s16->old % meter->buf_size;
        while (size > 0) {
                snd_pcm_uframes_t frames = size;