Commit Graph

347 Commits

Author SHA1 Message Date
Robbert van der Helm f0c26cbe06 Allow building 32-bit yabridge libraries 2021-06-24 13:41:43 +02:00
Robbert van der Helm 553b4474a7 Respect $XDG_DATA_HOME when looking for binaries
Since we're using the XDG base dir package in yabridgectl we were
already doing this there, so it makes sense to also do this in yabridge
itself even though it's very unlikely the user will have this set.
2021-06-23 01:53:18 +02:00
Robbert van der Helm 5ffe4773e9 Show startup errors in a desktop notification
This should make it much easier to spot what goes wrong if you're new to
yabridge and don't know where to look yet.
2021-06-22 17:41:08 +02:00
Robbert van der Helm 780d562909 Fix plugin host watchdog treating zombies as alive 2021-06-22 17:15:47 +02:00
Robbert van der Helm 0156b61e64 Show notification when plugin host fails to start
This one's a bit generic since the relevant output from the Wine process
will have already been printed to the logger before this point.
2021-06-22 17:13:30 +02:00
Robbert van der Helm 466fe3abcf Run $WINELOADER --version under the correct env
This makes the initialization message reflect the correct Wine version
when using a `WINELOADER` script to change between Wine versions
depending on the Wine prefix.
2021-06-21 13:00:05 +02:00
Robbert van der Helm eb9c2d9bf9 [yabridgectl] Don't panic on empty wine --version
And print a more descriptive error message instead. This is only
relevant when using a `WINELOADER` that causes `$WINELOADER --version`
to not output anything.
2021-06-16 13:09:20 +02:00
Robbert van der Helm 4c009cb670 Add an environment variable for disabling watchdog
This should only be used when running the Wine process under a separate
namespace.
2021-06-16 01:28:59 +02:00
Robbert van der Helm 736b223af8 Set the audioMasterGetTime flags
Apparently this is a thing, and Ardour is the only DAW that respects
them.
2021-06-12 20:36:22 +02:00
Robbert van der Helm 9c439b62e3 Ignore REAPER host function API requests
Apparently there is a plugin that uses these.
2021-06-12 17:22:47 +02:00
Robbert van der Helm 9ae0e8ca38 [yabridgectl] Use reflinks instead of copies
Whenever available. This should speed up the copying process while also
reducing the amount of disk space wasted on Btrfs and XFS filesystems.
2021-06-12 11:40:24 +02:00
Robbert van der Helm 78f6921cd8 Also use hashsets for the VST2 opcode dispatch
Should barely make a difference, but it should be as fast or faster.
2021-06-11 14:57:01 +02:00
Robbert van der Helm aaf3e7438c Use unordered maps for VST3 plugin instances
The better algorithmic time complexity should help when using many (say,
hundreds) of instances of a single VST3 plugin.
2021-06-11 14:48:28 +02:00
Robbert van der Helm dec19dc12a 💥 Reimplement VST3 audio processing
In the same way as 50c25c1cf0 did it for
VST2 plugins. Input and output audio data is now stored in a shared
memory buffer instead of being sent over the sockets. This reduces the
bridging overhead to a minimum since copying data was the most expensive
operation we were doing and we now only need to copy the entire buffer
once per processing cycle.
2021-06-11 13:59:37 +02:00
Robbert van der Helm 964c150158 Use the in new place optional extension 2021-06-10 23:44:47 +02:00
Robbert van der Helm 50c25c1cf0 💥 Reimplement VST2 audio processing
We now use shared memory to store the input and output audio buffers.
This means that we have to copy less data every processing cycle, since
a single copy to and a single copy from the shared memory object
suffices now. This should reduce the DSP load for VST2
plugins (especially when used in a plugin group) marginally to
significantly depending on the plugins used and the system
configuration.
2021-06-10 17:31:32 +02:00
Robbert van der Helm cacfc0b379 Fix serializing VST2 speaker arrangements 2021-06-10 13:05:47 +02:00
Robbert van der Helm 087d5a6f87 Remind ourselves that we somehow survived 2020 2021-06-09 16:48:27 +02:00
Robbert van der Helm 53e4fa369f Bump to version 3.3.1 2021-06-09 16:36:02 +02:00
Robbert van der Helm 19e78e22b5 Reword changelog 2021-06-09 16:36:02 +02:00
Robbert van der Helm 70d18edce2 Fix version strings when building from tarball
When that tarball has been extracted in an (unrelated) git repository.
2021-06-09 16:19:01 +02:00
Robbert van der Helm 6fd31168d8 Reword changelog 2021-06-09 12:41:07 +02:00
Robbert van der Helm 7c9cd7b9e5 Fix uninitialized timed caches
This could prevent resizeable plugins from being resizeable in Ardour if
the initialized timestamp just happened to be greater than the current
time, since the returned result would then likely be some invalid value.
2021-06-09 12:31:03 +02:00
Robbert van der Helm fb1eefa880 Reorder changelog 2021-06-09 12:21:13 +02:00
Robbert van der Helm 65c05aac88 Indicate cached IPlugView::canResize() calls
We apparently forgot to pass the flag here after implementing it in the
log function.
2021-06-09 12:07:29 +02:00
Robbert van der Helm da5f6e9e7d Always initialize Microsoft COM unconditionally 2021-06-07 22:24:48 +02:00
Robbert van der Helm a7496fae77 Add thread names 2021-06-06 23:45:47 +02:00
Robbert van der Helm 974951e966 Translate mouse coordinates from Wine window
Instead of the parent Window. Tracktion Waveform does some weird things
with its VST2 editor embedding, so with the old approach this would
cause mouse clicks to be offset 27 pixels vertically and one pixel
horizontally.
2021-06-05 11:32:24 +02:00
Robbert van der Helm 7228d49507 Bump to version 3.3.0 2021-06-03 17:35:45 +02:00
Robbert van der Helm e8a0a66a53 Reword the changelog, again 2021-06-03 17:35:45 +02:00
Robbert van der Helm 2be6388830 Reword the changelog 2021-06-03 14:29:28 +02:00
Robbert van der Helm 712ef41a7f Make realtime scheduling less aggressive
On the Wine side. Instead of always having it enabled and disabling it
when it could potentially hurt (i.e. when handling GUI related things),
we'll now only enable it when it's potentially beneficial. This way we
don't have to constantly switch scheduling policies on the GUI thread.
2021-06-01 16:21:38 +02:00
Robbert van der Helm 5f4ffed90b Prevent allocations in Vst3Logger::log_query_interface
String constants will be converted to `std::string` because it's not
constexpr yet, and that will allocate for longer strings. Since this
function only prints something when `YABRIDGE_DEBUG_LEVEL` is set to 2
or higher that seems like a waste.
2021-05-31 18:07:19 +02:00
Robbert van der Helm 6a047497bc Only print query interface messages on log level 2 2021-05-31 17:44:43 +02:00
Robbert van der Helm 511aa14700 [yabridgectl] Fix reporting of new VST3 plugins
When yabridgectl sets up both a VST3 bundle containing both a 32-bit and
a 64-bit plugin. The libyabridge.so file already existed, so the
reported number was always off.
2021-05-31 17:05:34 +02:00
Robbert van der Helm db0f58d000 Fix the changelog entry for the plugin group fix
This of course happens for any VST2 plugin, not just multiple instances
of the same plugin.
2021-05-30 02:17:46 +02:00
Robbert van der Helm 27c96135cb Fix thread safety issue with VST2 plugin groups
While a VST2 plugin is being initialized in a plugin group, all host
callbacks would go over that new plugin instance's sockets. This would
cause a race condition if the host processes audio while loading
plugins. This issue has been there since the introduction of plugin
groups, but it's only noticeable in Bitwig Studio, and only when using
over thirty instances of the same plugin in a plugin group.
2021-05-30 02:06:52 +02:00
Robbert van der Helm 68d5d33cba Add a warning for low RLIMIT_RTTIME values
This will make it much easier to spot issues caused by PipeWire.
2021-05-27 14:22:58 +02:00
Robbert van der Helm d610c07e11 Enable mutual recursion on effGetProgramName()
PG-8X in REAPER has the same mutual recursion limitation the Voxengo
plugins had in Renoise, but with `effGetProgramName()` instead of
`effGetProgram()`.
2021-05-23 19:00:16 +02:00
Robbert van der Helm 0b9b1330ad Make sure effProcessEvents() also never allocates
This basically changes the default small vectors during VST2 event
processing from 256 bytes to the size of a `DynamicVstEvents`
object (which also includes a small_vector to hold MIDI events without
allocating) and makes them thread local. We already have a similar
optimization for VST3. There it's a bit neater since we already had to
separate audio processing functions from non-time critical functions.
Here we don't have that separation, so we just made these buffers thread
local, large enough to hold our predefined number of events, and we then
just shrink them to fit if these buffers grow even more (which can only
happen after reading or writing chunk data).

The change doesn't specifically target `effProcessEvents()`, but that's
where you would see the differences. This is also relevant for
`audioMasterProcessEvents()`.
2021-05-23 17:37:09 +02:00
Robbert van der Helm 29e0a0fd36 Reuse VST2 audio processing buffers on Wine side
Just like we made similar changes on the plugin side a few commits ago
to prevent allocations there.
2021-05-23 16:37:01 +02:00
Robbert van der Helm d2965e048d No longer zero out VST3 audio buffers
Apparently we also never did this for VST2 plugins, so this should be
safe. Filling the vectors with zeroes here had a non-negligible
performance impact according to perf.
2021-05-23 15:55:29 +02:00
Robbert van der Helm 8429919dfe Reuse VST2 audio processing buffers on plugin side 2021-05-23 15:25:36 +02:00
Robbert van der Helm 4e81c1c2b3 Reuse request on Wine side during VST2 processing
The object was constantly being recreated, resulting in memory
allocations caused by creating and destroying the audio buffer vectors.
2021-05-23 15:02:53 +02:00
Robbert van der Helm 6f321649c4 Do small vector optimization for all communication
I once read years ago somewhere on Stack Overflow that `std::vectors`
with that are preinitialized to a default size would allocate the
initial capacity on the stack. This of course doesn't make any
sense (run time sized stack allocations can cause all kinds of issues),
so we were still allocating with our default 64-byte sized buffers, but
just not as often.
2021-05-23 14:43:02 +02:00
Robbert van der Helm 4e289348c2 Clarify the VST3 mutual recursion change 2021-05-23 13:49:38 +02:00
Robbert van der Helm df93944f3b Prevent allocations caused by Logger::log_trace
C++ would always construct an `std::string` from the string constant
every iteration. Since this also happened when `YABRIDGE_DEBUG_LEVEL` is
not set to 2, this ended up causing unnecessary allocations.
2021-05-23 00:21:21 +02:00
Robbert van der Helm e700678a11 Also preallocate small buffers for VST2 events 2021-05-23 00:10:03 +02:00
Robbert van der Helm da8f4aae19 Preallocate small vectors for VST3 queues
Events, parameter changes, and the individual queues contained within
the parameter changes all use dynamic memory allocation. Preallocating
some memory for those things inside of the objects may prevent latency
spikes when they those objects are first filled. This is especially
useful for the parameter changes since there's no way to reserve memory
in a vector of vectors.
2021-05-22 23:38:31 +02:00
Robbert van der Helm 7c49fe739d Use our new custom std::variant bitsery extension
This prevents reinitializing `std::variant`s when the variant we want to
deserialize is already active. We store audio buffers in variants, so
reinitializing them results in a lot of unnecessary memory frees,
allocations and writes during every processing cycle.
2021-05-22 17:51:01 +02:00