Immediate underrun with PulseAudio ALSA plugin when PA and ALSA buffer sizes differ

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



I'm investigating an issue in Firefox's audio code when the PulseAudio ALSA
plugin is in use.

It wasn't clear if PulseAudio ALSA plugin issues should be raised here or on
alsa-devel, so please let me know if this is the wrong forum for this issue.

Firefox requests a particular latency (100ms, 4410 frames at 44.1kHz) via
snd_pcm_set_params.  Inside the plugin (pcm_pulse.c:pulse_hw_params), that
value is used to set up buffer_attr.  When the PA stream is connected in
pcm_pulse.c:pulse_prepare, PA may increase the buffer_attr values, but this
isn't reflected in pcm->buffer_attr or higher layers in ALSA.

Would a possible fix for this be to query pa_stream_get_buffer_attr after
connecting and update pcm->buffer_attr and the higher (ioplug/etc.) layers
that the buffer size has increased?

The problem I'm faced with is that there doesn't appear to be a way to
detect and handle this issue at the ALSA API level, and requesting a too low
latency results in broken audio playback rather than a PCM setup failure or
a larger buffer than requested being used.

I've attached a simple testcase that uses snd_pcm_wait,
snd_pcm_avail_update, and snd_pcm_writei.  Run it with a latency argument
specified in milliseconds on the command line.  For my local machine, 45ms
works and 44ms fails immediately like so:

snd_pcm_wait wakes
snd_pcm_avail_update returns 4410
snd_pcm_writei writes 4410
snd_pcm_wait wakes immediately
snd_pcm_avail_update returns -EPIPE

I'd expect to see one of the following behaviours instead:
1. PCM setup fails due to requesting a too small buffer.
2. Buffer is silently raised during setup and snd_pcm_avail_update requests
   the correct number of frames.
3. PCM wakes from snd_pcm_wait for refill enough times to fill the buffer.

As a side note: this seems to be related to the PA server increasing the
minimum latency over time.  Once the PA server is in this state, restarting
it (in non-daemon mode with debug logging or via pulseaudio -k and
autospawn) causes the problem to disappear.  After restarting the server, I
can run the testcase with 44ms and lower latency successfully.

Thanks,
-mjg
-------------- next part --------------
A non-text attachment was scrubbed...
Name: latency.c
Type: text/x-csrc
Size: 1500 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/pulseaudio-discuss/attachments/20120711/f38c0dcb/attachment.c>


[Index of Archives]     [Linux Audio Users]     [AMD Graphics]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux