|
|
@@ -2489,20 +2489,26 @@ struct dpf_edit_controller : v3_edit_controller_cpp { |
|
|
|
// cached values |
|
|
|
v3_component_handler** handler; |
|
|
|
v3_host_application** const hostContextFromFactory; |
|
|
|
v3_host_application** hostContextFromComponent; |
|
|
|
v3_host_application** hostContextFromInitialize; |
|
|
|
|
|
|
|
dpf_edit_controller(ScopedPointer<PluginVst3>& v, v3_host_application** const h) |
|
|
|
dpf_edit_controller(ScopedPointer<PluginVst3>& v, v3_host_application** const hf, v3_host_application** const hc) |
|
|
|
: refcounter(1), |
|
|
|
vst3(v), |
|
|
|
initialized(false), |
|
|
|
handler(nullptr), |
|
|
|
hostContextFromFactory(h), |
|
|
|
hostContextFromFactory(hf), |
|
|
|
hostContextFromComponent(hc), |
|
|
|
hostContextFromInitialize(nullptr) |
|
|
|
{ |
|
|
|
// v3_funknown, single instance |
|
|
|
// make sure context is valid through this controller lifetime |
|
|
|
if (hostContextFromComponent != nullptr) |
|
|
|
v3_cpp_obj_ref(hostContextFromComponent); |
|
|
|
|
|
|
|
// v3_funknown, everything custom |
|
|
|
query_interface = query_interface_edit_controller; |
|
|
|
ref = dpf_single_instance_ref<dpf_edit_controller>; |
|
|
|
unref = dpf_single_instance_unref<dpf_edit_controller>; |
|
|
|
ref = ref_edit_controller; |
|
|
|
unref = unref_edit_controller; |
|
|
|
|
|
|
|
// v3_plugin_base |
|
|
|
base.initialize = initialize; |
|
|
@@ -2524,6 +2530,15 @@ struct dpf_edit_controller : v3_edit_controller_cpp { |
|
|
|
ctrl.create_view = create_view; |
|
|
|
} |
|
|
|
|
|
|
|
void cleanup() |
|
|
|
{ |
|
|
|
if (hostContextFromComponent != nullptr) |
|
|
|
{ |
|
|
|
v3_cpp_obj_unref(hostContextFromComponent); |
|
|
|
hostContextFromComponent = nullptr; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
|
// v3_funknown |
|
|
|
|
|
|
@@ -2577,6 +2592,26 @@ struct dpf_edit_controller : v3_edit_controller_cpp { |
|
|
|
return V3_NO_INTERFACE; |
|
|
|
} |
|
|
|
|
|
|
|
static uint32_t V3_API ref_edit_controller(void* self) |
|
|
|
{ |
|
|
|
return ++(*(dpf_edit_controller**)self)->refcounter; |
|
|
|
} |
|
|
|
|
|
|
|
static uint32_t V3_API unref_edit_controller(void* self) |
|
|
|
{ |
|
|
|
dpf_edit_controller** const controllerptr = (dpf_edit_controller**)self; |
|
|
|
dpf_edit_controller* const controller = *controllerptr; |
|
|
|
|
|
|
|
if (const int refcount = --controller->refcounter) |
|
|
|
{ |
|
|
|
d_stdout("dpf_edit_controller::unref => %p | refcount %i", self, refcount); |
|
|
|
return refcount; |
|
|
|
} |
|
|
|
|
|
|
|
controller->cleanup(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|
// ---------------------------------------------------------------------------------------------------------------- |
|
|
|
// v3_plugin_base |
|
|
|
|
|
|
@@ -2804,6 +2839,8 @@ struct dpf_edit_controller : v3_edit_controller_cpp { |
|
|
|
// we require a host context for message creation |
|
|
|
v3_host_application** host = controller->hostContextFromInitialize != nullptr |
|
|
|
? controller->hostContextFromInitialize |
|
|
|
: controller->hostContextFromComponent != nullptr |
|
|
|
? controller->hostContextFromComponent |
|
|
|
: controller->hostContextFromFactory; |
|
|
|
DISTRHO_SAFE_ASSERT_RETURN(host != nullptr, nullptr); |
|
|
|
|
|
|
@@ -3140,7 +3177,11 @@ struct dpf_component : v3_component_cpp { |
|
|
|
#if DISTRHO_PLUGIN_HAS_UI |
|
|
|
connection = nullptr; |
|
|
|
#endif |
|
|
|
controller = nullptr; |
|
|
|
if (controller != nullptr) |
|
|
|
{ |
|
|
|
controller->cleanup(); |
|
|
|
controller = nullptr; |
|
|
|
} |
|
|
|
|
|
|
|
if (hostContextFromFactory != nullptr) |
|
|
|
v3_cpp_obj_unref(hostContextFromFactory); |
|
|
@@ -3199,7 +3240,8 @@ struct dpf_component : v3_component_cpp { |
|
|
|
{ |
|
|
|
if (component->controller == nullptr) |
|
|
|
component->controller = new dpf_edit_controller(component->vst3, |
|
|
|
component->hostContextFromFactory); |
|
|
|
component->hostContextFromFactory, |
|
|
|
component->hostContextFromInitialize); |
|
|
|
else |
|
|
|
++component->controller->refcounter; |
|
|
|
*iface = &component->controller; |
|
|
|