>No, NO...
>
>Never do this mistake, you cannot use mmap_begin result to know how many
>frames are available: it simply does not work with non HW PCM.
>
>You *have* to use snd_pcm_avail_update() for that.
I was simplifying my loop for pedagogical purposes. Of course I use
snd_pcm_avail_update() initially.
>I rewrite your loop:
>
> avail = snd_pcm_avail_update(pcm);
> while (avail > 0) {
> frames = min(avail, block_size);
> snd_pcm_mmap_begin(pcm, areas, &offset, &frames);
> process(frames);
> snd_pcm_mmap_commit(pcm, offset, frames);
> avail -= frames;
> }
>
>As you see you don't need to reduce frames after mmap_begin.
NO!!! the value returned by snd_pcm_mmap_begin() may exceed the number
we are allowed to process in one block (no malloc-activity is allowed
during process(), so all the buffers have to be correctly sized
already). ardour had been suffering from lots of random segfaults
because i wrote a loop exactly like the one you have above.
the question is: do we call snd_pcm_mmap_commit() as soon as some of
the frames are handled, or after everything is done? i felt it
preferable to update the driver's view of world ASAP.
--p
_______________________________________________
Alsa-devel mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-devel