mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-10 04:30:12 +02:00
Handle connection point proxy from GUI thread
FabFilter plugins will exchange messages that have to be handled from the GUI thread, or they'll get stuck waiting on a synchronisation object. This probably hurts GUI performance significantly but luckily it only affects Ardour.
This commit is contained in:
@@ -52,7 +52,11 @@ Vst3ConnectionPointProxyImpl::disconnect(IConnectionPoint* /*other*/) {
|
|||||||
tresult PLUGIN_API
|
tresult PLUGIN_API
|
||||||
Vst3ConnectionPointProxyImpl::notify(Steinberg::Vst::IMessage* message) {
|
Vst3ConnectionPointProxyImpl::notify(Steinberg::Vst::IMessage* message) {
|
||||||
if (message) {
|
if (message) {
|
||||||
return bridge.send_message(
|
// FabFilter plugins require this to be done from the GUI thread so we
|
||||||
|
// need to use our mutual recursion mechanism. Luckily only Ardour uses
|
||||||
|
// connection proxies, so if this ends up breaking something it will
|
||||||
|
// only affect Ardour.
|
||||||
|
return bridge.send_mutually_recursive_message(
|
||||||
YaConnectionPoint::Notify{.instance_id = owner_instance_id(),
|
YaConnectionPoint::Notify{.instance_id = owner_instance_id(),
|
||||||
.message_ptr = YaMessagePtr(*message)});
|
.message_ptr = YaMessagePtr(*message)});
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -280,9 +280,17 @@ void Vst3Bridge::run() {
|
|||||||
// We should thus be passing a (raw) pointer to the
|
// We should thus be passing a (raw) pointer to the
|
||||||
// original object so we can pretend none of this wrapping
|
// original object so we can pretend none of this wrapping
|
||||||
// and serializing has ever happened.
|
// and serializing has ever happened.
|
||||||
return object_instances[request.instance_id]
|
// NOTE: FabFilter plugins require some of their messages to be
|
||||||
.connection_point->notify(
|
// handled from the GUI thread. This could make the GUI
|
||||||
request.message_ptr.get_original());
|
// much slower in Ardour, but there's no other non-hacky
|
||||||
|
// solution for this (and bypassing Ardour's connection
|
||||||
|
// proxies sort of goes against the idea behind yabridge)
|
||||||
|
return do_mutual_recursion_or_handle_in_main_context<tresult>(
|
||||||
|
[&]() {
|
||||||
|
return object_instances[request.instance_id]
|
||||||
|
.connection_point->notify(
|
||||||
|
request.message_ptr.get_original());
|
||||||
|
});
|
||||||
},
|
},
|
||||||
[&](YaContextMenuTarget::ExecuteMenuItem& request)
|
[&](YaContextMenuTarget::ExecuteMenuItem& request)
|
||||||
-> YaContextMenuTarget::ExecuteMenuItem::Response {
|
-> YaContextMenuTarget::ExecuteMenuItem::Response {
|
||||||
|
|||||||
Reference in New Issue
Block a user