Commit Graph

328 Commits

Author SHA1 Message Date
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 eb8d4ae1d8 Fix Win32Thread not capturing by move
std::function does not allow non-movable lambdas, so capturing by move
doesn't work there. And the old solution of course has issues with
dangling pointers (but because this is C++ the compiler still thinks
it's A-Ok).
2020-10-27 22:53:59 +01:00
Robbert van der Helm 28886e7073 Replace all threads with Win32Thread in Wine host 2020-10-27 18:29:38 +01:00
Robbert van der Helm bafc36614b Properly forward arguments in Win32Thread 2020-10-27 18:28:23 +01:00
Robbert van der Helm a6b5951d81 Replace std::jthread with Win32Thread everywhere 2020-10-27 17:38:13 +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 1681ec9767 Add support for lambdas to Win32Thread 2020-10-27 17:04:40 +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 5b00ddb0c4 Fall back to waiting when socket is not yet ready
This can happen with plugin groups.
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 523ac64d11 Add a missing lock to reading from active_plugins
I've never seen this cause memory errors, but there exist a rare
situation where it could.
2020-10-26 12:45:38 +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 a1e7142f17 Mark max_win32_messages as [[maybe_unused]]
ccls/clangd doesn't know that it's being used elsewhere.
2020-10-25 13:00:50 +01:00
Robbert van der Helm 3facdf532a Fix fake dropdown menus in TDR plugins
These would close immediately when hovering over them with the new focus
grabbing method.
2020-10-19 14:34:52 +02:00
Robbert van der Helm 150845a301 Fix editor_double_embed causing X11 errors
Since the error codes were not before version 1.7.0 we just didn't
notice this, even though everything still appeared to work fine.
2020-10-14 16:36:48 +02:00
Robbert van der Helm 95ad6fc36a Work around reparenting issues in #40
I'm still really curious why this double reparent would be needed
though. Everything works fine on any other i3 config I've tried, and
even the exact same config in a VM works fine for me.
2020-10-12 14:28:29 +02:00
Robbert van der Helm 225d6a000e Add a fallback for non-EWMH compliant WMs
I'm not sure how many people use WMs that don't implement
`_NET_ACTIVE_WINDOW`, but at least this will give those people some way
to grab input focus, even if it's not as good as the new method.
2020-10-09 14:35:43 +02:00
Robbert van der Helm 6ff61b1904 Rewrite how input focus grabbing works #38 2020-10-08 19:34:26 +02:00
Robbert van der Helm 36d39bfca9 Add missing free() calls for xcb 2020-10-08 17:03:03 +02:00
Robbert van der Helm 60c4e64b9b Add xcb error assertions instead of segfaulting
These things should not fail (and I've never seen one of these thing
error out with yabridge), but in the case they do an assertion is at
least a lot trace down than a segfault.
2020-10-08 16:17:00 +02:00
Robbert van der Helm e680f2eddd Made the input focus grabbing even more aggressive
This fixes keyboard focus not returning when closing dialogs in Melda
plugins. I'll have to do some more testing to see if this does not
introduce any unwanted side effects.
2020-10-08 15:51:20 +02:00
Robbert van der Helm 8ae9c4d263 Made input focus grabbing more aggressive #38
This fixes keyboard input in REAPER, and I haven't found any downsides
to this approach yet.
2020-09-30 17:30:38 +02: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 6f5dae90a6 Set realtime priorities if available
This significantly reduces the latency with no real drawbacks from what
I've noticed. Wineserver is still run using the normal scheduling
policies because from my testing running that with realtime priority
that can actually increase latencies, although doing so will greatly
reduce the variance in processing time.
2020-07-23 19:57:50 +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 e55248cdd3 Mention Melda GPU accelerated rendering issues
There are no issues with software rendering.
2020-07-05 22:11:39 +02:00
Robbert van der Helm bdfd15eaa9 Mention rendering quirks with Melda plugins 2020-07-04 19:30:41 +02:00
Robbert van der Helm d0285edb14 Fix typo in coordinate translation 2020-07-04 19:09:12 +02:00
Robbert van der Helm 1e6188d774 Check the return value from pipe(2)
Starting from GCC 10 not checking this will produce a warning.
2020-06-20 18:43:36 +02:00
Robbert van der Helm f7201a9194 Remove old todo 2020-06-20 18:04:00 +02:00
Robbert van der Helm 61cde0bd43 Use std::jthread 2020-06-20 16:16:12 +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 4403585a70 Use the new C++20 starts_with() and contains() 2020-06-06 13:44:26 +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 957da62137 Add missing type qualifiers 2020-06-06 13:44:23 +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 b379708b21 Encapsulate individual/group handling differences
This cleans up the PluginBridge significantly by getting rid of all
fields and handling that was only needed for connecting to plugin
groups. This was also the last thing I wanted to refactor before
releasing the plugin groups feature with yabridge 1.2.
2020-05-29 18:08:44 +02:00
Robbert van der Helm 1746fce7e3 Clarify group host plugin removal process better 2020-05-29 11:28:19 +02:00