Skip to content

PipeASIO v1.2.1

Latest

Choose a tag to compare

@github-actions github-actions released this 02 Jul 16:05
v1.2.1
ad19859

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 build drives 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_FIFO priority (77, below the PipeWire daemon's data loop at 88), and
    on EPERM retries clamped to RLIMIT_RTPRIO. The thread driving the whole
    ASIO bufferSwitch chain now actually runs FIFO.
  • Every audio_open leaked 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 kAsioResetRequest synchronously
    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 synchronous DisposeBuffers/CreateBuffers reset 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 build ULONG is 32-bit but ULONG_MAX is 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 run pipeasio-register.
  • Proton / Faugus: extract to $HOME/.local and set WINEDLLPATH=$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.