]> git.alsa-project.org Git - alsa-plugins.git/commitdiff
pulse: pcm - handle reading pulse stream hole
authorIgor V. Kovalenko <igor.v.kovalenko@gmail.com>
Mon, 28 Dec 2020 10:27:06 +0000 (13:27 +0300)
committerJaroslav Kysela <perex@perex.cz>
Mon, 28 Dec 2020 19:35:19 +0000 (20:35 +0100)
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 <igor.v.kovalenko@gmail.com>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
pulse/pcm_pulse.c

index 869c9b674c6b8d51fcc2d26eedc23612bb0aefde..a201bf95aa28fa79567d8b4bafd6f79fab17bd8c 100644 (file)
@@ -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);