From f32d8b2bdb3760fcb441d87d77565807b6848c47 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Mon, 30 Nov 2009 23:40:05 +0100 Subject: [PATCH] alsa_write: Print duration of buffer undderuns. Idea taken from aplay. --- alsa_write.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/alsa_write.c b/alsa_write.c index 67ab59ad..9d99c8e9 100644 --- a/alsa_write.c +++ b/alsa_write.c @@ -16,6 +16,7 @@ #include #include #include +#include #include "para.h" #include "fd.h" @@ -181,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) { @@ -213,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; -- 2.39.5