I was going through Paul Davis's excellent tutorial on the
ALSA API:
http://www.equalarea.com/paul/alsa-audio.html#interruptex
I've set alsa to wake me up every N frames. However, when I
awake, I find that I often have fewer than N frames
available:
int err;
uint32_t N = 2048, frames_to_deliver;
assert( 0 == ((N-1)&N) ); /* power of 2 */
/*...*/
snd_pcm_sw_params_set_avail_min (playback_handle, sw_params, N)
/* ... */
while(1) {
err = snd_pcm_wait(playback_handle, 1000);
assert(err >= 0); /* OK */
frames_to_deliver = snd_pcm_avail_update(playback_handle);
assert(frames_to_deliver >= 0); /* OK */
/* this fails about every other cycle: */
assert(frames_to_deliver >= N);
}
E.g. with N = 2048, I'll typically get a stream that looks
like 1996, 2048, 2048, 1990, 2048, 1999, 2048...
Any ideas?
-gabriel