Commit Graph

467 Commits

Author SHA1 Message Date
Robbert van der Helm 5b3210eed6 Inhibit event loop during VST3 offline processing
This prevents T-RackS 5 from causing the export in Bitwig Studio 4.1.0
beta 2 to freeze.
2021-11-10 21:29:40 +01:00
Robbert van der Helm e3f0926aef Allow the group host to terminate cleanly
...before terminating it forcefully. Not sure why this
`TerminateProcess()` was here instead of in `group-host.cpp` in the
first place. This way we don't have to duplicate any destructor
behaviour.
2021-10-16 02:00:39 +02:00
Robbert van der Helm 1b662c07a7 Clean up group host socket endpoint files
Apparently we just left these behind. Now all yabridge related files
should be gone from the temporary directories if yabridge exits cleanly.
2021-10-16 01:58:15 +02:00
Robbert van der Helm 46b4dc0341 Add missing includes for Boost 1.77 2021-09-27 17:45:59 +02:00
Robbert van der Helm 9d9eac85ef Store context menu items in unordered maps
The difference in performance won't be noticable, but both lookups and
modifications in these things are much faster once you have more than
one or two elements.
2021-09-27 17:36:48 +02:00
Robbert van der Helm f26a2a2689 Set VST2 SR and block sizes from main thread
This apparently fixes New Sonic Arts' Vice plugin freezing while
loading. Hopefully this doesn't cause issues with other plugins. Spotted
in https://www.kvraudio.com/forum/viewtopic.php?p=8217647#p8217647.
2021-09-21 14:11:15 +02:00
Robbert van der Helm 1883888ec6 Unify exception handling style 2021-08-07 13:17:03 +02:00
Robbert van der Helm 2e6732c0e2 Fix regression for VST3 editor initial sizing
We accidentally reverted a little bit too much code in
762e622416. This didn't appear any sooner
because plugins are supposed to call `IPlugFrame::resizeView()` during
`IPlugView::attached()`, so this only affects plugins that don't confirm
to the spec.
2021-08-02 14:47:21 +02:00
Robbert van der Helm c98a9519fe Handle X11 events within the Win32 event loop
This unifies event handling and it allows X11 events to still be
processed even when the event loop is blocked.
2021-07-31 15:19:44 +02:00
Robbert van der Helm 762e622416 Revert "Inhibit the event loop during VST3 editor init"
This reverts commit ff76e482f2.

This was a workaround for a race condition in Nimble Kick when opening
the editor while the plugin has not yet been authorized (a Win32 timer
proc between `IEditController::createView()` and `IPlugView::attached()`
would cause a stack overflow because the plugin doesn't check if the
things it wants to use have actually been initialized yet).

But as it turns out, Bitwig Studio now calls
`IEditController::createView()` unconditionally when loading a VST3
plugin, regardless of whether the user wants to open the editor or not.
So this workaround would cause the message loop to be stalled
indefinitely until you open the editor. Since this would also cause
Nimble Kick to break in the Windows version of Bitwig, we'll simply
revert this workaround. If you need to activate the plugin on Linux, you
can load it in the Windows version of REAPER running under Wine instead.
After that the plugin will work just fine under yabridge.
2021-07-29 13:56:26 +02:00
Robbert van der Helm d13f39dce5 Don't check result on IPlugView::onSize()
Melda plugins always return `kResultFalse`, so we should just assume the
resize succeeds.
2021-07-21 20:45:04 +02:00
Robbert van der Helm e223c98b0d Remove XEmbed testing todo
Still seems to work 'fine' (as in, not really).
2021-07-21 17:01:02 +02:00
Robbert van der Helm e28bc63f8d Also resize the wrapper window for VST3 plugins 2021-07-21 17:01:02 +02:00
Robbert van der Helm 4277561aa4 Reorder Vst3Bridge methods 2021-07-21 17:01:02 +02:00
Robbert van der Helm 418cd68a81 Resize the new wrapper window for VST2 plugins 2021-07-21 17:01:02 +02:00
Robbert van der Helm ff76e482f2 Inhibit the event loop during VST3 editor init
This should in theory prevent Nimble Kick from triggering a stack
overflow when the event loop timer procs before `IPlugView::attached()`
gets called and the plugin hasn't been registered yet. I haven't seen
any other VST3 plugins trigger a race condition here.
2021-07-20 16:24:25 +02:00
Robbert van der Helm 22be79aa0d Move X11 event tracing behind +editor debug flag 2021-07-20 03:15:39 +02:00
Robbert van der Helm 8c285688e8 Remove unnecessary function call 2021-07-17 22:57:50 +02:00
Robbert van der Helm e4f2e8c27f Add a separate audio thread mutual recursion stack
This should fix #118 without breaking our _other_ workaround from
yabridge 3.4.0 to fix the issue where a plugin would freeze if it would
try to resize itself while at the same time it sent parameter changes
from the audio thread. (and both of these issues of course are caused by
the same JUCE bug)
2021-07-15 21:05:36 +02:00
Robbert van der Helm 1e0cf33eba Use a recursive mutex for the Melda deadlock fix
This seems safer with the whole mutual recursion thing.
2021-07-15 16:01:47 +02:00
Robbert van der Helm 5f7fb2e2c3 Work around thread safety issue in Melda plugins
This is super difficult to trigger on purpose, but I did run into it at
least once just now so it seems like a good idea to at least make sure
that this doesn't happen.
2021-07-15 15:45:15 +02:00
Robbert van der Helm f02341e77f Fix focus handling when reopening REAPER FX window
REAPER initializes the plugin's editor first before reparenting the
parent window to the FX window, so our `topmost_window` didn't actually
refer to the FX window.
2021-07-15 14:21:50 +02:00
Robbert van der Helm f292158889 Silence some more clangd warnings 2021-07-14 17:11:27 +02:00
Robbert van der Helm 591b2b9ceb Also warn on version mismatch for VST2 plugins 2021-07-13 22:24:02 +02:00
Robbert van der Helm 5fc7acccd1 Show a notification on version mismatch
Between the plugin and the Wine plugin host application.
2021-07-13 22:14:31 +02:00
Robbert van der Helm 3c94ee7049 Only perform mutual recursion from the GUI thread
JUCE incorrectly calls `IComponentHandler::performEdit()` from the audio
thread instead of using the output parameter changes queue, so this
would also cause GUI resizes to be handled from the audio thread if they
come in at the same time as such a parameter change.
2021-07-10 14:30:52 +02:00
Robbert van der Helm 4e4bbe1ba4 Replace const-rvalue with rvalue
Since const-rvalue doesn't make any sense.
2021-07-05 16:39:11 +02:00
Robbert van der Helm 1397400155 Reload supported interfaces after IPluginBase::initialize()
This is needed as a workaround to support Waves VST3 plugins.

Right now does does not actually fix the issue because the arguments are
not updated in the subclasses. The next commit will fix this.
2021-07-05 16:08:01 +02:00
Robbert van der Helm 3fbb01f225 Move all casted VST3 plugin interfaces to struct
To make Waves plugins happy we're going to have to replace this after
calling `IPluginBase::initialize()`.
2021-07-05 15:22:47 +02:00
Robbert van der Helm 97ff407ef6 Allow plug view creation to fail 2021-07-05 15:02:36 +02:00
Robbert van der Helm 4c24baa3d2 Remove default constructor for Vst3PluginInstance
Seems weird to need this specifically so we can use the map overload
that creates a new instance when the key doesn't exist in the map. This
seems safer.
2021-07-05 14:35:44 +02:00
Robbert van der Helm e25231c2d2 Rename VST3 instance holder classes
We're going to have to split up the interfaces into another object so we
can reinitialize it later.
2021-07-05 14:16:23 +02:00
Robbert van der Helm cd060fba24 Remove comment about host context interfaces
As it turns out, later SDK versions did add more interface. (this class
used to directly implement `IHostApplication`)
2021-07-05 01:17:34 +02:00
Robbert van der Helm 9b1f3a5f4c Remove non-existent VST2 entry point
Since there isn't any public documentation on VST2, I saw JUCE and a
couple of other plugins and bridges use this, but they all redefined the
symbol to`main`.
2021-06-29 12:11:05 +02:00
Hector Martin 51ba93e4ed Add missing <bitset> include 2021-06-26 12:29:45 +02:00
Robbert van der Helm 94ba58a7a5 Remove automatically added using std::endl;
This is the first thing you disable on clangd, but apparently I was too
late here.
2021-06-26 12:27:05 +02:00
Robbert van der Helm 20638b7349 Fix missing autoformatting
At some point Doom Emacs broke on-save formatting with lsp-mode in
certain circumstances, and I made these changes with wgrep so apparently
they were never formatted.
2021-06-26 12:27:01 +02:00
Robbert van der Helm 42e1e49ab9 Remove debug prints 2021-06-13 00:27:24 +02:00
Robbert van der Helm 8a754b08cf Only initialize VST2 audio buffers on activation
Ardour apparently always calls `effMainsChanged()` with a value argument
of 0 when unloading the plugin, regardless of whether it has actually
initialized audio processing before that point.
2021-06-12 20:15:20 +02:00
Robbert van der Helm 67e754feb5 Make the maximum block size in VST2 optional 2021-06-12 20:05:39 +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 9c30d64975 Fix speaker arrangement bitsets
The sizes were wrong, and Blue Cat Audio's VST3 plugins seem to use the
upper bits to store the channel configuration, which thus got read out
incorrectly.
2021-06-11 17:22:46 +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 14e3ed2cd3 Add shared audio buffers config to IAudioProcessor::setupProcessing() 2021-06-10 21:37:42 +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 53d59f74d1 Reduce the VST2 events small vector capacities
Every DAW will just send all events in one go (and I think that's the
only way you should do it, but the VST2 spec is a bit leaky so who
knows). It wouldn't make much sense to preallocate more capacity,
because when DAWs do send all of those events individually they might
end up sending more than four of these anyways.
2021-06-10 12:43:54 +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