From 755cc6aba96bd9c401151866ef7cdd60ce7754e6 Mon Sep 17 00:00:00 2001 From: falkTX Date: Mon, 20 Dec 2021 00:21:23 +0000 Subject: [PATCH] Continue vst3 rework --- distrho/src/DistrhoPluginVST3.cpp | 370 +++++++++++++------------ distrho/src/travesty/edit_controller.h | 6 +- 2 files changed, 192 insertions(+), 184 deletions(-) diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp index 4cff1cee..585022d5 100644 --- a/distrho/src/DistrhoPluginVST3.cpp +++ b/distrho/src/DistrhoPluginVST3.cpp @@ -28,6 +28,10 @@ # define DISTRHO_PLUGIN_HAS_UI 0 #endif +// #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS && ! DISTRHO_PLUGIN_HAS_UI +# define DPF_VST3_USES_SEPARATE_CONTROLLER +// #endif + #if DISTRHO_PLUGIN_HAS_UI # include "../extra/RingBuffer.hpp" #endif @@ -916,6 +920,8 @@ public: } } + d_stdout("state restored pt1"); + if (paramCount != 0) { if (fComponentHandler != nullptr) @@ -935,6 +941,8 @@ public: #endif } + d_stdout("state restored pt2"); + return V3_OK; } @@ -1435,7 +1443,7 @@ public: # if DISTRHO_PLUGIN_WANT_PROGRAMS ++info->param_id; # endif - info->flags = V3_PARAM_CAN_AUTOMATE | V3_PARAM_IS_HIDDEN; + info->flags = V3_PARAM_CAN_AUTOMATE /*| V3_PARAM_IS_HIDDEN*/; info->step_count = 127; char ccstr[24]; snprintf(ccstr, sizeof(ccstr)-1, "MIDI Ch. %d CC %d", rindex / 130 + 1, rindex % 130); @@ -2222,15 +2230,15 @@ static uint32_t V3_API dpf_static_unref(void*) { return 0; } // v3_funknown for classes with a single instance template -static uint32_t V3_API dpf_single_instance_ref(void* self) +static uint32_t V3_API dpf_single_instance_ref(void* const self) { - return ++(*(T**)self)->refcounter; + return ++(*static_cast(self))->refcounter; } template -static uint32_t V3_API dpf_single_instance_unref(void* self) +static uint32_t V3_API dpf_single_instance_unref(void* const self) { - return --(*(T**)self)->refcounter; + return --(*static_cast(self))->refcounter; } #if DISTRHO_PLUGIN_HAS_UI @@ -2302,7 +2310,7 @@ struct dpf_dsp_connection_point : v3_connection_point_cpp { return V3_OK; } - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } @@ -2445,28 +2453,23 @@ struct dpf_midi_mapping : v3_midi_mapping_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_midi_mapping(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_midi_mapping(void* const self, const v3_tuid iid, void** const iface) { - if (v3_tuid_match(iid, v3_funknown_iid)) - { - *iface = self; - return V3_OK; - } - - if (v3_tuid_match(iid, v3_midi_mapping_iid)) + if (v3_tuid_match(iid, v3_funknown_iid) || + v3_tuid_match(iid, v3_midi_mapping_iid)) { *iface = self; return V3_OK; } - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } // ---------------------------------------------------------------------------------------------------------------- // v3_midi_mapping - static v3_result V3_API get_midi_controller_assignment(void*, int32_t bus, int16_t channel, int16_t cc, v3_param_id* id) + static v3_result V3_API get_midi_controller_assignment(void*, const int32_t bus, const int16_t channel, const int16_t cc, v3_param_id* const id) { DISTRHO_SAFE_ASSERT_INT_RETURN(bus == 0, bus, V3_FALSE); DISTRHO_SAFE_ASSERT_INT_RETURN(channel >= 0 && channel < 16, channel, V3_FALSE); @@ -2475,7 +2478,7 @@ struct dpf_midi_mapping : v3_midi_mapping_cpp { # if DISTRHO_PLUGIN_WANT_PROGRAMS static constexpr const v3_param_id offset = 1; # else - static const constexpr v3_param_id offset = 0; + static constexpr const v3_param_id offset = 0; # endif *id = offset + channel * 130 + cc; @@ -2495,29 +2498,36 @@ struct dpf_edit_controller : v3_edit_controller_cpp { ScopedPointer connectionComp; // kConnectionPointController ScopedPointer connectionBridge; // kConnectionPointBridge #endif +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + ScopedPointer vst3; +#else ScopedPointer& vst3; bool initialized; +#endif // cached values v3_component_handler** handler; - v3_host_application** const hostContextFromFactory; - v3_host_application** hostContextFromComponent; + v3_host_application** hostContextFromFactory; v3_host_application** hostContextFromInitialize; - dpf_edit_controller(ScopedPointer& v, v3_host_application** const hf, v3_host_application** const hc) +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + dpf_edit_controller(v3_host_application** const host) + : refcounter(1), + vst3(nullptr), +#else + dpf_edit_controller(ScopedPointer& v, v3_host_application** const host) : refcounter(1), vst3(v), initialized(false), +#endif handler(nullptr), - hostContextFromFactory(hf), - hostContextFromComponent(hc), + hostContextFromFactory(host), hostContextFromInitialize(nullptr) { - d_stdout("dpf_edit_controller() has contexts %p %p", - hostContextFromFactory, hostContextFromComponent); + d_stdout("dpf_edit_controller() has context %p", hostContextFromFactory); // make sure context is valid through out this controller lifetime - if (hostContextFromComponent != nullptr) - v3_cpp_obj_ref(hostContextFromComponent); + if (hostContextFromFactory != nullptr) + v3_cpp_obj_ref(hostContextFromFactory); // v3_funknown, everything custom query_interface = query_interface_edit_controller; @@ -2546,34 +2556,23 @@ struct dpf_edit_controller : v3_edit_controller_cpp { void cleanup() { - if (hostContextFromComponent != nullptr) + if (hostContextFromFactory != nullptr) { - v3_cpp_obj_unref(hostContextFromComponent); - hostContextFromComponent = nullptr; + v3_cpp_obj_unref(hostContextFromFactory); + hostContextFromFactory = nullptr; } - - d_stdout("dpf_edit_controller::cleanup() has contexts %p %p", - hostContextFromFactory, hostContextFromComponent); } // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_edit_controller(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_edit_controller(void* const self, const v3_tuid iid, void** const iface) { - if (v3_tuid_match(iid, v3_funknown_iid)) - { - *iface = self; - return V3_OK; - } - - if (v3_tuid_match(iid, v3_plugin_base_iid)) - { - *iface = self; - return V3_OK; - } + d_stdout("query_interface_edit_controller => %p %s %p", self, tuid2str(iid), iface); - if (v3_tuid_match(iid, v3_edit_controller_iid)) + if (v3_tuid_match(iid, v3_funknown_iid) || + v3_tuid_match(iid, v3_plugin_base_iid) || + v3_tuid_match(iid, v3_edit_controller_iid)) { *iface = self; return V3_OK; @@ -2589,12 +2588,11 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } #endif - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NO_INTERFACE); - #if DISTRHO_PLUGIN_HAS_UI if (v3_tuid_match(iid, v3_connection_point_iid)) { + dpf_edit_controller* const controller = *static_cast(self); + if (controller->connectionComp == nullptr) controller->connectionComp = new dpf_dsp_connection_point(kConnectionPointController, controller->vst3); @@ -2605,19 +2603,21 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } #endif - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } - static uint32_t V3_API ref_edit_controller(void* self) + static uint32_t V3_API ref_edit_controller(void* const self) { - d_stdout("dpf_edit_controller::ref => %p", self); - return ++(*(dpf_edit_controller**)self)->refcounter; + dpf_edit_controller* const controller = *static_cast(self); + const int refcount = ++controller->refcounter; + d_stdout("dpf_edit_controller::ref => %p | refcount %i", self, refcount); + return refcount; } - static uint32_t V3_API unref_edit_controller(void* self) + static uint32_t V3_API unref_edit_controller(void* const self) { - dpf_edit_controller** const controllerptr = (dpf_edit_controller**)self; + dpf_edit_controller** const controllerptr = static_cast(self); dpf_edit_controller* const controller = *controllerptr; if (const int refcount = --controller->refcounter) @@ -2626,45 +2626,69 @@ struct dpf_edit_controller : v3_edit_controller_cpp { return refcount; } +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + d_stdout("dpf_edit_controller::unref => %p | refcount is zero, deleting everything now!", self); + controller->cleanup(); + delete controller; + delete controllerptr; +#else d_stdout("dpf_edit_controller::unref => %p is zero, doing cleanup", self); controller->cleanup(); +#endif return 0; } // ---------------------------------------------------------------------------------------------------------------- // v3_plugin_base - static v3_result V3_API initialize(void* self, v3_plugin_base::v3_funknown** context) + static v3_result V3_API initialize(void* const self, v3_plugin_base::v3_funknown** const context) { - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); - const bool initialized = controller->initialized; - DISTRHO_SAFE_ASSERT_RETURN(! initialized, V3_INVALID_ARG); +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + DISTRHO_SAFE_ASSERT_RETURN(controller->vst3 == nullptr, V3_INVALID_ARG); +#else + DISTRHO_SAFE_ASSERT_RETURN(! controller->initialized, V3_INVALID_ARG); +#endif // query for host context v3_host_application** host = nullptr; - v3_cpp_obj_query_interface(context, v3_host_application_iid, &host); + if (context != nullptr) + v3_cpp_obj_query_interface(context, v3_host_application_iid, &host); d_stdout("dpf_edit_controller::initialize => %p %p | host %p", self, context, host); // save it for later so we can unref it controller->hostContextFromInitialize = host; +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + // provide the factory context to the plugin if this new one is missing + if (host == nullptr) + host = controller->hostContextFromFactory; + + controller->vst3 = new PluginVst3(host); +#else controller->initialized = true; +#endif + return V3_OK; } static v3_result V3_API terminate(void* self) { d_stdout("dpf_edit_controller::terminate => %p", self); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + DISTRHO_SAFE_ASSERT_RETURN(controller->vst3 != nullptr, V3_INVALID_ARG); + + controller->vst3 = nullptr; +#else const bool initialized = controller->initialized; DISTRHO_SAFE_ASSERT_RETURN(initialized, V3_INVALID_ARG); controller->initialized = false; +#endif #if DISTRHO_PLUGIN_HAS_UI // take the chance to do some cleanup if possible (we created the bridge, we need to destroy it) @@ -2677,6 +2701,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { controller->connectionComp = nullptr; #endif + // unref context received during initialize if (controller->hostContextFromInitialize != nullptr) { v3_cpp_obj_unref(controller->hostContextFromInitialize); @@ -2689,58 +2714,53 @@ struct dpf_edit_controller : v3_edit_controller_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_edit_controller - static v3_result V3_API set_component_state(void* self, v3_bstream* stream) + static v3_result V3_API set_component_state(void* const self, v3_bstream** const stream) { d_stdout("dpf_edit_controller::set_component_state => %p %p", self, stream); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); -#if 0 - return vst3->setComponentState(stream); -#endif - - // TODO, returning ok to make renoise happy + return vst3->setState(stream); +#else return V3_OK; +#endif } - static v3_result V3_API set_state(void* self, v3_bstream* stream) + static v3_result V3_API set_state(void* const self, v3_bstream** const stream) { - d_stdout("dpf_edit_controller::set_state => %p %p", self, stream); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); - - PluginVst3* const vst3 = controller->vst3; - DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_edit_controller::set_state => %p %p", self, stream); + dpf_edit_controller* const controller = *static_cast(self); -#if 0 - return vst3->setState(stream); +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + DISTRHO_SAFE_ASSERT_RETURN(controller->vst3 != nullptr, V3_NOT_INITIALIZED); +#else + DISTRHO_SAFE_ASSERT_RETURN(controller->initialized, V3_INVALID_ARG); #endif + return V3_NOT_IMPLEMENTED; } - static v3_result V3_API get_state(void* self, v3_bstream* stream) + static v3_result V3_API get_state(void* const self, v3_bstream** const stream) { - d_stdout("dpf_edit_controller::get_state => %p %p", self, stream); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_edit_controller::get_state => %p %p", self, stream); + dpf_edit_controller* const controller = *static_cast(self); - PluginVst3* const vst3 = controller->vst3; - DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); - -#if 0 - return vst3->getState(stream); +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER + DISTRHO_SAFE_ASSERT_RETURN(controller->vst3 != nullptr, V3_NOT_INITIALIZED); +#else + DISTRHO_SAFE_ASSERT_RETURN(controller->initialized, V3_INVALID_ARG); #endif + return V3_NOT_IMPLEMENTED; } static int32_t V3_API get_parameter_count(void* self) { // d_stdout("dpf_edit_controller::get_parameter_count => %p", self); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2751,8 +2771,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API get_parameter_info(void* self, int32_t param_idx, v3_param_info* param_info) { // d_stdout("dpf_edit_controller::get_parameter_info => %p %i", self, param_idx); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2764,8 +2783,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { { // NOTE very noisy, called many times // d_stdout("dpf_edit_controller::get_parameter_string_for_value => %p %u %f %p", self, index, normalised, output); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2776,8 +2794,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API get_parameter_value_for_string(void* self, v3_param_id index, int16_t* input, double* output) { d_stdout("dpf_edit_controller::get_parameter_value_for_string => %p %u %p %p", self, index, input, output); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2788,8 +2805,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static double V3_API normalised_parameter_to_plain(void* self, v3_param_id index, double normalised) { d_stdout("dpf_edit_controller::normalised_parameter_to_plain => %p %u %f", self, index, normalised); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2800,8 +2816,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static double V3_API plain_parameter_to_normalised(void* self, v3_param_id index, double plain) { d_stdout("dpf_edit_controller::plain_parameter_to_normalised => %p %u %f", self, index, plain); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2811,8 +2826,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static double V3_API get_parameter_normalised(void* self, v3_param_id index) { - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, 0.0); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, 0.0); @@ -2822,8 +2836,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API set_parameter_normalised(void* self, v3_param_id index, double normalised) { - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -2834,8 +2847,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API set_component_handler(void* self, v3_component_handler** handler) { d_stdout("dpf_edit_controller::set_component_handler => %p %p", self, handler); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); + dpf_edit_controller* const controller = *static_cast(self); controller->handler = handler; @@ -2848,28 +2860,24 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_plugin_view** V3_API create_view(void* self, const char* name) { d_stdout("dpf_edit_controller::create_view => %p %s", self, name); - dpf_edit_controller* const controller = *(dpf_edit_controller**)self; - DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, nullptr); + dpf_edit_controller* const controller = *static_cast(self); d_stdout("create_view has contexts %p %p", - controller->hostContextFromFactory, controller->hostContextFromComponent); + controller->hostContextFromFactory, controller->hostContextFromInitialize); #if DISTRHO_PLUGIN_HAS_UI // plugin must be initialized PluginVst3* const vst3 = controller->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, nullptr); - d_stdout("dpf_edit_controller::create_view => %p %s | edit-ctrl %p, host %p, factory %p", + d_stdout("dpf_edit_controller::create_view => %p %s | edit-ctrl %p, factory %p", self, name, controller->hostContextFromInitialize, - controller->hostContextFromComponent, controller->hostContextFromFactory); // 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); @@ -2957,7 +2965,7 @@ struct dpf_process_context_requirements : v3_process_context_requirements_cpp { return V3_OK; } - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } @@ -3030,7 +3038,7 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return V3_OK; } - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } @@ -3187,6 +3195,7 @@ struct dpf_component : v3_component_cpp { void cleanup() { + d_stdout("dpf_component::cleanup"); vst3 = nullptr; processor = nullptr; #if DISTRHO_PLUGIN_HAS_UI @@ -3217,6 +3226,16 @@ struct dpf_component : v3_component_cpp { return V3_OK; } +#if DISTRHO_PLUGIN_WANT_MIDI_INPUT + if (v3_tuid_match(iid, v3_midi_mapping_iid)) + { + static dpf_midi_mapping midi_mapping; + static dpf_midi_mapping* midi_mapping_ptr = &midi_mapping; + *iface = &midi_mapping_ptr; + return V3_OK; + } +#endif + /* dpf_component* const component = *static_cast(self); @@ -3245,13 +3264,10 @@ struct dpf_component : v3_component_cpp { if (v3_tuid_match(iid, v3_edit_controller_iid)) { - d_stdout("query_interface_component called with contexts %p %p", - component->hostContextFromFactory, component->hostContextFromInitialize); + d_stdout("query_interface_component called with context %p", component->hostContextFromFactory); if (component->controller == nullptr) - component->controller = new dpf_edit_controller(component->vst3, - component->hostContextFromFactory, - component->hostContextFromInitialize); + component->controller = new dpf_edit_controller(component->vst3, component->hostContextFromFactory); else ++component->controller->refcounter; *iface = &component->controller; @@ -3259,7 +3275,7 @@ struct dpf_component : v3_component_cpp { } */ - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } @@ -3650,8 +3666,10 @@ struct dpf_factory : v3_plugin_factory_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_factory(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_factory(void* const self, const v3_tuid iid, void** const iface) { + d_stdout("query_interface_factory => %p %s %p", self, tuid2str(iid), iface); + if (v3_tuid_match(iid, v3_funknown_iid) || v3_tuid_match(iid, v3_plugin_factory_iid) || v3_tuid_match(iid, v3_plugin_factory_2_iid) || @@ -3661,7 +3679,7 @@ struct dpf_factory : v3_plugin_factory_cpp { return V3_OK; } - *iface = NULL; + *iface = nullptr; return V3_NO_INTERFACE; } @@ -3670,87 +3688,87 @@ struct dpf_factory : v3_plugin_factory_cpp { static v3_result V3_API get_factory_info(void*, v3_factory_info* const info) { + d_stdout("dpf_factory::get_factory_info => %p", info); std::memset(info, 0, sizeof(*info)); + + info->flags = 0x10; DISTRHO_NAMESPACE::strncpy(info->vendor, getPluginInfo().getMaker(), ARRAY_SIZE(info->vendor)); DISTRHO_NAMESPACE::strncpy(info->url, getPluginInfo().getHomePage(), ARRAY_SIZE(info->url)); // DISTRHO_NAMESPACE::strncpy(info->email, "", ARRAY_SIZE(info->email)); // TODO - info->flags = 0x10; return V3_OK; } static int32_t V3_API num_classes(void*) { - // TODO allow to create other stuff + d_stdout("dpf_factory::num_classes"); return 1; } static v3_result V3_API get_class_info(void*, const int32_t idx, v3_class_info* const info) { + d_stdout("dpf_factory::get_class_info => %i %p", idx, info); std::memset(info, 0, sizeof(*info)); - - switch (idx) - { - case 0: - std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); - DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); - break; - // TODO create other stuff from here - default: - return V3_INVALID_ARG; - } + DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); info->cardinality = 0x7FFFFFFF; + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); return V3_OK; } - static v3_result V3_API create_instance(void* self, const v3_tuid class_id, const v3_tuid iid, void** instance) + static v3_result V3_API create_instance(void* self, const v3_tuid class_id, const v3_tuid iid, void** const instance) { d_stdout("dpf_factory::create_instance => %p %s %s %p", self, tuid2str(class_id), tuid2str(iid), instance); dpf_factory* const factory = *static_cast(self); - // TODO allow to create other stuff - DISTRHO_SAFE_ASSERT_RETURN(v3_tuid_match(class_id, *(const v3_tuid*)&dpf_tuid_class) && - v3_tuid_match(iid, v3_component_iid), V3_NO_INTERFACE); - // query for host context v3_host_application** host = nullptr; if (factory->hostContext != nullptr) v3_cpp_obj_query_interface(factory->hostContext, v3_host_application_iid, &host); - dpf_component** const componentptr = new dpf_component*; - *componentptr = new dpf_component(host); - *instance = static_cast(componentptr); - return V3_OK; + // create component + if (v3_tuid_match(class_id, *(const v3_tuid*)&dpf_tuid_class) && v3_tuid_match(iid, v3_component_iid)) + { + dpf_component** const componentptr = new dpf_component*; + *componentptr = new dpf_component(host); + *instance = static_cast(componentptr); + return V3_OK; + } + + // create edit controller + if (v3_tuid_match(class_id, *(const v3_tuid*)&dpf_tuid_controller) && v3_tuid_match(iid, v3_edit_controller_iid)) + { + dpf_edit_controller** const controllerptr = new dpf_edit_controller*; + *controllerptr = new dpf_edit_controller(host); + *instance = static_cast(controllerptr); + return V3_OK; + } + + // unsupported, roll back host application + if (host != nullptr) + v3_cpp_obj_unref(host); + + return V3_NO_INTERFACE; } // ---------------------------------------------------------------------------------------------------------------- // v3_plugin_factory_2 - static v3_result V3_API get_class_info_2(void*, int32_t idx, v3_class_info_2* info) + static v3_result V3_API get_class_info_2(void*, const int32_t idx, v3_class_info_2* const info) { + d_stdout("dpf_factory::get_class_info_2 => %i %p", idx, info); std::memset(info, 0, sizeof(*info)); - - switch (idx) - { - case 0: - std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); - DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); - break; - // TODO create other stuff from here - default: - return V3_INVALID_ARG; - } + DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); info->cardinality = 0x7FFFFFFF; - DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); - -#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS - info->class_flags = 0; -#else +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER info->class_flags = V3_DISTRIBUTABLE; #endif + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); + DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); DISTRHO_NAMESPACE::strncpy(info->vendor, getPluginInfo().getMaker(), ARRAY_SIZE(info->vendor)); DISTRHO_NAMESPACE::strncpy(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); DISTRHO_NAMESPACE::strncpy(info->sdk_version, "Travesty", ARRAY_SIZE(info->sdk_version)); @@ -3760,37 +3778,27 @@ struct dpf_factory : v3_plugin_factory_cpp { // ------------------------------------------------------------------------------------------------------------ // v3_plugin_factory_3 - static v3_result V3_API get_class_info_utf16(void*, int32_t idx, v3_class_info_3* info) + static v3_result V3_API get_class_info_utf16(void*, const int32_t idx, v3_class_info_3* const info) { + d_stdout("dpf_factory::get_class_info_utf16 => %i %p", idx, info); std::memset(info, 0, sizeof(*info)); + DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); - switch (idx) - { - case 0: - std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); - info->cardinality = 0x7FFFFFFF; - DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); - break; - // TODO create other stuff from here - default: - return V3_INVALID_ARG; - } - - DISTRHO_NAMESPACE::strncpy_utf16(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); - -#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS - info->class_flags = 0; -#else + info->cardinality = 0x7FFFFFFF; +#ifdef DPF_VST3_USES_SEPARATE_CONTROLLER info->class_flags = V3_DISTRIBUTABLE; #endif + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); DISTRHO_NAMESPACE::strncpy(info->sub_categories, getPluginCategories(), ARRAY_SIZE(info->sub_categories)); + DISTRHO_NAMESPACE::strncpy_utf16(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); DISTRHO_NAMESPACE::strncpy_utf16(info->vendor, getPluginInfo().getMaker(), ARRAY_SIZE(info->vendor)); DISTRHO_NAMESPACE::strncpy_utf16(info->version, getPluginVersion(), ARRAY_SIZE(info->version)); DISTRHO_NAMESPACE::strncpy_utf16(info->sdk_version, "Travesty", ARRAY_SIZE(info->sdk_version)); return V3_OK; } - static v3_result V3_API set_host_context(void* self, v3_funknown** context) + static v3_result V3_API set_host_context(void* const self, v3_funknown** const context) { d_stdout("dpf_factory::set_host_context => %p %p", self, context); dpf_factory* const factory = *static_cast(self); diff --git a/distrho/src/travesty/edit_controller.h b/distrho/src/travesty/edit_controller.h index 055e7d71..9edb151a 100644 --- a/distrho/src/travesty/edit_controller.h +++ b/distrho/src/travesty/edit_controller.h @@ -79,9 +79,9 @@ struct v3_param_info { struct v3_edit_controller { struct v3_plugin_base; - v3_result (V3_API* set_component_state)(void* self, struct v3_bstream*); - v3_result (V3_API* set_state)(void* self, struct v3_bstream*); - v3_result (V3_API* get_state)(void* self, struct v3_bstream*); + v3_result (V3_API* set_component_state)(void* self, struct v3_bstream**); + v3_result (V3_API* set_state)(void* self, struct v3_bstream**); + v3_result (V3_API* get_state)(void* self, struct v3_bstream**); int32_t (V3_API* get_parameter_count)(void* self); v3_result (V3_API* get_parameter_info)(void* self, int32_t param_idx, struct v3_param_info*); v3_result (V3_API* get_parameter_string_for_value)(void* self, v3_param_id, double normalised, v3_str_128 output);