Dylan Reid wrote:
This patch addresses two issues related to calling snd_pcm_drain.
If no_period_wakeup is set, then snd_pcm_drain would wait MAX_SCHEDULE_TIMEOUT jiffies, without a wakeup pending this will leave the calling task blocked indefinitely.
no_period_wakeup is used by applications that do _not_ want to use any of ALSA's blocking functions (and thus want to avoid the interrupt overhead) and use their own timers instead. This also applies to snd_pcm_drain.
Is there any actual application that tries to use snd_pcm_drain together with no_period_wakeup?
Also if the stream is running with period wakeups but with a long period, the delay could be seconds. If only a small part of the buffer is being used, this is unnecessary.
Wakeup at period boundaries is part of the ALSA API. (This is all what periods are for.)
Instead wait for the remaining samples to play out, plus one millisecond.
The device's clock and the Linux system clock might have larger differences. The only reliable synchronization source is the period interrupt.
Regards, Clemens