# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic
Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

- Added a timed cache for the `IPluginView::canResize()` VST3 function, so value
  will be remembered during an active resize. This makes resizing VST3 plugin
  editor windows more responsive.
- Add a cache for VST3 function calls where the host asks the plugin whether it
  can process 32-bit or 64-bit floating point audio. Some hosts will call this
  function every processing cycle even though the value doesn't change. Caching
  this can significantly reduce the overhead of bridging VST3 plugins under
  those hosts.

### Changed

- 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 memory allocations during audio processing.
- Changed the way mutual recursion in VST3 plugins on the plugin side works to
  counter any potential GUI related timing issues with VST3 plugins.

### Fixed

- 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 builds on Wine 6.8 because of 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 checks.
- Fixed text wrapping being broken after a dependency update earlier this year.

## [3.2.0] - 2021-05-03

### Added

- During VST2 audio processing, yabridge will now prefetch the current transport
  information and process level before sending the audio buffers over to the
  Windows VST2 plugin. This lets us cache this information on the Wine side
  during the audio processing call, which significantly reduces the overhead of
  bridging VST2 plugins by avoiding one or more otherwise unavoidable back and
  forth function calls between yabridge's native plugin and the Wine plugin
  host. While beneficial to every VST2 plugin, this considerably reduces the
  overhead of bridging _MeldaProduction_ VST2 plugins, and it has an even
  greater impact on plugins like _SWAM Cello_ that request this information
  repeatedly over the course of a single audio processing cycle. Previously
  yabridge had a `cache_time_info` compatibility option to mitigate the
  performance hit for those plugins, but this new caching behaviour supercedes
  that option.
- We now always force the CPU's flush-to-zero flag to be set when processing
  audio. Most plugins will already do this by themselves, but plugins like _Kush
  Audio REDDI_ and _Expressive E Noisy_ that don't will otherwise suffer from
  extreme DSP usage increases when processing almost silent audio.
- Added a new [compatibility
  option](https://github.com/robbert-vdh/yabridge#compatibility-options) to hide
  the name of the DAW you're using. This can be useful with plugins that have
  undesirable or broken DAW-specific behaviour. See the [known
  issues](https://github.com/robbert-vdh/yabridge#runtime-dependencies-and-known-issues)
  section of the readme for more information on when this may be useful.
- Yabridge now uses a watchdog timer to prevent rare instances where Wine
  processes would be left running after the native host has crashed or when it
  got forcefully terminated. By design yabridge would always try to gracefully
  shut down its Wine processes when native host has crashed and the sockets
  become unavailable, but this did not always happen if the crash occurred
  before the bridged plugin has finished initializing because of the way Unix
  Domain Sockets work. In that specific situation the `yabridge-host.exe`
  process would be left running indefinitely, and depending on your DAW that
  might have also prevented you from actually restarting your DAW without
  running `wineserver -k` first. To prevent any more dangling processes,
  yabridge's Wine plugin hosts now have a watchdog timer that periodically
  checks whether the original process that spawned the bridges is still running.
  If it detects that the process is no longer alive, yabridge will close the
  sockets and shut down the bridged plugin to prevent any more dangling
  processes from sticking around.

### Changed

- Most common VST2 functions that don't have any arguments are now handled
  explicilty. Yabridge could always automatically support most VST2 functions by
  simply inspecting the function arguments and handling those accordingly. This
  works practically everywhere, but _Plugsound Free_ by UVI would sometimes pass
  unreadable function arguments to functions that weren't supposed to have any
  arguments, causing yabridge to crash. Explicitly handling those functions
  should prevent similar situations from happening in the future.
- Yabridge will now try to bypass VST3 connection proxies if possible. Instead
  of connecting two VST3 plugin objects directly, **Ardour** and **Mixbus**
  place a connection proxy between the two plugin objects so that they can only
  interact indirectly through the DAW. In the past yabridge has always honored
  this by proxying the host's connection proxy, but this causes difficult
  situations with plugins that actively communicate over these proxies from the
  GUI thread, like the _FabFilter_ plugins. Whenever possible, yabridge will now
  try to bypass the connection proxies and connect the two objects directly
  instead, only falling back to proxying the proxies when that's not possible.
- Compile times have been slightly lowered by compiling most of the Wine plugin
  host into static libraries first.
- When building the package from source, the targetted Wine version now gets
  printed at configure-time. This can make it a bit easier to diagnose
  Wine-related compilation issues.

### Removed

- The `cache_time_info` compatibility option has been removed since it's now
  obsolete.
- Removed a message that would show up when loading a VST3 plugin in Ardour,
  warning about potential crashes due to Ardour not supporting multiple input
  and output busses. These crashes have been resolved since yabridge 3.1.0.

### Fixed

- Fixed rare X11 errors that could occur when closing a plugin's editor. In
  certain circumstances, closing a plugin editor would trigger an X11 error and
  crash the Wine plugin host, and with that likely the entire DAW. This happened
  because Wine would try to destroy the window after it had already been
  destroyed. This could happen in Renoise and to a lesser degree in REAPER with
  plugins that take a while to close their editors, such as the _iZotope Rx_
  plugins. We now explicitly reparent the window to back the root window first
  before deferring the window closing. This should fix the issue, while still
  keeping editor closing nice and snappy.
- Plugin group host processes now shut down by themselves if they don't get a
  request to host any plugins within five seconds. This can happen when the DAW
  gets killed right after starting the group host process but before the native
  yabridge plugin requests the group host process to host a plugin for them.
  Before this change, this would result in a `yabridge-group.exe` process
  staying around indefinitely.
- Prevented latency introducing VST3 from freezing **Ardour** and **Mixbus**
  when loading the plugin. This stops _Neural DSP Darkglass_ from freezing when
  used under those DAWs.
- Fixed _FabFilter_ VST3 plugins freezing in **Ardour** and **Mixbus** when
  trying to duplicate existing instances of the plugin after the editor GUI has
  been opened.
- Fixed VST3 plugins freezing in **Ardour** and **Mixbus** when the plugin tries
  to automate a parameter while loading a preset.
- Fixed _Voxengo_ VST3 plugins freezing in **Ardour** and **Mixbus** when
  loading a project or when duplicating the plugin instances.
- Fixed potential X11 errors resulting in assertion failures and crashes in
  **Ardour** and **Mixbus** when those hosts hide (unmap) a plugin's editor
  window.
- Fixed saving and loading plugin state for VST3 _iZotope Rx_ plugins in
  **Bitwig Studio**.
- Fixed a regression from yabridge 3.1.0 where **REAPER** would freeze when opening
  a VST3 plugin context menu.
- Fixed a potential freezing issue in **REAPER** that could happen when a VST3
  plugin resizes itself while sending parameter changes to the host when
  REAPER's 'disable saving full plug-in state' option has not been disabled.
- Fixed another potential freeze when loading a VST3 plugin preset while the
  editor is open when the plugin tries to resize itself based on that new
  preset.
- Fixed a potential assertion failure when loading VST3 presets. This would
  depend on the compiler settings and the version of `libstdc++` used to built
  yabridge with.
- Fixed _PSPaudioware InifniStrip_ failing to initialize. The plugin expects the
  host to always be using Microsoft COM, and it doesn't try to initialize it by
  itself. InfiniStrip loads as expected now.
- Fixed _Native Instruments' FM7_ crashing when processing MIDI. In order to fix
  this, MIDI events are now deallocated later then when they normally would have
  to be.
- Fixed extreme DSP usage increases in _Kush Audio REDDI_ and _Expressive E
  Noisy_ due to denormals.
- Fixed the VST3 version of _W. A. Production ImPerfect_ crashing during audio
  setup.
- Fixed _UVI Plugsound Free_ crashing during initialization.
- Fixed the Wine version detection when using a custom `WINELOADER`.
- Fixed incorrect logging output for cached VST3 function calls.
- Because of the new VST2 transport information prefetching, the excessive DSP
  usage in _SWAM Cello_ has now been fixed without requiring any manual
  compatibility options.

## [3.1.0] - 2021-04-15

### Added

- Added support for using 32-bit Windows VST3 plugins in 64-bit Linux VST3
  hosts. This had previously been disabled because of a hard to track down
  corruption issue.
- Added an
  [option](https://github.com/robbert-vdh/yabridge#compatibility-options) to
  prefer the 32-bit version of a VST3 plugin over the 64-bit version if both are
  installed. This likely won't be necessary, but because of the way VST3 bundles
  work there's no clean way to separate these. So when both are installed, the
  64-bit version gets used by default.

### Fixed

- Worked around a regression in Wine 6.5 that would prevent yabridge from
  shutting down ([wine bug
  #50869](https://bugs.winehq.org/show_bug.cgi?id=50869)). With Wine 6.5
  terminating a Wine process no longer terminates its threads, which would cause
  yabridge's plugin and host components to wait for each other to shut down.
- Fixed preset/state loading in both the VST2 and VST3 versions of _Algonaut
  Atlas 2.0_ by loading and saving plugin state from the main GUI thread.
- Added a workaround for a bug present in every current _Bluecat Audio_ VST3
  plugin. Those plugins would otherwise crash yabridge because they didn't
  directly expose a core VST3 interface through their query interface.
- Fixed a multithreading related memory error in the VST3 audio processor socket
  management system.

### yabridgectl

- Added an indexing blacklist, accessible through `yabridgectl blacklist`. You
  most likely won't ever have to use this, but this lets you skip over files and
  directories in yabridgectl's indexing process.
- Minor spelling fixes.

### Packaging notes

- The Meson wrap dependencies for `bitsery`, `function2` and `tomlplusplus` are
  now defined using `dependency()` with a subproject fallback instead of using
  `subproject()` directly. This should make it easier to package.
- The VST3 SDK Meson wrap dependency and the patches in
  `tools/patch-vst3-sdk.sh` are now based on version 3.7.2 of the SDK.
- The VST3 SDK Meson wrap now uses a tag (`v3.7.2_build_28-patched`) instead of
  a commit hash.

## [3.0.2] - 2021-03-07

### Fixed

- Fix bus information queries being performed for the wrong bus index. This
  fixes VST3 sidechaining in _Renoise_, and prevents a number of VST3 plugins
  with a sidechain input from causing _Ardour_ and _Mixbus_ to freeze or crash.

## [3.0.1] - 2021-02-26

### Changed

- Wine 6.2 introduced a
  [regression](https://bugs.winehq.org/show_bug.cgi?id=50670) that would cause
  compile errors because some parts of Wine's headers were no longer valid C++.
  Since we do not need the affecting functionality, yabridge now includes a
  small workaround to make sure that the affected code never gets compiled. This
  has been fixed for Wine 6.3.

### Fixed

- Added support for a new ReaSurround related VST2.4 extension that **REAPER**
  recently started using. This would otherwise cause certain plugins to crash
  under REAPER.
- Fixed a regression from yabridge 3.0.0 where log output would no longer
  include timestamps.

### yabridgectl

- Changed the wording and colors in `yabridgectl status` for plugins that have
  not yet been setup to look less dramatic and hopefully cause less confusion.
- Aside from the installation status, `yabridgectl status` now also shows a
  plugin's type and architecture. This is color coded to make it easier to
  visually parse the output.
- Plugin paths printed during `yabridgectl status` and
  `yabridgectl sync --verbose` are now always shown relative to the plugin
  directory instead of the same path prefix being repeated for every plugin.

## [3.0.0] - 2021-02-14

### Added

- Yabridge 3.0 introduces the first ever true Wine VST3 bridge, allowing you to
  use Windows VST3 plugins in Linux VST3 hosts with full VST 3.7.1
  compatibility. Simply tell yabridgectl to look for plugins in
  `$HOME/.wine/drive_c/Program Files/Common Files/VST3`, run `yabridgectl sync`,
  and your VST3 compatible DAW will pick up the new plugins in
  `~/.vst3/yabridge` automatically. Even though this feature has been tested
  extensively with a variety of VST3 plugins and hosts, there's still a
  substantial part of the VST 3.7.1 specification that isn't used by any of the
  hosts or plugins we could get our hands on, so please let me know if you run
  into any weird behaviour! There's a list in the readme with all of the tested
  hosts and their current VST3 compatibility status.
- Added an
  [option](https://github.com/robbert-vdh/yabridge#compatibility-options) to use
  Wine's XEmbed implementation instead of yabridge's normal window embedding
  method. This can help reduce flickering when dragging the window around with
  certain window managers. Some plugins will have redrawing issues when using
  XEmbed or the editor might not show up at all, so your mileage may very much
  vary.
- Added a [compatibilty
  option](https://github.com/robbert-vdh/yabridge#compatibility-options) to
  forcefully enable drag-and-drop support under _REAPER_. REAPER's FX window
  reports that it supports drag-and-drop itself, which makes it impossible to
  drag files onto a plugin editor embedded there. This option strips the
  drag-and-drop support from the FX window, thus allowing you to drag files onto
  plugin editors again.
- Added a frame rate
  [option](https://github.com/robbert-vdh/yabridge#compatibility-options) to
  change the rate at which events are being handled. This usually also controls
  the refresh rate of a plugin's editor GUI. The default 60 updates per second
  may be too high if your computer's cannot keep up, or if you're using a host
  that never closes the editor such as _Ardour_.
- Added a [compatibility
  option](https://github.com/robbert-vdh/yabridge#compatibility-options) to
  disable HiDPI scaling for VST3 plugins. At the moment Wine does not have
  proper fractional HiDPI support, so some plugins may not scale their
  interfaces correctly when the host tells those plugins to scale their GUIs. In
  some cases setting the font DPI in `winecfg`'s graphics tab to 192 will also
  cause the GUIs to scale correctly at 200%.
- Added the `with-vst3` compile time option to control whether yabridge should
  be built with VST3 support. This is enabled by default.

### Changed

- `libyabridge.so` is now called `libyabridge-vst2.so`. If you're using
  yabridgectl then nothing changes here. **To avoid any potential confusion in
  the future, please remove the old `libyabridge.so` file before upgrading.**
- The release archives uploaded on GitHub are now repackaged to include
  yabridgectl for your convenience.
- Window closing is now deferred. This means that when closing the editor
  window, the host no longer has to wait for Wine to fully close the window.
  Most hosts already do something similar themselves, so this may not always
  make a difference in responsiveness.
- Slightly increased responsiveness when resizing plugin GUIs by preventing
  unnecessary blitting. This also reduces flickering with plugins that don't do
  double buffering.
- VST2 editor idle events are now handled slightly differently. This should
  result in even more responsive GUIs for VST2 plugins.
- Win32 and X11 events in the Wine plugin host are now handled with lower
  scheduling priority than other tasks. This might help get rid of potential DSP
  latency spikes when having the editor open while the plugin is doing expensive
  GUI operations.
- Opening and closing plugin editors is now also no longer done with realtime
  priority. This should get rid of any latency spikes during those operations,
  as this could otherwise steal resources away from the threads that are
  processing audio.
- The way realtime priorities assigned has been overhauled:

  - Realtime scheduling on the plugin side is now a more granular. Instead of
    setting everything to use `SCHED_FIFO`, only the spawned threads will be
    configured to use realtime scheduling. This prevents changing the scheduling
    policy of your host's GUI thread if your host instantiates plugins from its
    GUI thread like _REAPER_ does.
  - Relaying messages printed by the plugin and Wine is now done without
    realtime priority, as this could in theory cause issues with plugins that
    produce a steady stream of fixmes or other output.
  - The realtime scheduling priorities of all audio threads in the Wine plugin
    host are now periodically synchronized with those of the host's audio
    threads.

- When using `yabridge.toml` config files, the matched section or glob pattern
  is now also printed next to the path to the file to make it a bit easier to
  see where settings are being set from.
- The architecture document has been updated for the VST3 support and it has
  been rewritten to talk more about the more interesting bits of yabridge's
  implementation.
- Part of the build process has been changed to account for [this Wine
  bug](https://bugs.winehq.org/show_bug.cgi?id=49138). Building with Wine 5.7
  and 5.8 required a change for `yabridge-host.exe` to continue working, but
  that change now also breaks builds using Wine 6.0 and up. The build process
  now detects which version of Wine is used to build with, and it will then
  apply the change conditionally based on that to be able to support building
  with both older and newer versions of Wine. This does mean that when you
  switch to an older Wine version, you might need to run
  `meson setup build --reconfigure` before rebuilding to make sure that these
  changes take effect.
- `yabridge-host.exe` will no longer remove the socket directories if they're
  outside of a temporary directory. This could otherwise cause a very unpleasant
  surprise if someone were to pass random arguments to it when for instance
  trying to write a wrapper around `yabridge-host.exe`.
- When `YABRIDGE_DEBUG_LEVEL` is set to 2 or higher and a plugin asks the host
  for the current position in the song, yabridge will now also print the current
  tempo to help debugging host bugs.

### Fixed

- VST2 plugin editor resizing in **REAPER** would not cause the FX window to be
  resized like it would in every other host. This has now been fixed.
- The function for suspending and resuming audio, `effMainsChanged()`, is now
  always executed from the GUI thread. This fixes **EZdrummer** not producing
  any sound because the plugin makes the incorrect assumption that
  `effMainsChanged()` is always called from the GUI thread.
- Event handling is now temporarily disabled while plugins are in a partially
  initialized state. The VST2 versions of **T-RackS 5** would have a chance to
  hang indefinitely if the event loop was being run before those plugins were
  fully initialized because of a race condition within those plugins. This issue
  was only noticeable when using plugin groups.
- Fixed a potential issue where an interaction between _Bitwig Studio_ and
  yabridge's input focus grabbing method could cause delayed mouse events when
  clicking on a plugin's GUI in Bitwig. This issue has not been reported for
  yabridge 2.2.1 and below, but it could in theory also affect older versions of
  yabridge.

### yabridgectl

- Updated for the changes in yabridge 3.0. Yabridgectl now allows you to set up
  yabridge for VST3 plugins. Since `libyabridge.so` got renamed to
  `libyabridge-vst2.so` in this version, it's advised to carefully remove the
  old `libyabridge.so` and `yabridgectl` files before upgrading to avoid
  confusing situations.
- Added the `yabridgectl set --path-auto` option to revert back to automatically
  locating yabridge's files after manually setting a path with
  `yabridgectl set --path=<...>`.
- Added the `yabridgectl set --no-verify={true,false}` option to permanently
  disable post-installation setup checks. You can still directly pass the
  `--no-verify` argument to `yabridgectl sync` to disable these checks for only
  a single invocation.

## [2.2.1] - 2020-12-12

### Fixed

- Fixed some plugins, notably the _Spitfire Audio_ plugins, from causing a
  deadlock when using plugin groups in _REAPER_. Even though this did not seem
  to cause any issues in other hosts, the race condition that caused this issue
  could also occur elsewhere.

## [2.2.0] - 2020-12-11

### Added

- Added an option to cache the time and tempo info returned by the host for the
  current processing cycle. This would normally not be needed since plugins
  should ask the host for this information only once per audio callback, but a
  bug in _SWAM Cello_ causes this to happen repeatedly for every sample,
  resutling in very bad performance. See the [compatibility
  options](https://github.com/robbert-vdh/yabridge#compatibility-options)
  section of the readme for more information on how to enable this.

### Changed

- When `YABRIDGE_DEBUG_LEVEL` is set to 2 or higher and a plugin asks the host
  for the current position in the song, yabridge will now print that position in
  quarter notes and samples as part of the debug output.
- `YABRIDGE_DEBUG_LEVEL` 2 will now also cause all audio processing callbacks to
  be logged. This makes recognizing misbheaving plugins a bit easier.
- Symbols in all `libyabridge.so` and all Winelib `.so` files are now hidden by
  default.

### Fixed

- Fixed an issue where in certain situations Wine processes were left running
  after the host got forcefully terminated before it got a chance to tell the
  plugin to shut down. This could happen when using Kontakt in Bitwig, as Bitwig
  sets a limit on the amount of time a plugin is allowed to spend closing when
  you close Bitwig, and Kontakt can take a while to shut down.
- Fixed a potential crash or freeze when removing a lot of plugins from a plugin
  group at exactly the same time.

## [2.1.0] - 2020-11-20

### Added

- Added a separate
  [yabridgectl](https://aur.archlinux.org/packages/yabridgectl/) AUR package for
  Arch and Manjaro. The original idea was that yabridgectl would not require a
  lot of changes and that a single
  [yabridgectl-git](https://aur.archlinux.org/packages/yabridgectl-git/) package
  would be sufficient, but sometimes changes to yabridgectl will be incompatible
  with the current release so it's nicer to also have a separate regular
  package.

### Changed

- Yabridge will now always search for `yabridge-host.exe` in
  `~/.local/share/yabridge` even if that directory is not in the search path.
  This should make setup easier, since you no longer have to modify any
  environment variables when installing yabridge to the default location.
  Because of this, the symlink-based installation method does not have a lot of
  advantages over the copy-based method anymore other than the fact that you
  can't forget to rerun `yabridgectl sync` after an upgrade, so most references
  to it have been removed from the readme.

### Fixed

- Fixed an issue where _Renoise_ would show an error message when trying to load
  a plugin in the mixer.

## [2.0.2] - 2020-11-14

### Fixed

- Added a workaround for a bug in _Ardour 6.3_ which would cause several plugins
  including MT Power Drumkit to crash when opening the editor.
- Fixed linking error in debug build related to the parallel STL.

## [2.0.1] - 2020-11-08

### Fixed

- Fixed a regression where `yabridge-host.exe` would not exit on its own after
  the host crashes or gets terminated without being able to properly close all
  plugins.

## [2.0.0] - 2020-11-08

### Added

- The way communication works in yabridge has been completely redesigned to be
  fully concurrent and to use additional threads as necessary. This was needed
  to allow yabridge to handle nested and mutually recursive function calls as
  well as several other edge cases a synchronous non-concurrent implementation
  would fail. What this boils down to is that yabridge became even faster, more
  responsive, and can now handle many scenarios that would previously require
  workarounds. The most noticeable effects of these changes are as follows:

  - The `hack_reaper_update_display` workaround for _REAPER_ and _Renoise_ to
    prevent certain plugins from freezing is no longer needed and has been
    removed.
  - Opening and scanning plugins becomes much faster in several VST hosts
    because more work can be done simultaneously.
  - Certain plugins, such as Kontakt, no longer interrupt audio playback in
    Bitwig while their editor was being opened.
  - Any loading issues in Bitwig Studio 3.3 beta 1 are no longer present.
  - Hosting a yabridged plugin inside of the VST2 version of Carla now works as
    expected.
  - And probably many more improvements.

  Aside from these more noticeable changes, this has also made it possible to
  remove a lot of older checks and behaviour that existed solely to work around
  the limitations introduced by the old event handling system. I have been
  testing this extensively to make sure that these changes don't not introduce
  any regressions, but please let me know if this did break anything for you.

### Changed

- The way the Wine process handles threading has also been completely reworked
  as part of the communication rework.
- GUI updates for plugins that don't use hardware acceleration are now run at 60
  Hz instead of 30 Hz. This was kept at 30 updates per second because that
  seemed to be a typical rate for Windows VST hosts and because function calls
  could not be processed while the GUI was being updated, but since that
  limitation now no longer exists we can safely bump this up.
- Sockets are now created in `$XDG_RUNTIME_DIR` (which is `/run/user/<user_id>`
  on most systems) instead of `/tmp` to avoid polluting `/tmp`.

### Removed

- The now obsolete `hack_reaper_update_display` option has been removed.
- The previously deprecated `use-bitbridge` and `use-winedbg` compilation
  options have been removed. Please use `with-bitbridge` and `with-winedbg`
  instead.

### Fixed

- Fixed a very long standing issue with plugins groups where unloading a plugin
  could cause a crash. Now you can host over a hundred plugins in a single
  process without any issues.
- Fixed another edge case with plugin groups when simultaneously opening
  multiple plugins within the same group. The fallover behaviour that would
  cause all of those plugins to eventually connect to a single group host
  process would sometimes not work correctly because the plugins were being
  terminated prematurely.
- Fixed the implementation of the accumulative `process()` function. As far as
  I'm aware no VST hosts made in the last few decades even use this, but it just
  feels wrong to have an incorrect implementation as part of yabridge.

## [1.7.1] - 2020-10-23

### Fixed

- Fixed a regression where the `editor_double_embed` option would cause X11
  errors and crash yabridge.
- Fixed a regression where certain fake dropdown menus such as those used in the
  Tokyo Dawn Records plugins would close immediately when hovering over them.
- Fixed an issue where plugins hosted within a plugin group would not shut down
  properly in certain situations. This would cause the VST host to hang when
  removing such a plugin.

### yabridgectl

- When running `yabridgectl sync`, existing .so files will no longer be
  recreated unless necessary. This prevents hosts from rescanning all plugins
  after setting up a single new plugin through yabridgectl. Running
  `yabridgectl sync` after updating yabridge will still recreate all existing
  .so files as usual.
- Added a `--force` option to `yabridgectl sync` to always recreate all existing
  .so files like in previous versions.
- Fixed a regression from yabridgectl 1.6.1 that prevented you from removing
  directories that no longer exist using `yabridgectl rm`.

## [1.7.0] - 2020-10-13

### Changed

- The way keyboard input works has been completely rewritten to be more reliable
  in certain hosts and to provide a more integrated experience. Hovering over
  the plugin's editor while the window provided by the host is active will now
  immediately grab keyboard focus, and yabridge will return input focus to the
  host's window when moving the mouse outside of the plugin's editor when the
  window is still active. This should fix some instances where keyboard input
  was not working in hosts with more complex editor windows like _REAPER_ and
  _Ardour_, and it also allows things like the comment field in REAPER's FX
  window to still function.

  A consequence of this change is that pressing Space in Bitwig Studio 3.2 will
  now play or pause playback as intended, but this does mean that it can be
  impossible to type the space character in text boxes inside of a plugin editor
  window. Please let me know if this causes any issues for you.

- Both unrecognized and invalid options are now printed on started to make
  debugging `yabridge.toml` files easier.

- Added a note to the message stating that libSwell GUI support has been
  disabled to clarify that this is expected behaviour when using REAPER. The
  message now also contains a suggestion to enable the
  `hack_reaper_update_display` option when it is not already enabled.

### Fixed

- Added a workaround for reparenting issues with the plugin editor GUI on a
  [specific i3 setup](https://github.com/robbert-vdh/yabridge/issues/40).

### Documentation

- The documentation on `yabridge.toml` files and the available options has been
  rewritten in an effort to make it easier to comprehend.

## [1.6.1] - 2020-09-28

### Fixed

- Fixed a potential crash that could happen if the host would unload a plugin
  immediately after its initialization. This issue affected the plugin scanning
  in _REAPER_.
- Fixed parsing order of `yabridge.toml`. Sections were not always read from top
  to bottom like they should be, which could cause incorrect and unexpected
  setting overrides.
- Fixed an initialization error when using plugin groups for plugins that are
  installed outside of a Wine prefix.

### yabridgectl

- Relative paths now work when adding plugin directories or when setting the
  path to yabridge's files.
- Also search `/usr/local/lib` for `libyabridge.so` when no manual path has been
  specified. Note that manually copying yabridge's files to `/usr` is still not
  recommended.

## [1.6.0] - 2020-09-17

### Added

- Added support for double precision audio processing. This is not very widely
  used, but some plugins running under REAPER make use of this. Without this
  those plugins would cause REAPER's audio engine to crash.

### Fixed

- Increased the limit for the maximum number of audio channels. This could cause
  issues in Renoise when using a lot of output channels.

## [1.5.0] - 2020-08-21

### Added

- Added an option to work around timing issues in _REAPER_ and _Renoise_ where
  the hosts can freeze when plugins call a certain function while the host
  doesn't expect it, see
  [#29](https://github.com/robbert-vdh/yabridge/issues/29) and
  [#32](https://github.com/robbert-vdh/yabridge/issues/32). The
  [readme](https://github.com/robbert-vdh/yabridge#runtime-dependencies-and-known-issues)
  contains instructions on how to enable this.

### Changed

- Don't print calls to `effIdle()` when `YABRIDGE_DEBUG_LEVEL` is set to 1.

### Fixed

- Fix Waves plugins from freezing the plugin process by preventing them from
  causing an infinite message loop.

## [1.4.1] - 2020-07-27

### yabridgectl

- Fixed regression caused by
  [alexcrichton/toml-rs#256](https://github.com/alexcrichton/toml-rs/issues/256)
  where the configuration file failed to parse after running `yabridgectl sync`.
  If you have already run `yabridgectl sync` using yabridgectl 1.4.0, then
  you'll have to manually remove the `[last_known_config]` section from
  `~/.config/yabridgectl/config.toml`.
- Fixed issue with overwriting broken symlinks during `yabridgectl sync`.

## [1.4.0] - 2020-07-26

### Added

- Added an alternative editor hosting mode that adds yet another layer of
  embedding. Right now the only known plugins that may need this are
  _PSPaudioware_ plugins with expandable GUIs such as E27. The behaviour can be
  enabled on a per-plugin basis in the plugin configuration. See the
  [readme](https://github.com/robbert-vdh/yabridge#compatibility-options)
  for more details.

### Changed

- Both parts of yabridge will now run with realtime priority if available. This
  can significantly reduce overall latency and spikes. Wine itself will still
  run with a normal scheduling policy by default, since running wineserver with
  realtime priority can actually increase the audio processing latency although
  it does reduce the amount of latency spikes even further. You can verify that
  yabridge is running with realtime priority by looking for the `realtime:` line
  in the initialization message. I have not found any downsides to this approach
  in my testing, but please let me know if this does end up causing any issues.

### Fixed

- Fixed rare plugin location detection issue on Debian based distros related to
  the plugin and host detection fix in yabridge 1.2.0.

### yabridgectl

- Added a check to `yabridgectl sync` that verifies that the currently installed
  versions of Wine and yabridge are compatible. This check will only be repeated
  after updating either Wine or yabridge.

- Added a `--no-verify` option to `yabridgectl sync` to skip the
  post-installation setup checks. This option will skip both the login shell
  search path check for the copy-based installation method as well as the new
  Wine compatibility check.

## [1.3.0] - 2020-07-17

### Added

- By somewhat popular demand yabridge now comes with yabridgectl, a utility that
  can automatically set up and manage yabridge for you. It also performs some
  basic checks to ensure that everything has been set up correctly so you can
  get up and running faster. Yabridgectl can be downloaded separately from the
  GitHub releases page and its use is completely optional, so you don't have to
  use it if you don't want to. Check out the
  [readme](https://github.com/robbert-vdh/yabridge/tree/master/tools/yabridgectl)
  for more information on how it works.

### Deprecated

- The `use-bitbridge` and `use-winedbg` options have been deprecated in favour
  of the new `with-bitbridge` and `with-winedbg` options. The old options will
  continue to work until they are removed in yabridge 2.0.0.

## [1.2.1] - 2020-06-20

### Changed

- When building from source, only statically link Boost when the
  `with-static-boost` option is enabled.
- The `use-bitbridge` and `use-winedbg` options have been replaced by
  `with-bitbridge` and `with-winedbg` for consistency's sake. The old options
  will be marked as deprecated in the next minor release.

### Fixed

- Fixed memory error that would cause crashing on playback with some buffer
  sizes in Mixbus6.
- Opening a plugin would override the Wine prefix for all subsequent plugins
  opened from within the same process. This prevented the use of multiple Wine
  prefixes in hosts that do not sandbox their plugins, such as Ardour.
- Manual Wine prefix overides through the `WINEPREFIX` environment were not
  reflected in the output shown on startup.
- Fixed plugin group socket name generation. This would have prevented plugin
  groups with the same name from being used simultaneously in different Wine
  prefixes.
- Distinguish between active processes and zombies when checking whether a group
  host process is still running during initialization.

## [1.2.0] - 2020-05-29

### Added

- Added the ability to host multiple plugins within a single Wine process
  through _plugin groups_. A plugin group is a user-defined set of plugins that
  will be hosted together in the same Wine process. This allows multiple
  instances of plugins to share data and communicate with each other. Examples
  of plugins that can benefit from this are FabFilter Pro-Q 3, MMultiAnalyzer,
  and the iZotope mixing plugins. See the readme for instructions on how to set
  this up.

### Changed

- Changed architecture to use one fewer socket.
- GUI events are now always handled on a steady timer rather than being
  interleaved as part of the event loop. This change was made to unify the event
  handling logic for individually hosted plugins and plugin groups. It should
  not have any noticeable effects, but please let me know if this does cause
  unwanted behavior.

### Fixed

- Steal keyboard focus when clicking on the plugin editor window to account for
  the new keyboard focus behavior in _Bitwig Studio 3.2_.
- Fixed large amount of empty lines in the log file when the Wine process closes
  unexpectedly.
- Made the plugin and host detection slightly more robust.

## [1.1.4] - 2020-05-12

### Fixed

- Fixed a static linking issue with the 32-bit build for Ubuntu 18.04.

## [1.1.3] - 2020-05-12

### Fixed

- Added a workaround for the compilation issues under Wine 5.7 and above as
  caused by [Wine bug #49138](https://bugs.winehq.org/show_bug.cgi?id=49138).
- Added a workaround for plugins that improperly defer part of their
  initialization process without telling the host. This fixes startup behavior
  for the Roland Cloud plugins.
- Added a workaround for a rare race condition in certain plugins caused by
  incorrect assumptions in plugin's editor handling. Fixes the editor for
  Superior Drummer 3 and the Roland Cloud synths in Bitwig Studio.
- Fixed potential issue with plugins not returning their editor size.

## [1.1.2] - 2020-05-09

### Fixed

- Fixed an issue where plugin removal could cause Ardour and Mixbus to crash.

## [1.1.1] - 2020-05-09

### Changed

- Changed installation recommendations to only install using symlinks with hosts
  that support individually sandboxed plugins.
- Respect `YABRIDGE_DEBUG_FILE` when printing initialization errors.

### Fixed

- Stop waiting for the Wine VST host process on startup if the process has
  crashed or if Wine was not able to start.

## [1.1.0] - 2020-05-07

### Added

- Added support for plugins that send MIDI events back to the host. This allows
  plugins such as Cthulhu and Scaler to output notes and CC for another plugin
  to work with.
- Added support for querying and setting detailed information about speaker
  configurations for use in advanced surround setups. This indirectly allows
  yabridge to work under _Renoise_.
- Added automated development builds for yabridge, available by clicking on the
  'Automated builds' badge in the project readme.

### Changed

- Changed the plugin detection mechanism to support yet another way of
  symlinking plugins. Now you can use a symlink to a copy of `libyabridge.so`
  that's installed for a plugin in another directory. This is not recommended
  though.
- Changed Wine prefix detection to be relative to the plugin's `.dll` file,
  rather than the loaded `.so` file.
- Increased the maximum number of audio channels from 32 to 256.
- Clarified the error that appears when we're unable to load the `.dll`.
- Yabridge will now print the used version of Wine during startup. This can be
  useful for diagnosing startup problems.

### Fixed

- Fixed plugins failing to load on certain versions of _Ubuntu_ because of
  paths starting with two forward slashes.
- Redirect the output from the Wine host process earlier in the startup process.
  Otherwise errors printed during startup won't be visible, making it very hard
  to diagnose problems.

## [1.0.0] - 2020-05-03

### Added

- This changelog file to track keep track of changes since yabridge's 1.0
  release.
