[alsa-devel] Master Plan on rewinding
Alexander E. Patrakov
patrakov at gmail.com
Sun Sep 14 14:07:23 CEST 2014
14.09.2014 17:37, Raymond Yau wrote:
>
> >
> >
> >> === On the rewind safeguard ===
> >
> >
> > Result 1: it has been decided that the return value of
> snd_pcm_rewindable() is not changed, and the safeguard is returned by a
> separate function.
>
> It is unlikely to return any value which is safe, it is the
> responsiability of the application to decide how much can be rewind
You are placing a responsibility on an application without giving it any
means to make an informed decision. E.g. 4 ms is OK on snd-hda-intel,
but definitely not OK on ymfpci even on infinitely fast CPU (because of
the fixed 5 ms interrupt interval). The whole question here is: how is
an application supposed to know that?
>
> If pulseaudio assume 20ms process time is require to process two seconds
> of audio and sleep for 1980ms, it should not assume cpu have infinite power
You are right. The safeguard interval is a sum of the CPU-independent
but card-specific part (which is what is being talked about) and a
CPU-specific part (which the application indeed should know).
>
> what is the purpose of the timestamp ?
>
> Can the timestamp use to predict when will next period update occur if
> the timestamp is obtained at previous period update ?
See http://0pointer.de/blog/projects/pulse-glitch-free.html
>
> Why snd_pcm_rewind cannot return error when application just set stop
> threshold to buffer size and rewind more than the stop threshold ?
I think it does. The problem (due to which we need a safeguard) is that
the card-specific minimum number of not-really-rewindable samples
exists. E.g., for ymfpci, that would be 5 ms.
>
> :This would require documentation changes for snd_pcm_rewindable(),
> though, as it officially no longer returns "safe count of frames which
> can be rewinded". I have difficulty designing a better wording what the
> function actually means now.
>
> The word "safe" should be removed
That's insufficient. The returned value is valid only in the ring-buffer
model for a card that fetches samples absolutely uniformly one at a
time, i.e. without any batching, updates the pointer at every
played-back sample, and doesn't have any "don't overwrite what I am
DMA-ing or I will kill you with IRQs" quirk. I.e., even with the
infinitely fast CPU, an attempt to rewind as much as that function
returns (and then overwrite) will yield a glitch (that may or may not be
detected as xrun even if xrun detection is enabled).
--
Alexander E. Patrakov
More information about the Alsa-devel
mailing list