From 4586fd1a209a1189c7b995a128a9de8189f7ab83 Mon Sep 17 00:00:00 2001 From: "Igor V. Kovalenko" Date: Mon, 28 Dec 2020 13:27:06 +0300 Subject: [PATCH] pulse: handle reading pulse stream hole If there is a hole in pulse stream, handle it by generating silence. --- pulse/pcm_pulse.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) 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);