Commit Graph

209 Commits

Author SHA1 Message Date
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 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 1bc804965c Clean up lambdas in VST2 variant visitors 2021-06-10 16:53:55 +02:00
Robbert van der Helm e36a7e7e72 Add the effSetProcessPrecision opcode 2021-06-09 18:41:34 +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 2bf1c4c5eb Use C++20 [[unlikely]] instead of BOOST_UNLIKELY 2021-05-31 17:50:02 +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 4d5b2fcb12 Add missing quotes in IEditController::getParamValueByString() log message 2021-05-23 19:45:29 +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 549306b295 Include effString2Parameter in opcode list
We don't need any special handling for this since our default argument
detection will handle strings, but it might be useful for log output if
a host ever uses this. At the moment there don't seem to be any hosts on
Linux that use this.
2021-05-21 02:03:27 +02:00
Robbert van der Helm 0e3a4f6d54 Move EventResultPayload to Vst2EventResult::Payload 2021-05-20 15:55:39 +02:00
Robbert van der Helm 2bf41c6fe1 Move EventPayload to Vst2Event::Payload 2021-05-20 15:52:40 +02:00
Robbert van der Helm 59ba2aeb5f Add noexcept qualifications in src/common
Apparently this can actually make a difference in some cases, and the
C++ Core Guideliens recommend doing this on all default constructors,
destructors, and all functions that can not throw (and thus also don't
allocate).
2021-05-14 17:12:24 +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 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 9424c36993 Temporarily memoize IPlugView::canResize()
This makes VST3 plugin resizing more responsive, because this function
would otherwise be constantly running in lockstep from the GUI thread.
2021-05-05 19:44:44 +02:00
Robbert van der Helm 75006a537b Split up VST3 logging for UniversalTResult
I was wondering why I couldn't find the overload for `UniversalTResult`,
and as it turns out we would always use this variant (which
unsurprisingly was the very first overload added). We should of course
have separate overloads for this.
2021-05-05 19:38:46 +02:00
Robbert van der Helm ce668ec022 Clean up style 2021-05-05 19:38:46 +02:00
Robbert van der Helm b8f8dd7236 Log cached audioMasterGetTime() calls
Just like we log cached VST3 function calls.
2021-04-29 00:41:56 +02:00
Robbert van der Helm 2cf5f2dfb9 Fix missing timestamps since yabridge 3.0.0 2021-02-24 21:07:01 +01:00
Robbert van der Helm dc7c988623 Fix segfault in REAPER due to new vendor extension
This `effVendorSpecific` call would pass a non-zero non-pointer value to
the pointer argument, which would then of course result in segfaults.
2021-02-15 21:15:22 +01:00
Robbert van der Helm 39da1b1e1c Add missing whitespace in VST2 debug logs 2021-02-15 20:51:45 +01:00
Robbert van der Helm 2ea3f52632 Fix double timestamps in Wine STDERR logger 2021-02-13 17:42:30 +01:00
Robbert van der Helm 0ef15fc911 Add human readable name for effGetTailSize opcode 2021-02-13 17:34:51 +01:00
Robbert van der Helm e57c642cfe Also log IBStream metadata keys 2021-02-13 17:29:35 +01:00
Robbert van der Helm 907925d660 Log process context contents in IInfoListener::setChannelContextInfos 2021-02-13 16:40:24 +01:00
Robbert van der Helm 4f8eaaaa75 Refactor plugin factories into Vst3*Proxy format
Now every proxy object that's directly created by the host or plugin
shares the same structure.
2021-02-13 15:42:05 +01: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 5978247a0b Don't serialize input size for IPlugView::GetSize 2021-02-12 18:58:33 +01:00
Robbert van der Helm a1bb522ea0 Move piping stream lines to the log to common 2021-02-12 18:35:07 +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 fc3c3524fd Hide IAudioProcessor::getLatencySamples in logs
On verbosity level 1
2021-01-30 16:11:29 +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 9858db25d2 Show IComponent::getBusCount on verbosity level 1
The only reason this was hidden is because REAPER spams it, but it also
spams `IComponent::getBusInfo` which we cannot hide.
2021-01-30 01:51:14 +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 0044bc6b60 Allow passing null pointers to IPlugView::setFrame 2021-01-24 14:44:42 +01:00
Robbert van der Helm 1b804bd5ea 💥 Convert between UID formats for class IDs
This is a breaking change. Old projects containing VST3 plugins running
through yabridge will no longer work without modifications. I'll write
some scripts to convert the class IDs stored in those project files soon
a migration path.

The UIDs reported by the plugin were apparently wrong, which meant that
the native Linux VST3 version of plugin X and the normal Windows VST3
version of plugin X used different class ideas than the Windows VST3
version of plugin X running through yabridge. Those things are supposed
to be compatible, so we sadly needed to make this change at some point.
2021-01-22 14:24:40 +01:00
Robbert van der Helm d3d57a3fe0 Use UID conversion for GetControllerClassId 2021-01-22 14:13:27 +01:00
Robbert van der Helm ae0d7263b8 Use UID conversion for IsPlugInterfaceSupported
I assume that this would also be necessary here, right?
2021-01-22 13:50:06 +01:00
Robbert van der Helm f8ac296ec7 Print the tempo part of VstTimeInfo
At debug level 2. This was needed to debug an issue with Renoise.
2021-01-21 20:04:35 +01:00
Robbert van der Helm 6b992e7c9a Add logging for IParameterFunctionName 2021-01-17 14:10:01 +01:00
Robbert van der Helm 1dc900aff9 Add logging for IProgress 2021-01-17 00:19:01 +01:00
Robbert van der Helm 1ab9056a82 Add logging for IProcessContextRequirements 2021-01-16 16:17:34 +01:00
Robbert van der Helm 701271c273 Add logging for IPlugInterfaceSupport 2021-01-16 14:49:24 +01:00
Robbert van der Helm 26c78df37c Add logging for IMidiLearn 2021-01-16 13:57:43 +01:00