Commit Graph

732 Commits

Author SHA1 Message Date
Robbert van der Helm fc04e2edcb Properly initialize the thread local objects
Instead of doing assignment. Assignment will probably reinitialize every
cycle, and it also didn't work on one person's computer.
2021-05-16 00:30:46 +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 93b8643cba Avoid allocations when reconstructing process data 2021-05-07 18:21:30 +02:00
Robbert van der Helm 814d3c688c Fix the VST3 audio processing sending buffers
Making these thread local statics makes much more sense for their
purpose. The old approach technically wasn't thread safe (even if it was
never an issue) and this gets rid of a data structure.
2021-05-07 17:41:42 +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 d08ec70f2c Add a bitsery adapter for MessageReference<T>
This lets us deserialize into an actual persistent object and then
reassign the reference to point to that object.
2021-05-07 16:23:04 +02:00
Robbert van der Helm c6fc24f210 Add a reference wrapper for VST3 message objects
This is kind of equivalent to `std::reference_wrapper`, but with default
initialization support (which is UB, but is required for serialization)
and a forward for `T::Response` as used by your sockets API.
2021-05-07 16:21:48 +02:00
Robbert van der Helm a9a7e3e711 Note that objects in audio sockets doesn't work 2021-05-06 18:05:10 +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 0b173ecba8 Reuse objects in the VST3 audio processor sockets
This means that, we're now receiving into an existing `YaProcessData`
object, which should reduce the number of allocations on the Wine side
considerably. Next we should also reuse the `YaProcessDataResponse`
object.
2021-05-06 16:41:11 +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 22d74e8b70 Add a helper for temporarily caching a value 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 a9f9691b42 Don't copy any VST3 state preamble
Bitwig prepends some data when passing an `IBStream*` to the plugin, and
when we do copy it iZotope Rx7 plugins cannot load their state (even if
we also copy over the same seek position). Not copying that preamble
fixes the issue, and it seems like it doesn't break anything.
2021-05-02 22:00:53 +02:00
Robbert van der Helm 757fb6d372 Pass the PID of the native host to the Wine hosts
We need this for our watchdog.
2021-05-01 17:13:16 +02:00
Robbert van der Helm 071bb157ad Move the pid_running() function to common utils
We're going to need this for our watchdog.
2021-05-01 17:08:47 +02:00
Robbert van der Helm 167784f93b Prevent unnecessary copies in ScopedValueCache 2021-05-01 16:28:14 +02:00
Robbert van der Helm 89d6c1b2e0 Fix assertion failure when reading end of stream
Getting the address of the end of a vector apparently raises an
assertion failure now, even if we didn't do anything with it.
2021-04-30 17:00:04 +02:00
Robbert van der Helm 0536256217 Add clamping to IBStream implementation seek 2021-04-29 23:40:42 +02:00
Robbert van der Helm 74dd7f61a2 Fix ISizeableStream::getStreamSize implementation 2021-04-29 22:49:16 +02:00
Robbert van der Helm 22f94dd22f Prevent unnecessary copies in ScopedValueCache 2021-04-29 02:58:05 +02:00
Robbert van der Helm 6f6e6c5b94 Reword caching to prefetching
Since that makes it much clearer what we're actually doing. With old
`cache_time_info` was actually caching the response, but now we're
querying it before the plugin has even requested the information.
2021-04-29 01:07:14 +02:00
Robbert van der Helm c82eb35243 Also cache audioMasterGetCurrentProcessLevel()
Melda plugins seem to call this during every processing cycle.
2021-04-29 01:02:10 +02:00
Robbert van der Helm 383b0c3f10 Remove the cache_time_info option
The new time info caching behaviour supersedes this by getting rid of
callbacks altogether.
2021-04-29 00:46:43 +02:00
Robbert van der Helm 2a9840828f Add a todo for also caching the process level 2021-04-29 00:42:44 +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 1deb4cf664 Send the VST2 transport info along with processing
And cache it during the processing cycle. This greatly reduces the
overhead of bridging VST2 plugins.
2021-04-29 00:32:25 +02:00
Robbert van der Helm dee964ec89 Add a helper for scope-bound caching of values 2021-04-29 00:31:11 +02:00
Robbert van der Helm 160c6acb85 Properly handle move semantics in the scoped FTZ 2021-04-28 12:55:58 +02:00
Robbert van der Helm 93f089eca7 Always set FTZ instead of gating it behind a flag
After a quick round of testing it seems like REAPER doesn't always
enable this on the audio thread, but Bitwig, Ardour, Carla and Renoise
do. So it should be safe to just get rid of the option and to leave this
enabled all the time.
2021-04-28 12:07:14 +02:00
Robbert van der Helm 2be41da9b6 Add compatibility option to force flushing to zero
This prevents Kush Audio REDDI from taking down the DAW when the host
passes it denormalized audio to process. I've discovered that the issue
with this plugin had to do with denormals in the issue linked below, but
I didn't realize that we can just enable the FTZ flag for plugins that
don't already do so.

https://github.com/osxmidi/LinVst/issues/174
2021-04-27 23:33:50 +02:00
Robbert van der Helm 3aac8e3483 Add a RAII wrapper for enabling flush-to-zero 2021-04-27 23:00:41 +02:00
Robbert van der Helm ab56115c87 Add Bitwig+Chromaphone 3 as a hide_daw candidate
Under Bitwig, the plugin will crash when trying to enter text unless you
hide the DAW the plugin is being hosted under.
2021-04-27 18:57:09 +02:00
Robbert van der Helm 3a73fb9689 Allow hiding the DAW name for VST2 plugins
This can be useful when plugins have (broken) host-specific behaviour
that you want to avoid. I'll later add a list of host/plugin
combinations where this may be useful to the readme.
2021-04-27 18:41:36 +02:00
Robbert van der Helm 38abdbee50 Rearrange the configuration options 2021-04-27 17:54:46 +02:00
Robbert van der Helm 0d1cb0bd77 Move special effVendorSpecific handling for REAPER
It's a bit less hacky if we do the effVendorSpecific check where we're
supposed to be checking for those things.
2021-04-24 20:23:23 +02:00
Robbert van der Helm b04c0b2c65 Update links to the VST3 documentation
Those were broken after Steinberg restructured the docs with the VST
3.7.2 SDK release.
2021-04-18 14:24:03 +02:00
Robbert van der Helm 6746b2b924 Add missing <optional> include for GCC 11 2021-04-14 17:09:43 +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 a297866d45 Add way to use 32-bit VST3 when both are installed
Otherwise we would always use the 64-bit version and there would be no
way to use the 32-bit version, if version for some reason works better.

Relates to #80.
2021-04-13 19:28:36 +02:00
Robbert van der Helm 3ae4bf56cd Fix memory error in remove_audio_processor()
We would close the socket, but the `receive_multi()` call would finish
after the object had already been deallocated using `erase()`. Somehow
this never caused any issues though.
2021-04-07 17:24:00 +02:00
Robbert van der Helm 05f739d9db Update to version 3.7.2 of the VST3 SDK 2021-04-03 18:02:23 +02:00
Robbert van der Helm 54c44e5256 Fix bus index not being serialized in GetBusInfo
This is embarrassing. Because the bus index was not being serialized,
all lookups were done for the bus with index 0. This meant that
sidechaining in Renoise didn't work because Renoise only allows
sidechaining to `kAux` busses and the first bus is always marked as
`kMain`. This would also cause Ardour to crash or freeze more often then
it should because while it does not support arbitrary bus I/O
configurations, it does support plugins with both a `kMain` and a `kAux`
input bus but since we would never get `kAux` busses Ardour just didn't
pass any buffers for the sidechain input.
2021-03-07 15:46:52 +01: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 9f756b4881 Rewrite architecture document ToC 2021-02-14 00:54:29 +01:00