Practically, for mmap'able devices in addition to waiting, _readi()
seems to be doing this inside a loop:
snd_pcm_mmap_begin(pcm, &pcm_areas, &pcm_offset, &frames);
snd_pcm_areas_copy(areas, offset,
pcm_areas, pcm_offset,
pcm->channels,
frames, pcm->format);
result = snd_pcm_mmap_commit(pcm, pcm_offset, frames);
(follow the pcm_mmap.c:snd_pcm_mmap_readi() called through vtable)