[alsa-devel] maintaining fixed latency between output and input?

Clemens Ladisch clemens at ladisch.de
Fri Sep 26 08:33:19 CEST 2008


Aaron J. Grier wrote:
> what's the most straight-forward way to maintain fixed latency between
> output and input without sitting in loop and continuously checking
> snd_pcm_avail_update() for the output and input descriptors?
>
> I was originally going to use callbacks, but I've recently read that is
> not a good idea.  poll() seems to be the reccomended method.

Yes.

> I'm visualizing something like this:
>
> for(;;)
> {
> 	poll()
>
> 	if (output_is_ready)
> 	{
> 		/* write output buffer */
> 		/* do output-side housekeeping */
> 	}
>
> 	if (input_is_ready)
> 	{
> 		/* read input buffer */
> 		/* do input-side housekeeping */
> 	}
>
> 	/* communicate with other threads */
> }

This is exactly how a full-duplex application should be structured.

To communicate with other threads, you can use a pipe so that you have
a file descriptor that can be used with the poll().

> combining the output and input snd_pcm_t into a single descriptor list
> for poll() seems straight-forward, but can I pass this superset list to
> snd_pcm_poll_descriptors_revents() without it getting confused?

No, snd_pcm_poll_descriptors_revents() looks at the file descriptors of
a single device and returns the ready status of that device.


HTH
Clemens


More information about the Alsa-devel mailing list