Commit Graph

56 Commits

Author SHA1 Message Date
Robbert van der Helm 49fc896d62 Remove Win32 effEditIdle() timer
Now Editor is completely decoupled from VST2.
2020-12-19 23:30:47 +01:00
Robbert van der Helm a724b378fe Move the editor handling back to Vst2Bridge
Since we can have multiple editors in Vst3Bridge.
2020-12-19 19:56:49 +01:00
Robbert van der Helm 816d1c1501 Implement IComponent::setState() 2020-12-14 12:09:47 +01:00
Robbert van der Helm 32c1028736 Implement IPluginFactory3::setHostContext()
Now the plugin factories are fully implemented (at least, functionality
wise, we still can't create most kinds of objects).
2020-12-13 15:53:39 +01:00
Robbert van der Helm 3db099e0fc Also make the GroupHost plugin type agnostic 2020-12-07 18:28:16 +01:00
Robbert van der Helm 0eb80fe866 Add a general entry point to HostBridge
Since for all plugin types we would need to start listening for incoming
events this way.
2020-12-07 18:28:16 +01:00
Robbert van der Helm eeb6acf8dd Move event handling to a common HostBridge 2020-12-07 18:28:16 +01:00
Robbert van der Helm 46bc0301af Move communication.h to communication/vst2.h 2020-12-07 18:28:16 +01:00
Robbert van der Helm 23d5567e72 Add a time info caching compatibility option #62
This is needed to get good performance out of SWAM Cello until this
issue is fixed by the plugin.
2020-11-30 14:49:02 +01:00
Robbert van der Helm 49900e4753 Fix typo 2020-11-20 17:45:21 +01:00
Robbert van der Helm 28013cb6a7 Note that the effEditIdle issue is fixed in Ardour
For the upcoming Ardour 6.4 release:

https://github.com/Ardour/ardour/commit/f7cb1b0b481eeda755bdf8eb9fc5f90a81d2aa01
2020-11-20 15:59:40 +01:00
Robbert van der Helm ff021d0581 Work around editor opening bug in Ardour 6.3 2020-11-13 17:08:41 +01:00
Robbert van der Helm 9300648067 Fix typo in vst2.cpp 2020-11-08 16:07:57 +01:00
Robbert van der Helm d2500ff31d Get rid of message loop skipping and EditorOpening
This special behaviour is no longer needed now that event handling is
fully concurrent and the Win32 message loop no longer blocks
`dispatch()` calls.
2020-11-07 22:06:58 +01:00
Robbert van der Helm a0c0a86e2c Drop the separate effProcessEvents socket
Now that event handling is fully concurrent and thus no longer gets
blocked by the Win32 message loop.
2020-11-07 20:54:33 +01:00
Robbert van der Helm 1c7e866609 No longer return a lambda in passthrough_event()
Now that it's no longer used directly this is no longer needed, and it's
much clearer without the lambda.
2020-11-06 17:17:36 +01:00
Robbert van der Helm ba6381e3ae Rename EventHandler::{send,receive} to *_event(s?)
Since it does something way more involved than
`SocketHandler::{send,receive_multi}`, and that makes it a bit confusing
if you don't already know about that (and even if you do).
2020-11-01 12:01:50 +01:00
Robbert van der Helm fa01ac843b Replace all non-group sockets with SocketHandler
This greatly reduces the amount of boilerplate and potential for error.
2020-10-30 13:30:08 +01:00
Robbert van der Helm bece654c2d Rename PluginContext to MainContext for clarity 2020-10-28 01:02:56 +01:00
Robbert van der Helm fac820c25a Execute all non-unsafe opcodes on calling thread
This will require more testing of course, but I think it should be safe.
This would increase the potential maximal throughput in group hosts
significantly.
2020-10-27 23:18:59 +01:00
Robbert van der Helm 4038e198fe Replace the Win32Thread proxy functions
Now that we can use lambdas instead.
2020-10-27 17:16:20 +01:00
Robbert van der Helm e51c7f7ae3 Get rid of hack_reaper_update_display
It is now no longer necessary.
2020-10-27 11:13:39 +01:00
Robbert van der Helm 016ceccc18 Mark several opcodes as unsafe
These potentially perform GUI operations and should always be handled on
the main thread.
2020-10-27 11:13:39 +01:00
Robbert van der Helm ca2b95e7aa Handle dispatch() directly during event handling
When the message loop is active and we get an incoming dispatch() event,
we'll just handle it directly. In practice this would only be needed
when the event is a response to an `audioMaster()` call made during the
event loop, but we can't know that. This allows the `getProgram()`
during `audioMasterUpdateDisplay()` in REAPER and Renoise to work
correctly. Hopefully this doesn't cause random rare breakage.
2020-10-26 20:03:54 +01:00
Robbert van der Helm 8d7826f1df Handle incoming events from off-threads separately
On the Wine side we want to handle most events on the main UI thread.
We'll assume any events coming in from a secondary socket are safe and
can be handled directly.
2020-10-26 13:45:37 +01:00
Robbert van der Helm d82f8463d9 Use simple numerical IDs for plugins in groups
We'll be using a similar approach to identify threads for event
handlers.
2020-10-26 11:51:13 +01:00
Robbert van der Helm 74c3cab046 Move event handling logic to a dedicated class
Now all pieces are in place to allow handling events over multiple
socket connections.
2020-10-26 11:40:38 +01:00
Robbert van der Helm 54ed69c408 Merge events.h into communication.h 2020-10-25 21:37:04 +01:00
Robbert van der Helm 4b53342514 💥 Encapsulate and rework all socket logic
This is a pretty huge change that will be important for being able to
handle nested or mutually recursive `dispatch()` and `audioMaster()`
calls. This sadly all had to be done in a single commit, so here's a
summary:

- `src/common/sockets.h:Sockets` contains all sockets on both the plugin
  and the Wine host side, and is used to both listen on and connect to
  the sockets.
- Sockets and other temporary files respect `$XDG_RUNTIME_DIR` instead
  of being dumped in `/tmp`.
- All sockets now have a unique endpoint in
  `/run/user/<uid>/yabridge-<plugin_name>-<random_id>/`. This is
  important for when we want to have multiple socket connections for
  handling `dispatch()` and `audioMaster()`.
- Because of the above, we no longer clean up the socket endpoint files
  after the connection gets established during initialization. Instead
  we'll remove the socket base directory when shutting down.
2020-10-25 21:24:56 +01:00
Robbert van der Helm 8198a73742 Add support for double precision audio #34
So far I've only seen REAPER running iZotope Rx plugins utilize this.
2020-08-24 16:13:29 +02:00
Robbert van der Helm 6073d812a5 Clarify the issue in REAPER
It's caused by mutual recursion which at the moment does not work with
yabridge's communication model.
2020-08-21 16:43:49 +02:00
Robbert van der Helm b452f961db Add option to work around bugs in REAPER/Renoise
This is not ideal since it requires the user to know about this option
and to create a config file, but I think it's the best we can do without
compromising on yabridge's transparency and 'zero hacks' philosophy.

See #29 and #32.
2020-08-17 15:49:16 +02:00
Robbert van der Helm becb73928e Add a limit to all Win32 message loops #28
This works around Waves plugins causing an infinite message loop. Since
we run the loop 30 times per second anyways splitting the loop up into
chunks of 20 shouldn't be an issue.
2020-08-14 11:36:55 +02:00
Robbert van der Helm b1dd301a98 Add an optional double editor embedding mode #27
This sounds like it would the simplest way to work around the issue of
E27 calculating its own coordinates based on the parent window's
coordinates. I have not noticed any weird issues with having this
enabled all the time, but less moving parts is always better so it's
still behind an option.
2020-07-23 16:56:10 +02:00
Robbert van der Helm 523f77d334 Use designated initializers for complex structs
This was one of the main reasons why I wanted to switch to C++20, I just
forgot to do it.
2020-07-23 14:12:07 +02:00
Robbert van der Helm cd02ab5fc9 Send the configuration from plugin to Wine host
Next we can add some options for different plugin editor behaviours for #27.
2020-07-22 17:15:55 +02:00
Robbert van der Helm 6f772ca899 Send the AEffect object over a new control socket
We'll use the same socket to send the configuration data back to the
plugin.
2020-07-22 13:36:29 +02:00
Robbert van der Helm f5f6f04016 Rearrange the try-catch in the thread handlers
It's a bit clearer this way. I would prefer using jthreads here, but we
would still need this try-catch block since there's no way to cancel
synchronous Boost.Asio socket operations other than closing the socket.
2020-06-20 15:47:30 +02:00
Robbert van der Helm 8202a6b250 Add missing const qualifiers to member functions 2020-06-06 13:44:26 +02:00
Robbert van der Helm 33777d2876 Use same style for optional and avoid double check
I did not know that `std::optional::value()` did checked access. And I
still prefer a more explicit .has_value() over boolean conversion, but
this seems to be the accepted way to do this.
2020-06-05 22:35:56 +02:00
Robbert van der Helm ff298f3f46 Remove redundant conditions
As mentioned in C++ Core Guidelines ES.87.
2020-06-05 22:18:40 +02:00
Robbert van der Helm 890e5b736b Revert "Work around a memory corruption issue on unload"
This reverts commit 0c047f9a66.

This workaround was needed because of the weird threading behavior with
the Win32 APIs, std::thread and winelib. Now that the actual
`active_plugins.erase()` call is done from within the plugin
context/main thread, this hack is no longer needed.
2020-05-29 11:24:56 +02:00
Robbert van der Helm 06de49ded2 Unify event handling behavior for all cases
This makes the individual plugin host slightly more complex, but now
both individually hosted plugins and plugin groups handle both
dispatcher events and GUI events in the exact same way.
2020-05-28 13:53:25 +02:00
Robbert van der Helm 706b34eeb4 Rearrange order of Win32 and X11 event handling
Should not matter that much, but a potential situation where you would
want to have handled the X11 events first is when the editor enters a
blocking message loop while it is waiting on a GUI component just as the
window gets moved by an external program or window manager.
2020-05-27 15:44:14 +02:00
Robbert van der Helm 5a0c3c4627 Simplify the opening editor behaviour again
This partially reverts 16fce5577d.
2020-05-27 14:05:57 +02:00
Robbert van der Helm 0c047f9a66 Work around a memory corruption issue on unload
I'm really not sure what is happening here, and it might just be a
winelib thing.
2020-05-26 17:09:09 +02:00
Robbert van der Helm 198807a15a Run events async and centralized for group hosts
At a 30 fps rate with a limit on the number of window messages per
frame. This is somehow needed for Melda plugins, as they otherwise
dispatch tiemr messages indefinitely after opening a second editor with
seemingly no way around it.

With this and some refactoring #15 should be almost done.
2020-05-26 12:13:37 +02:00
Robbert van der Helm 16fce5577d Skip the message loop when an editor is opening
This is a bit more restrictive than the old approach that only skipped
when `effEditOpen()` got called after `effEditGetRect()`. Not sure why
the Melda plugins block indefinitely on the message loop without this
now.
2020-05-26 11:12:36 +02:00
Robbert van der Helm 9a35023990 Split X11 and Win32 event handling
X11 events should always be handled since it's thread safe and they
don't block.
2020-05-26 11:11:34 +02:00
Robbert van der Helm 23f15c8d8a Rename the two handle_dispatch functions
To better differentiate between their intended uses.
2020-05-25 15:10:19 +02:00