Fixed
- Round-trip latency was one buffer period higher than it needed to be
(#21).pw_filter_connect()
withoutPW_FILTER_FLAG_RT_PROCESSsets bothnode.loop.class=mainand
node.async=true. The driver needs the first, which keeps the graph
schedulingprocess()on the Wine-bridged loop so the host's COM
bufferSwitchruns on a thread that has a TEB, but it was also paying for
the second, which makes every link to the driver carry an extra graph
quantum. The driver now clearsnode.asyncright after connecting, while no
link exists yet, because PipeWire latches a link's async mode when the link
is created. Measured round trip inasio_loopbackdrops from 2.00 to 1.00
buffer periods at every size and rate, 42.7 ms to 21.3 ms at the shipped
1024 / 48000 default, and the analyzer now asserts exactly one buffer period
so a regression fails the suite.follow_device_clockkeeps asynchronous
scheduling on purpose, so a device-driven quantum cannot stall the graph.
Connecting withPW_FILTER_FLAG_RT_PROCESSinstead, as proposed in the
issue, also dropsnode.loop.class=main, which movesprocess()onto a
PipeWire pool data-loop thread with no Wine TEB and segfaults in ntdll
during teardown.
Install
Prebuilt for Arch Linux / CachyOS (x86_64). The exact build toolchain (Wine, glibc, PipeWire, MinGW) is recorded in BUILD-INFO.txt inside the tarball.
- User-local:
tar -xzf pipeasio-v1.4.3-archlinux-x86_64.tar.gz -C "$HOME/.local", then runpipeasio-register. - Proton / Faugus: extract to
$HOME/.localand setWINEDLLPATH=$HOME/.local/lib/wine.
Compatibility
A Wine builtin DLL is coupled to the Wine version and glibc it was built against. A different Wine or an older glibc may fail to load (regsvr32 c0000135). In that case build from source (README) or use the AUR package. Source tarballs are attached automatically below.