[pulseaudio-discuss] 61ms delay in pa_simple_write()
Wu Fengguang
fengguang.wu at intel.com
Thu Sep 23 22:17:29 PDT 2010
Greetings,
We are debugging a new QEMU USB audio model that works fine with alsa
backend but drops samples from time to time with pulseaudio backend.
Traces show that the pa_simple_write() call normally does its job
quickly, but sometimes takes ~60ms to return (the last write=XXms
field):
L1 qpa_thread_out rpos = 1499, pa->decr = 1155, decr = 1155, pa->live = 0, write=0ms
L2 qpa_thread_out rpos = 605, pa->decr = 1154, decr = 1154, pa->live = 0, write=0ms
L3 qpa_thread_out rpos = 1670, pa->decr = 1065, decr = 1065, pa->live = 0, write=1ms
L4 qpa_thread_out rpos = 736, pa->decr = 1114, decr = 1114, pa->live = 0, write=0ms
L5 qpa_thread_out rpos = 1850, pa->decr = 1114, decr = 1114, pa->live = 0, write=0ms
L6 qpa_thread_out rpos = 957, pa->decr = 1155, decr = 1155, pa->live = 0, write=0ms
L7 qpa_thread_out rpos = 15, pa->decr = 1106, decr = 1106, pa->live = 0, write=0ms
==> L8 qpa_thread_out rpos = 1127, pa->decr = 1112, decr = 1112, pa->live = 936, write=61ms
==> L9 qpa_thread_out rpos = 1127, pa->decr = 2048, decr = 2048, pa->live = 0, write=0ms
The 61ms delay in L8 overruns the ring buffer inside qemu (note the
decr=2048 in L9; I ran qemu with QEMU_PA_SAMPLES=2048).
Skimming through the pulseaudio code, my wild guess is there are two
possible source of delays (I excluded kernel problems since ALSA works
fine):
1) memory allocation
2) pulseaudio internal lock
3) blockable syscall
I'm mainly suspecting (1). Basically any latency sensible application
should do pre-allocation and to _absolutely avoid_ memory allocation
during audio streaming. However I do see the pa_simple_write() calls
into pa_stream_write() which in turn _might_ call malloc() in the end.
I'm not sure if the pa_memblock_new[_user]() API takes care to
preallocate _enough_ memory before playback. Can anyone kindly confirm
that?
Thanks,
Fengguang
More information about the pulseaudio-discuss
mailing list