mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-09 20:29:10 +02:00
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:
@@ -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)};
|
||||||
|
|||||||
Reference in New Issue
Block a user