Add a wrapper struct around IPlugView for casts

This commit is contained in:
Robbert van der Helm
2021-01-03 23:43:51 +01:00
parent ace0d789d3
commit 52d4fe2f08
2 changed files with 54 additions and 21 deletions
+34 -20
View File
@@ -25,6 +25,12 @@
#include "vst3-impls/host-context-proxy.h" #include "vst3-impls/host-context-proxy.h"
#include "vst3-impls/plug-frame-proxy.h" #include "vst3-impls/plug-frame-proxy.h"
InstancePlugView::InstancePlugView() {}
InstancePlugView::InstancePlugView(
Steinberg::IPtr<Steinberg::IPlugView> plug_view)
: plug_view(plug_view), parameter_finder(plug_view) {}
InstanceInterfaces::InstanceInterfaces() {} InstanceInterfaces::InstanceInterfaces() {}
InstanceInterfaces::InstanceInterfaces( InstanceInterfaces::InstanceInterfaces(
@@ -84,7 +90,7 @@ void Vst3Bridge::run() {
// proxy object it may have received in // proxy object it may have received in
// `IPlugView::setFrame()`. // `IPlugView::setFrame()`.
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_view.reset(); .plug_view_instance.reset();
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_frame_proxy.reset(); .plug_frame_proxy.reset();
}) })
@@ -336,11 +342,11 @@ void Vst3Bridge::run() {
// Instantiate the object from the GUI thread // Instantiate the object from the GUI thread
main_context main_context
.run_in_context<void>([&]() { .run_in_context<void>([&]() {
object_instances[request.instance_id].plug_view = object_instances[request.instance_id]
Steinberg::owned( .plug_view_instance.emplace(Steinberg::owned(
object_instances[request.instance_id] object_instances[request.instance_id]
.edit_controller->createView( .edit_controller->createView(
request.name.c_str())); request.name.c_str())));
}) })
.wait(); .wait();
@@ -348,11 +354,12 @@ void Vst3Bridge::run() {
// `IPlugView` object // `IPlugView` object
return YaEditController::CreateViewResponse{ return YaEditController::CreateViewResponse{
.plug_view_args = .plug_view_args =
(object_instances[request.instance_id].plug_view (object_instances[request.instance_id]
.plug_view_instance
? std::make_optional< ? std::make_optional<
Vst3PlugViewProxy::ConstructArgs>( Vst3PlugViewProxy::ConstructArgs>(
object_instances[request.instance_id] object_instances[request.instance_id]
.plug_view, .plug_view_instance->plug_view,
request.instance_id) request.instance_id)
: std::nullopt)}; : std::nullopt)};
}, },
@@ -453,7 +460,8 @@ void Vst3Bridge::run() {
: request.type; : request.type;
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->isPlatformTypeSupported(type.c_str()); .plug_view_instance->plug_view->isPlatformTypeSupported(
type.c_str());
}, },
[&](const YaPlugView::Attached& request) [&](const YaPlugView::Attached& request)
-> YaPlugView::Attached::Response { -> YaPlugView::Attached::Response {
@@ -481,7 +489,7 @@ void Vst3Bridge::run() {
const tresult result = const tresult result =
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_view->attached( .plug_view_instance->plug_view->attached(
editor_instance.get_win32_handle(), editor_instance.get_win32_handle(),
type.c_str()); type.c_str());
@@ -502,7 +510,7 @@ void Vst3Bridge::run() {
.run_in_context<tresult>([&]() { .run_in_context<tresult>([&]() {
const tresult result = const tresult result =
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_view->removed(); .plug_view_instance->plug_view->removed();
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.editor.reset(); .editor.reset();
@@ -518,7 +526,8 @@ void Vst3Bridge::run() {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context<tresult>([&]() {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->onWheel(request.distance); .plug_view_instance->plug_view->onWheel(
request.distance);
}) })
.get(); .get();
}, },
@@ -527,8 +536,9 @@ void Vst3Bridge::run() {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context<tresult>([&]() {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->onKeyDown(request.key, request.key_code, .plug_view_instance->plug_view->onKeyDown(
request.modifiers); request.key, request.key_code,
request.modifiers);
}) })
.get(); .get();
}, },
@@ -537,15 +547,16 @@ void Vst3Bridge::run() {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context<tresult>([&]() {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->onKeyUp(request.key, request.key_code, .plug_view_instance->plug_view->onKeyUp(
request.modifiers); request.key, request.key_code,
request.modifiers);
}) })
.get(); .get();
}, },
[&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response { [&](YaPlugView::GetSize& request) -> YaPlugView::GetSize::Response {
const tresult result = const tresult result =
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_view->getSize(&request.size); .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)};
@@ -563,7 +574,8 @@ void Vst3Bridge::run() {
return do_mutual_recursion_or_handle_in_main_context<tresult>( return do_mutual_recursion_or_handle_in_main_context<tresult>(
[&]() { [&]() {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->onSize(&request.new_size); .plug_view_instance->plug_view->onSize(
&request.new_size);
}); });
}, },
[&](const YaPlugView::OnFocus& request) [&](const YaPlugView::OnFocus& request)
@@ -571,7 +583,8 @@ void Vst3Bridge::run() {
return main_context return main_context
.run_in_context<tresult>([&]() { .run_in_context<tresult>([&]() {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->onFocus(request.state); .plug_view_instance->plug_view->onFocus(
request.state);
}) })
.get(); .get();
}, },
@@ -588,20 +601,21 @@ void Vst3Bridge::run() {
// TODO: Does this have to be run from the UI thread? Figure out // TODO: Does this have to be run from the UI thread? Figure out
// if it does // if it does
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->setFrame( .plug_view_instance->plug_view->setFrame(
object_instances[request.owner_instance_id] object_instances[request.owner_instance_id]
.plug_frame_proxy); .plug_frame_proxy);
}, },
[&](YaPlugView::CanResize& request) [&](YaPlugView::CanResize& request)
-> YaPlugView::CanResize::Response { -> YaPlugView::CanResize::Response {
return object_instances[request.owner_instance_id] return object_instances[request.owner_instance_id]
.plug_view->canResize(); .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] object_instances[request.owner_instance_id]
.plug_view->checkSizeConstraint(&request.rect); .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)};
+20 -1
View File
@@ -26,6 +26,25 @@
#include "../editor.h" #include "../editor.h"
#include "common.h" #include "common.h"
/**
* A holder for an object instance's `IPlugView` object and all smart pointers
* casted from it.
*
* @relates InstanceInterfaces
*/
struct InstancePlugView {
InstancePlugView();
InstancePlugView(Steinberg::IPtr<Steinberg::IPlugView> plug_View);
Steinberg::IPtr<Steinberg::IPlugView> plug_view;
// All smart pointers below are created from `plug_view`. They will be null
// pointers if `plug_view` did not implement the interface.
Steinberg::FUnknownPtr<Steinberg::Vst::IParameterFinder> parameter_finder;
};
/** /**
* A holder for plugin object instance created from the factory. This stores all * A holder for plugin object instance created from the factory. This stores all
* relevant interface smart pointers to that object so we can handle control * relevant interface smart pointers to that object so we can handle control
@@ -98,7 +117,7 @@ struct InstanceInterfaces {
* multiple different view for a single plugin. This is not used within * multiple different view for a single plugin. This is not used within
* the SDK, so a single pointer should be fine for now. * the SDK, so a single pointer should be fine for now.
*/ */
Steinberg::IPtr<Steinberg::IPlugView> plug_view; std::optional<InstancePlugView> plug_view_instance;
/** /**
* This instance's editor, if it has an open editor. Embedding here works * This instance's editor, if it has an open editor. Embedding here works