This is the gotta go fast edition. Yabridge's priorities have always been user experience, compatibility, and then performance. In that order. Now that the first two are in a decent place, it was time to take a closer look at improving performance. This new update considerably reduces the overhead of bridging Windows VST2 and VST3 plugins with yabridge. More importantly, all of these optimizations should make this overhead much more stable and reliable, meaning that you will be less likely to run into xruns. In addition, this update also fixes a few important edge cases issues. Most notably, it is now possible to use ujam and LoopCloud plugins through a new yabridge.toml
option, and crashes can no longer leave JACK and Ardour in unusable states.
If you need any help setting up yabridge or if you just want to keep up to date with new releases and important Wine related announcements, then feel free to join the Discord.
Added
- Added a compatibility option to redirect the Wine plugin host's STDOUT and STDERR output streams directly to a file. Enabling this allows ujam plugins and other plugins made with the Gorilla Engine, such as the LoopCloud plugins, to function correctly. Those plugins crash with a seemingly unrelated error message when their output is redirected to a pipe.
- Added a small warning during initialization when
RLIMIT_RTTIME
is set to some small value. This happens when using PipeWire with rtkit, and it can cause crashes when loading plugins.
Changed
- Added a timed cache for the
IPlugView::canResize()
VST3 function so the result will be remembered during an active resize. This makes resizing VST3 plugin editor windows more responsive. - Added another cache for when the host asks a VST3 plugin whether it supports processing 32-bit or 64-bit floating point audio. Some hosts, like Bitwig Studio, call this function at the start of every processing cycle even though the value won't ever change. Caching this can significantly reduce the overhead of bridging VST3 plugins under those hosts.
- Redesigned the VST3 audio socket handling to be able to reuse the process data objects on both sides. This greatly reduces the overhead of our VST3 bridging by getting rid of all potential memory allocations during audio processing.
- VST2 audio processing also received the same optimizations. In a few places yabridge would still reallocate heap data during every audio processing cycle. We now make sure to always reuse all buffers and heap data used in the audio processing process.
- Considerably optimized parts of yabridge's communication infrastructure by preventing unnecessary memory operations. As it turned out, the underlying binary serialization library used by yabridge would always reinitialize the type-safe unions yabridge uses to differentiate between single and double precision floating point audio buffers in both VST2 and VST3 plugins, undoing all of our efforts at reusing objects and preventing memory allocations in the process. A fix for this issue has also been upstreamed to the library.
- VST3 output audio buffers are now no longer zeroed out at the start of every audio processing cycle. We've been doing this for VST3 plugins since the introduction of VST3 bridging in yabridge 3.0.0, but we never did this for VST2 plugins. Since not doing this has never caused any issues with VST2 plugins, it should also be safe to also skip this for VST3 plugins. This further reduces the overhead of VST3 audio processing.
- Optimized VST3 audio processing for instruments by preallocating small vectors for event and parameter change queues.
- VST2 MIDI event handling also received the same small vector optimization to get rid of any last potential allocations during audio processing.
- This small vector optimization has also been applied across yabridge's entire communication and event handling architecture, meaning that most plugin function calls and callbacks should no longer produce any allocations for both VST2 and VST3 plugins.
- Changed the way mutual recursion in VST3 plugins on the plugin side works to counter any potential GUI related timing issues with VST3 plugins when using multiple instances of a plugin.
- Changed the way realtime scheduling is used on the Wine side to be less aggressive, potentially reducing CPU usage when plugins are idle.
- The deserialization part of yabridge's communication is now slightly faster by skipping some unnecessary checks.
- Log messages about VST3 query interfaces are now only printed when
YABRIDGE_DEBUG_LEVEL
is set to 2 or higher, up from 1.
Fixed
- Fixed a longstanding thread safety issue when hosting a lot of VST2 plugins in a plugin group. This could cause plugins to crash or freeze when initializing a new instance of a VST2 plugin in a plugin group while another VST2 plugin in that same group is currently processing audio.
- Fixed yabridge's Wine processes inheriting file descriptors in some situations. This could cause Ardour and Mixbus to hang when reopening the DAW after a crash. The watchdog timer added in yabridge 3.2.0 addressed this issue partially, but it should now be completely fixed. This may also prevent rare issues where the JACK server would hang after the host crashes.
- Fixed DMG VST3 plugins freezing in REAPER when the plugin resizes itself while the host passes channel context information to the plugin.
- Also fixed DMG VST3 plugins freezing in REAPER when restoring multiple instances of the plugin at once while the FX window is open and the GUI is visible.
- Fixed the PG-8X VST2 plugin freezing in REAPER when loading the plugin.
- Fixed Voxengo VST2 plugins freezing in Renoise when loading a project or when otherwise restoring plugin state.
- Fixed logging traces in the VST2 audio processing functions and the VST3 query interfaces causing allocations even when
YABRIDGE_DEBUG_LEVEL
is not set to 2. - Fixed building on Wine 6.8 after some internal changes to Wine's
windows.h
implementation.
yabridgectl
- Improved the warning yabridgectl shows when it cannot run
yabridge-host.exe
as part of the post-installation setup checks. - Fixed the reported number of new or updated plugins when yabridgectl manages both a 32-bit and a 64-bit version of the same VST3 plugin.
- Fixed text wrapping being broken after a dependency update earlier this year.
Compatibility
The archive ending in -ubuntu-18.04.tar.gz
is a compatibility release meant for older distros and is thus slightly larger in size. If you're using Ubuntu 18.04, Linux Mint 19, debian 10, or any other distro that's older than Ubuntu 20.04, then you should use this archive instead of the regular release. Yabridgectl will run on any distro.
Updating
To update from an older installation, simply overwrite your current yabridge and yabridgectl files with the ones downloaded below, and then rerun yabridgectl sync
to complete the update. As of yabridge 3.0.0 yabridgectl is now included in the regular release archives for your convenience.