]> git.alsa-project.org Git - alsa-utils.git/commitdiff
alsaloop: Improve xrun_sync - fill missing playback samples
authorJaroslav Kysela <perex@perex.cz>
Mon, 20 Feb 2012 15:41:19 +0000 (16:41 +0100)
committerJaroslav Kysela <perex@perex.cz>
Mon, 20 Feb 2012 15:41:19 +0000 (16:41 +0100)
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
alsaloop/pcmjob.c

index bfac2d3878618e1f1ab40b2f310ae76d566186bf..c9b120fd561398903405f367458be5c33051337b 100644 (file)
@@ -949,6 +949,23 @@ static int xrun_sync(struct loopback *loop)
                        logit(LOG_CRIT, "%s start failed: %s\n", play->id, snd_strerror(err));
                        return err;
                }
+       } else if (delay1 < fill) {
+               diff = (fill - delay1) / play->pitch;
+               while (diff > 0) {
+                       delay1 = play->buf_size - play->buf_pos;
+                       if (verbose > 6)
+                               snd_output_printf(loop->output,
+                                       "sync: playback short, silence filling %li / buf_count=%li\n", (long)delay1, play->buf_count);
+                       if (delay1 > diff)
+                               delay1 = diff;
+                       if ((err = snd_pcm_format_set_silence(play->format, play->buf + play->buf_pos * play->channels, delay1)) < 0)
+                               return err;
+                       play->buf_pos += delay1;
+                       play->buf_pos %= play->buf_size;
+                       play->buf_count += delay1;
+                       diff -= delay1;
+               }
+               writeit(play);
        }
        if (verbose > 5) {
                snd_output_printf(loop->output, "%s: xrun sync ok\n", loop->id);