Added
- Real-time audio thread setting. The
realtimekey is experimental and
defaults to disabled; enabling it raises the native callback thread or WoW64
pump toSCHED_FIFO15. Because only that one thread is elevated,
multi-threaded hosts under Wine (measured with FL Studio) can see far more
xruns with it on.PIPEASIO_RT_PRIORITY=off|onoverrides the setting. Added
for #4 diagnostics, not as a
fix. - CI now builds and tests against the pinned Steam Runtime 4 SDK and asserts
that its PipeWire version is exactly 1.4.2. - The release workflow checks that every
pw_andspa_symbol imported by
the shipped 64-bit and WoW64 Unix libraries exists in Steam Runtime 4's
PipeWire 1.4.2 library. - Native and WoW64 integration tests now check the scheduling policy of the
callback thread and of an ordinary worker it hands off to, across three legs:
shipped defaults,realtime = 1, andrealtime = 1with
PIPEASIO_RT_PRIORITY=off. Each thread stamps its own Linuxcommfrom
inside a livebufferSwitchand the runner reads/proc/<pid>/task. - Real-time integration legs measure the user-visible per-node
pw-topERR
counter from one long-lived batch stream (tracked by PipeWire node ID). A
positive-control callback stall, armed only after the node is profiled,
proves ERR can move; the clean policy legs stay stall-free and assert the
window delta stays withinPROBE_XRUN_TOLERANCE. - A deterministic interleave test parks a method leaver between its gate check
and its decrement, and releases it only onceCreateBuffers' gate drain is
asleep (a drain-wait handshake, not a timing assumption); the sliced drain
must still complete promptly instead of stalling for the full timeout. - Probe runners scrub ambient
PIPEASIO_*and probe-control environment so a
polluted caller environment cannot change probe behavior; orchestrating
scripts pass their deliberate values through an explicit keep list.
Fixed
- WoW64 configuration now starts from defaults before the Unix call. A missing
Unix library or ABI mismatch can no longer leave the PE driver reading an
uninitialised settings struct. - Concurrent
Stop()calls and overlapping restart now use generation-based
completion instead of a resettable shared event, preventing stale or lost
wakeups acrossStop/Startcycles. - The config watcher context is refcounted and stays attached to the driver
until its thread has exited, and the final teardown joins the thread.
A timed-out join can no longer free state the watcher still reads, and no
watcher thread can outlive the driver object. - A failed
DisposeBuffers(for example a gate drain timeout while a modal
ControlPanelis open) now restoresPreparedand returns an error instead
of reporting success while leaving the backend, callbacks, and buffers
untouched. - WoW64 auto-connect no longer requires the device's port count to equal the
configured channel count; the marshalled endpoint list is a usable prefix,
matching the native path. pipeasio-registernow passes/stowine regsvr32, so registration no
longer blocks on a modal success dialog during unattended runs.- The settings panel's Monitor tab holds the last good sample for one frame
when the node briefly vanishes from apw-topiteration or reports a
transient idle cycle, instead of flashing zeros or "waiting for audio...".
A persistent idle/suspended node now renders its actual I/S state, and the
device rows clear once the node is gone. - Settings panel tooltips now word-wrap to readable lines instead of
rendering as one long single line. - The INI line-length guard in the settings panel now matches the driver's C
loader exactly; a line of exactly 1023 bytes is no longer accepted by the
panel but ignored by the driver. - Gate drains now re-check the admission count in bounded slices instead of
relying solely on the idle event, eliminating a false 10-second timeout when
a leaver's signal was lost. - The probe's concurrent-
Stoptest pre-creates its stop threads parked on a
start event; slow thread creation under Wine+ASan can no longer consume the
blocked callback's budget and produce false failures. - The native and WoW64 links now use the exact PipeWire library selected by
pkg-config. This prevents headers from a custom prefix being combined with
the system PipeWire library. - Wine SDK discovery now derives and validates include directories from the
winebuildprefix. InvalidWINE_INCLUDE_DIRSvalues fail at configure
time, and WoW64 builds also requireunixlib.h. - Configure warns when
winebuildand the selected Wine SDK come from
different prefixes.
Changed
- The WoW64 Unix-call ABI is now version 3. Endpoint and callback delivery is
transactional, and the newrealtimefield shifts later fields without
changing the struct size, so layout tests pin the interior offsets.
Mismatched PE and Unix halves are rejected. - README build instructions now use per-distribution dependencies and cover
Wine SDK layouts outside/usr. - The documented and enforced PipeWire floor is now 1.4.2. Earlier versions
fail during configuration instead of compiling until the first unavailable
API. The previous 1.6 requirement was unnecessary. - Debug logs now report both the PipeWire header and runtime library versions.
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.3.0-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.