Hi Dorinda,
I've started to write down my suggestions and comments. After more than
one page of text, I think that without sample code, the text is not very
understandable. Therefore I will write three mails.
In this mail I describe the problem with the QEMU Pipewire audio
backend. My next mail is a patch for the v7 QEMU pipewire backend with
my suggestions how I would change the code. I can then reply to my own
mail with comments, explaining my changes.
I tested the pipewire audio backend with the QEMU hda device. Audio
playback doesn't work well on my computer. I hear dropouts every few
seconds.
+#define BUFFER_SAMPLES 512
BUFFER_SAMPLES can't be a fixed size. To hear the problem please start
QEMU with qemu-system-x86_64 -device ich9-intel-hda -device
hda-duplex,audiodev=audio0 -audiodev
pipewire,id=audio0,out.frequency=96000,in.frequency=96000 ... . The
pipewire backend tells QEMU to use a buffer size of 512 audio frames.
The buffer can hold data for 512 frames / 96000 frames/s = 5.3ms. With
a timer-period of 10ms there is no way to transport enough frames to the
pipewire buffer.
Just using a larger BUFFER_SAMPLES value also doesn't work. When I start
QEMU with qemu-system-x86_64 -device ich9-intel-hda -device
hda-duplex,audiodev=audio0 -audiodev
pipewire,id=audio0,timer-period=2000 ... the maximum audio frame
throughput increases as when using a larger BUFFER_SAMPLES value. But
the higher maximum throughput makes the dropout issue more audible.
This has to do with how often pipewire calls playback_on_process() and
capture_on_process(). On my system pipewire calls playback_on_process()
and capture_on_process() every 21ms and sometimes the callback is
delayed by 42ms. At a guest audio frame rate of 44100 frames/s the QEMU
hda device drops its buffer if data wasn't read for longer than 23ms on
average. With a timer period of 2ms, the PWVoice buffer fills quicker
and the time to the next pipewire update is longer. This increases the
chance that the hda device drops its buffer. With a timer period of
10ms, the PWVoice buffer fills slower. This is similar to a jitter
buffer, but a good jitter buffer implementation would work better.
My next mail with the sample code will give pipewire a hint to call the
callbacks faster than timer-period and then remove BUFFER_SAMPLES.
With best regards,
Volker