Releases: M0n7y5/pipeasio
PipeASIO 1.0.0
First stable PipeASIO release. An ASIO driver for Wine that talks to PipeWire directly through libpipewire-0.3 — no libjack.so.0 runtime dependency — so it loads inside the Steam Runtime container that Proton uses.
Verified with FL Studio under Proton-CachyOS and VB-Audio ASIO Test. A digital loopback analyzer confirms the driver is bit-exact end-to-end with zero dropped buffers and a measured round-trip latency exactly matching GetLatencies(), across buffer sizes 128–1024 at 44.1/48/96 kHz. Other ASIO hosts (Reaper, Ableton Live) should work but are not yet confirmed — reports welcome on the issue tracker.
Changes since 1.0.0-rc1:
Added
- CI on GitHub Actions: every push and pull request builds the driver and panel and runs the Linux-native test suite on Arch Linux.
- The integration probe now verifies that the sample position advances during the run and that the timecode
Futureselectors are denied. tests/asio_loopback: a digital loopback analyzer (RTL-Utility/RMAA equivalent for a converter-less driver). It plays a per-channel frame counter through the driver and a PipeWire null-sink loopback and fails on any non-bit-exact sample, dropped or duplicated buffer, swapped channel, or measured round-trip latency disagreeing withGetLatencies();SWEEP=1covers buffer sizes 128–1024 at 44.1/48/96 kHz with in-process buffer re-negotiation.
Changed
- Relicensed the entire project under GPL-3.0-or-later, replacing the previous split of LGPL-2.1-or-later (driver) and GPL-2.0-or-later (settings panel). The separate
COPYING.LIB/COPYING.GUIfiles are now a singleCOPYING(the GPLv3 text). The original WineASIO authors' copyright notices are retained; the relicensing uses the "or later" upgrade path (and LGPL 2.1 section 3) that those licenses already grant.
Removed
- Fake ASIO timecode support. The driver no longer answers
kAsioCanTimeCode/kAsioEnableTimeCodeReadaffirmatively or fillsASIOTime.timeCodewith fabricated values — PipeWire has no transport timeline to source timecode from. Hosts fall back to sample-position sync, which is accurate.
Fixed
GetSamplePositionreturned only the low 32 bits of the sample counter, wrapping to zero after about 25 hours at 48 kHz; it now reports the full 64-bit position.regsvr32 /unow actually removes the driver's registry keys. Unregistration deleted keys through a handle opened withoutDELETEaccess, so every delete failed and the CLSID andSoftware\ASIO\PipeASIOentries were left behind; the recursive delete is nowRegDeleteTree, and unregistering an already unregistered driver succeeds.- Driver registration and unregistration now report real failures: raw win32 error codes were previously returned where COM HRESULTs are expected, so errors like access-denied counted as success.
- The Wine test hosts (
asio_probe,asio_loopback) parse their command line themselves: current Wine's CRT startup deliversargc=0tomain(), so the probe's seconds argument was silently ignored.
Full changelog: v1.0.0-rc1...v1.0.0
See the README for build, install, and Proton/Faugus setup instructions.
PipeASIO 1.0.0-rc1
First PipeASIO release candidate. Forked from WineASIO and reworked to talk to PipeWire directly through libpipewire-0.3, with no libjack.so.0 runtime dependency, so the driver loads inside the Steam Runtime container that Proton uses.
Verified with FL Studio under Proton-CachyOS. Other ASIO hosts (Reaper, Ableton Live) should work but are not yet confirmed.
Added
- Native C++/Qt6 settings panel (
pipeasio-settings) with a Settings tab and a live Monitor tab, replacing the old PyQt GUI. - Monitor tab showing live PipeWire quantum, sample rate, DSP load, xruns, and state, auto-discovering the driver's own PipeWire node.
- DSP load drawn as a rolling history graph instead of a single bar.
- "Follow device clock" option (
follow_device_clock) so output to a Bluetooth sink works, where the sink's clock cannot be slaved to the host. - PipeWire sink and source selection (
output_device/input_device), honored by autoconnect; an empty value follows the PipeWire default. sample_ratesetting:0follows the graph rate, a non-zero value pins it.- Tooltips on every Settings and Monitor field.
- Subnormal float flushing (FTZ/DAZ) on the audio thread to avoid rare CPU stalls and the dropouts they cause.
- ASIO host timestamp derived from the PipeWire graph clock rather than the system tick count.
Changed
- Configuration moved from the Windows registry to a flat INI at
$XDG_CONFIG_HOME/pipeasio/config.ini, re-read while running and written atomically, so saving in the panel applies within about a second with no host restart. - Default channel count is now 2 in / 2 out (was 16 / 16).
- "Follow default" connects to the actual PipeWire default sink and source, not the first device discovered.
- The panel's confirm button is now "Apply": it saves without closing.
- The panel keeps a saved device or sample rate that is currently unavailable, marked "(unavailable)", instead of resetting it on Apply.
- The in-app ASIO control-panel button points you to run
pipeasio-settingson the host. - Removed the obsolete "Autostart server" option.
Fixed
- Crash (use-after-free and heap corruption) when a PipeWire device connects or disconnects while the driver is starting or reconnecting.
- Garbled or out-of-bounds output when following a device clock or when PipeWire clamps the forced quantum.
- Slow or pitched-down playback at buffer sizes other than the backend default.
- Memory leak when the audio backend failed to start, and leaked discovered-port lists on init error paths.
- The settings panel no longer freezes on Monitor refresh;
pw-topandpw-dumprun asynchronously. - The Monitor tab now populates while audio plays.
- Hardened channel-count limits and tightened COM teardown and several error paths.
Full changelog: https://github.com/M0n7y5/pipeasio/blob/v1.0.0-rc1/CHANGELOG.md