Changed
- The Wine integration probes (
asio_probe, the PipeWire delivery/filter
probes) now run under CTest alongside the Linux-native unit tests, so
ctest --test-dir builddrives the whole suite - including the run that
gates every tagged release.
Fixed
- The real-time audio thread ran at normal scheduling priority (
SCHED_OTHER)
on stock installs, causing xruns under any CPU load. PipeWire's data loop
requests the "configured default" RT priority, which the thread-utils bridge
treated as a no-op - and since that bridge bypasses module-rt/RTKit, nothing
else promoted the thread either. The default request now maps to a real
SCHED_FIFOpriority (77, below the PipeWire daemon's data loop at 88), and
onEPERMretries clamped toRLIMIT_RTPRIO. The thread driving the whole
ASIObufferSwitchchain now actually runs FIFO. - Every
audio_openleaked one zombie thread and its stack: the context's
initial data loop was stopped through the Wine thread-utils bridge installed
after the loop had started, so the original pthread was never joined. The
loop is now stopped and joined through the utils that created it before the
bridge is installed. - Use-after-free when an ASIO host services
kAsioResetRequestsynchronously
on the config-watcher thread and releases the driver from inside the
notification: the watcher's state now lives in a refcounted heap context
owned jointly by the driver and the thread, the only call-out is wrapped in
AddRef/Release, and a same-thread stop orphans the context instead of
waiting on itself. A synchronousDisposeBuffers/CreateBuffersreset no
longer leaves two watchers racing the staged config or leaks the old
thread's handles. - The real-time output copy (and the silence paths) wrote a full host period
into the PipeWire buffer with no capacity check, overrunning the mapping
every cycle when the graph clamps the quantum below the host buffer size
(clock.quantum-limit). Output and silence writes are now clamped to the
dequeued buffer's capacity, mirroring the existing input-side clamp, in both
the 64-bit and WoW64 paths. - The 64-bit sample position wrapped every ~25 hours at 48 kHz again: on the
wine64 ELF buildULONGis 32-bit butULONG_MAXis 2^64-1, so the hi-word
carry in the buffer-switch path never fired. The counters are now stored as
atomic 64-bit values and split into the ASIO hi/lo wire format only at the
edges, which also fixes a torn read of the position that raced the real-time
writer.
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.2.1-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.