Handle all IPlugView functions from the GUI thread

Melda plugins will freeze if GetSize wasn't called from the GUI thread
before.
This commit is contained in:
Robbert van der Helm
2021-01-07 22:42:31 +01:00
parent 25af73c86e
commit c375441971
+32 -13
View File
@@ -585,9 +585,15 @@ void Vst3Bridge::run() {
.get(); .get();
}, },
[&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response { [&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response {
// Melda plugins will refuse to open dialogs of this function is
// not run from the GUI thread
const tresult result = const tresult result =
object_instances[request.owner_instance_id] do_mutual_recursion_or_handle_in_main_context<tresult>(
.plug_view_instance->plug_view->getSize(&request.size); [&]() {
return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->getSize(
&request.size);
});
return YaPlugView::GetSizeResponse{ return YaPlugView::GetSizeResponse{
.result = result, .updated_size = std::move(request.size)}; .result = result, .updated_size = std::move(request.size)};
@@ -629,24 +635,37 @@ void Vst3Bridge::run() {
Steinberg::owned(new Vst3PlugFrameProxyImpl( Steinberg::owned(new Vst3PlugFrameProxyImpl(
*this, std::move(request.plug_frame_args))); *this, std::move(request.plug_frame_args)));
// TODO: Does this have to be run from the UI thread? Figure out // This likely doesn't have to be run from the GUI thread, but
// if it does // since 80% of the `IPlugView` functions have to be we'll do it
return object_instances[request.owner_instance_id] // here anyways
.plug_view_instance->plug_view->setFrame( return main_context
object_instances[request.owner_instance_id] .run_in_context<tresult>([&]() {
.plug_frame_proxy); return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->setFrame(
object_instances[request.owner_instance_id]
.plug_frame_proxy);
})
.get();
}, },
[&](YaPlugView::CanResize& request) [&](YaPlugView::CanResize& request)
-> YaPlugView::CanResize::Response { -> YaPlugView::CanResize::Response {
return object_instances[request.owner_instance_id] // To prevent weird behaviour we'll perform all size related
.plug_view_instance->plug_view->canResize(); // functions from the GUI thread, including this one
return do_mutual_recursion_or_handle_in_main_context<tresult>(
[&]() {
return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view->canResize();
});
}, },
[&](YaPlugView::CheckSizeConstraint& request) [&](YaPlugView::CheckSizeConstraint& request)
-> YaPlugView::CheckSizeConstraint::Response { -> YaPlugView::CheckSizeConstraint::Response {
const tresult result = const tresult result =
object_instances[request.owner_instance_id] do_mutual_recursion_or_handle_in_main_context<tresult>(
.plug_view_instance->plug_view->checkSizeConstraint( [&]() {
&request.rect); return object_instances[request.owner_instance_id]
.plug_view_instance->plug_view
->checkSizeConstraint(&request.rect);
});
return YaPlugView::CheckSizeConstraintResponse{ return YaPlugView::CheckSizeConstraintResponse{
.result = result, .updated_rect = std::move(request.rect)}; .result = result, .updated_rect = std::move(request.rect)};