From: Igor V. Kovalenko Date: Mon, 28 Dec 2020 10:27:06 +0000 (+0300) Subject: pulse: pcm - handle reading pulse stream hole X-Git-Tag: v1.2.5~8 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=ffc8b900792b77764213bac6816ba60f2c8d8025;p=alsa-plugins.git pulse: pcm - handle reading pulse stream hole If there is a hole in pulse stream, handle it by generating silence. BugLink: https://github.com/alsa-project/alsa-plugins/pull/17 Signed-off-by: Igor V. Kovalenko Signed-off-by: Jaroslav Kysela --- diff --git a/pulse/pcm_pulse.c b/pulse/pcm_pulse.c index 869c9b6..a201bf9 100644 --- a/pulse/pcm_pulse.c +++ b/pulse/pcm_pulse.c @@ -522,16 +522,22 @@ static snd_pcm_sframes_t pulse_read(snd_pcm_ioplug_t * io, if (frag_length == 0) break; - src_buf = (char *) src_buf + pcm->offset; - frag_length -= pcm->offset; - - if (frag_length > remain_size) { - pcm->offset += remain_size; - frag_length = remain_size; - } else - pcm->offset = 0; - - memcpy(dst_buf, src_buf, frag_length); + if (src_buf) { + src_buf = (char *) src_buf + pcm->offset; + frag_length -= pcm->offset; + + if (frag_length > remain_size) { + pcm->offset += remain_size; + frag_length = remain_size; + } else + pcm->offset = 0; + + memcpy(dst_buf, src_buf, frag_length); + } else { + /* If there is a hole in the stream, generate silence. */ + int sample_size = snd_pcm_format_physical_width(io->format) / 8; + snd_pcm_format_set_silence(io->format, dst_buf, frag_length / sample_size); + } if (pcm->offset == 0) pa_stream_drop(pcm->stream);