Commit Graph

127 Commits

Author SHA1 Message Date
Robbert van der Helm 8ba6e4a937 Noexcept qualify the VST3 proxy implementations
For the same reasons mentioned in the last commit.
2021-05-14 17:30:05 +02:00
Robbert van der Helm f1d7b7bf57 Avoid allocations in VST3 process response
This is very ugly so hopefully I can think of a neater way, but now the
response object is just a set of pointers, so we can avoid all copies
and moves on the Wine side.
2021-05-07 19:24:28 +02:00
Robbert van der Helm 671587f981 Further reduce allocations by reusing responses
On the plugin's side, still need to do a lot of work on the Wine side of
things.
2021-05-07 17:00:43 +02:00
Robbert van der Helm fcaac219a6 💥 Reduce allocations in VST3 audio sockets
We do this by using this new `MessageReference<T>` type to avoid copying
our `YaAudioProcessor::Process` struct and the contained `YaProcessData`
object. This is only part of the work, but this redesign lets us keep
the these objects alive on both the plugin and the host side. On the
plugin side, we'll simply serialize the data from the referred to object
without copying it. On the Wine side, we'll write the data to a
persistent thread local object, and then reassign the
`MessageReference<T>` to point to that object. This lets us serialize
'references', thus avoiding potentially expensive allocations. With
these last few changes alone VST3 plugins are already at the same
performance level as our optimized VST2 plugin groups.
2021-05-07 16:32:08 +02:00
Robbert van der Helm 578259a002 Fix the canProcessSampleSize() cache
This is what you get for carelessly copying and pasting.
2021-05-06 18:55:01 +02:00
Robbert van der Helm b6f96fc920 Cache IAudioProcessor::canProcessSampleSize() 2021-05-06 18:32:46 +02:00
Robbert van der Helm 8f310ed89b Rename ParameterInfoCache to be more general 2021-05-06 18:16:33 +02:00
Robbert van der Helm 9f5066a293 Avoid allocations when reading VST3 process data
On the plugin side. We still need to do a lot of optimizations
elsewhere.
2021-05-06 17:50:41 +02:00
Robbert van der Helm 6231ab7816 Reuse YaProcessData object on the plugin side
Well, kind of. This doesn't do anything yet since the default assignment
operator will just destroy and recreate objects as normal.
2021-05-06 16:34:23 +02:00
Robbert van der Helm ce668ec022 Clean up style 2021-05-05 19:38:46 +02:00
Robbert van der Helm 000fa04b7b Update documentation on VST3 function call caches
Since REAPER has now fixed the issues that lead us to implementing these
things.
2021-05-05 19:38:46 +02:00
Robbert van der Helm ac6bcae28b Fix disconnecting VST3 connection points in Ardour
We bypassed the proxies on `IConnectionPoint::connect()`, so we should
of course be doing the same thing on `IConnectionPoint::disconnect()`.Z
2021-05-02 19:05:49 +02:00
Robbert van der Helm 62efc1c273 Also handle mutual recursion in *::getState()
VST3 plugins could freeze in REAPER when the plugin sends
`IComponentHandler::performEdit()` followed by
`IPlugFrame::resizeView()` when REAPER simultaneously tries to call
`*::getState()`. Here `*::getState()` gets called from the GUI thread,
while `IPlugFrame::resizeView()` has to be handled on REAPER's GUI
thread, resulting in a deadlock unless we use the plugin-side mutual
recursion mechanism.

I've seen this cause issues with PSPaudioware InfiniStrip.
2021-05-02 16:38:37 +02:00
Robbert van der Helm a83ff5a36a Fix wrong direction in cached VST3 call logging 2021-05-02 15:47:11 +02:00
Robbert van der Helm 52428c8749 Also fix mutual recursion across both components
When setting the state on the audio processor, it can happen that plugin
triggers a resize from the edit controller. We should also be able to
handle that situation.
2021-04-30 02:11:24 +02:00
Robbert van der Helm 949ddaf673 Use mutual recursion for IEditController::setState
With this we should be able to handle `setState()`s that try to resize
the currently open editor. This could pop up when using the preset
browser in REAPER with plugins that recall their old size when loading a
preset.
2021-04-30 01:15:18 +02:00
Robbert van der Helm 0f506f75e4 Bypass connection point proxies when possible
This greatly improves compatibility with VST3 plugins in Ardour and
Mixbus. Most notably the FabFilter plugins would previously freeze when
having the GUI open while duplicating or inserting new instances.
2021-04-29 15:36:28 +02:00
Robbert van der Helm 4937010557 Fix some of the clang-tidy lints 2021-04-14 16:09:54 +02:00
Robbert van der Helm 4e4ed3a6b4 Don't serialize input output info for IComponent::getRoutingInfo
Yes, input output info.
2021-02-12 19:24:33 +01:00
Robbert van der Helm 67091bc13c Don't serialize input info for IComponent::getBusInfo 2021-02-12 19:12:49 +01:00
Robbert van der Helm e62bd603f9 Don't serialize input arrangement for IAudioProcessor::getBusArrangement 2021-02-12 19:08:51 +01:00
Robbert van der Helm 2020acfec1 Don't serialize input info for IEditController::getParameterInfo 2021-02-12 19:02:27 +01:00
Robbert van der Helm 81d401f06a Add mutexes for the VST3 data caches
Since the restart will always be called from another thread, and when a
plugin asks for a restart during initialization this can quickly lead to
issues.
2021-01-30 23:26:57 +01:00
Robbert van der Helm b5dd806b2d Cache VST3 parameter information
This is in some cases needed to get decent performance in REAPER, as
REAPER seems to query this information (which cannot change without the
plugin requesting a restart) four times per second.
2021-01-30 22:24:05 +01:00
Robbert van der Helm 1043776e52 Differentiate between cached values in logs
If it turns out we forgot to flush this cache in some place.
2021-01-30 13:56:58 +01:00
Robbert van der Helm 68e10cd24c Flush the bus info cache in more places
The current approach 'works', but better err on the safe side. Once this
caching layer is no longer necessary we should just remove it.
2021-01-30 13:48:42 +01:00
Robbert van der Helm 10b7930779 Also clear bus cache on IAudioProcessor::setActive
Now we need a workaround for our REAPER workaround because REAPER
doesn't follow the audio processing workflow diagram, amazing!
2021-01-30 01:42:20 +01:00
Robbert van der Helm 6339618984 Fix response logging filtering with bus info cache
The response logging wasn't getting filtered.
2021-01-30 00:45:45 +01:00
Robbert van der Helm f5b4a28bd0 Cache bus information during processing
This works around an issue with REAPER. During every processing cycle
REAPER would query how many input and output busses we have, and it
would then enumerate over all of those busses. This meant that if a VST3
plugin has 32 output busses, then REAPER will do 34 extra function calls
before processing audio.
2021-01-30 00:02:06 +01:00
Robbert van der Helm 77414c80d6 Allow null pointers in IEditController::setComponentHandler 2021-01-24 14:51:18 +01:00
Robbert van der Helm d5e4424463 Also sync VST3 audio thread scheduling priorities
The exact same thing as the last commit, but for VST3 plugins.
2021-01-23 15:22:10 +01:00
Robbert van der Helm d3d57a3fe0 Use UID conversion for GetControllerClassId 2021-01-22 14:13:27 +01:00
Robbert van der Helm 1c6d3f8fd9 Fully implement IParameterFunctionName
We now support all VST 3.7.1 interfaces! At least, in theory we do.
2021-01-17 14:17:46 +01:00
Robbert van der Helm 3d8ee1ddf1 Add stubs for IParameterFunctionName 2021-01-17 13:23:17 +01:00
Robbert van der Helm aa1a7a1588 Fully implement IProgress
`IParameterFunctionName` will be the last interface before we _in
theory_ support all VST3 features.
2021-01-17 00:19:48 +01:00
Robbert van der Helm 9ddf4b2ae1 Fully implement IProcessContextRequirements 2021-01-16 16:29:21 +01:00
Robbert van der Helm a2203cfef7 Add stubs for IProcessContextRequirements 2021-01-16 16:09:31 +01:00
Robbert van der Helm 73fda0b568 Fully implement IPlugInterfaceSupport
With this we support all VST 3.6.12 interfaces.
2021-01-16 15:19:10 +01:00
Robbert van der Helm 7fdf646270 Fully implement IMidiLearn 2021-01-16 14:25:00 +01:00
Robbert van der Helm 85c1972c1f Add stubs for IMidiLearn 2021-01-15 22:36:25 +01:00
Robbert van der Helm 6e8d56923c Fully implement INoteExpressionPhysicalUIMapping
With this we support all VST 3.6.11 features.
2021-01-15 19:33:05 +01:00
Robbert van der Helm c485677987 Add stubs for INoteExpressionPhysicalUIMapping 2021-01-15 19:08:06 +01:00
Robbert van der Helm 1d9b60b481 Fully implement IComponentHandlerBusActivation
We now support all VST 3.6.8 features. (or technically, also all VST
3.6.10 features)
2021-01-14 16:42:19 +01:00
Robbert van der Helm 631166d0bf Fully implement IInfoListener 2021-01-12 17:04:07 +01:00
Robbert van der Helm ccdb121f96 Add stubs for IInfoListener 2021-01-12 16:54:13 +01:00
Robbert van der Helm 87b270273f Fully implement IPrefetchableSupport 2021-01-12 15:37:58 +01:00
Robbert van der Helm 7c081b458a Add stubs for IPrefetchableSupport 2021-01-12 15:24:37 +01:00
Robbert van der Helm 5855ffbe85 Fully implement IUnitHandler2 2021-01-10 23:54:43 +01:00
Robbert van der Helm a2d1a97309 Fully implement IAutomationState 2021-01-10 23:38:40 +01:00
Robbert van der Helm cfa1aff1bf Add stubs for IAutomationState 2021-01-10 23:32:55 +01:00