ALSA: pcm_lib: avoid timing jitter in snd_pcm_read/write()
authorDavid Dillow <dave@thedillows.org>
Sat, 26 Jun 2010 22:13:20 +0000 (00:13 +0200)
committerJaroslav Kysela <perex@perex.cz>
Mon, 28 Jun 2010 07:42:09 +0000 (09:42 +0200)
commit5daeba34d2aab669aea07abee13d53cd116578fb
tree4213fce45c60b6c16160fa9c777aa923ef562172
parent8fc6d4186e0a60b3755a6b88bf67a3ac3214dcc3
ALSA: pcm_lib: avoid timing jitter in snd_pcm_read/write()

When using poll() to wait for the next period -- or avail_min samples --
one gets a consistent delay for each system call that is usually just a
little short of the selected period time. However, When using
snd_pcm_read/write(), one gets a jittery delay that alternates between
less than a millisecond and approximately two period times. This is
caused by snd_pcm_lib_{read,write}1() transferring any available samples
to the user's buffer and adjusting the application pointer prior to
sleeping to the end of the current period. When the next period
interrupt occurs, there is then less than avail_min samples remaining to
be transferred in the period, so we end up sleeping until a second
period occurs.

This is solved by using runtime->twake as the number of samples needed
for a wakeup in addition to selecting the proper wait queue to wake in
snd_pcm_update_state(). This requires twake to be non-zero when used
by snd_pcm_lib_{read,write}1() even if avail_min is zero.

Signed-off-by: Dave Dillow <dave@thedillows.org>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
include/sound/pcm.h
sound/core/pcm_lib.c