Answering to my own mail...

> Looking at jackd code, one possibility is that the we are only getting an
> EPIPE from snd_pcm_avail_update(), but the stream is still in RUNNING 
> state. At least in alsa-lib/src/pcm/pcm_hw.c:snd_pcm_hw_avail_update()
> we have a test for:
[...]
> if (avail > pcm->buffer_size)
>       return -EPIPE;

This seems to be the case. It does look very unlikely that an xrun 
could go unnoticed. It would take quite a latency spike to 
allow hw_ptr to wrap around pcm->boundary. :)

I guess more probable explanation is something like:

loop:
    start = timer()
    poll()
    <interrupt -> hw_ptr += period_size>
    snd_pcm_avail_update()
    snd_pcm_mmap_begin()
    ...
    snd_pcm_mmap_commit()
    <interrupt -> hw_ptr += period_size>
    stop = timer()

If the interrupts occur at the right time, 'stop-start' 
might exceed 'period_time * period_count' even though 
snd_pcm_avail_update() never returns EPIPE. This is
probably what I saw when debugging jackd (and is, of
course, perfectly legal).

-- 
 http://www.eca.cx
 Audio software for Linux!


_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel

Reply via email to