X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=alsa_write.c;h=9d99c8e91af6c4c78e402f9efde4ce00e40cb785;hp=53c973844f6708604a5a58dbadf48a7abbe4329c;hb=f32d8b2bdb3760fcb441d87d77565807b6848c47;hpb=8c5c975d5e8f209919283373793c2751a719699b diff --git a/alsa_write.c b/alsa_write.c index 53c97384..9d99c8e9 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -12,9 +12,11 @@ * based on the vplay program by Michael Beck. */ +#include #include #include #include +#include #include "para.h" #include "fd.h" @@ -180,6 +182,23 @@ static int alsa_write_pre_select(struct sched *s, struct writer_node *wn) return 1; } +static void xrun(snd_pcm_t *handle) +{ + snd_pcm_status_t *status; + int ret; + struct timeval tv, diff; + + snd_pcm_status_alloca(&status); + ret = snd_pcm_status(handle, status); + if (ret < 0) + return; + if (snd_pcm_status_get_state(status) != SND_PCM_STATE_XRUN) + return; + snd_pcm_status_get_trigger_tstamp(status, &tv); + tv_diff(now, &tv, &diff); + PARA_WARNING_LOG("underrun: %lums\n", tv2ms(&diff)); +} + static int alsa_write_post_select(__a_unused struct sched *s, struct writer_node *wn) { @@ -212,11 +231,12 @@ static int alsa_write_post_select(__a_unused struct sched *s, wn->written += ret * pad->bytes_per_frame; return 1; } - PARA_WARNING_LOG("%s\n", snd_strerror(-ret)); if (ret == -EPIPE) { + xrun(pad->handle); snd_pcm_prepare(pad->handle); return 0; } + PARA_WARNING_LOG("%s\n", snd_strerror(-ret)); if (ret == -EAGAIN) return 0; return -E_ALSA_WRITE;