From 71b9ea044e29fc4f367e1cc4a26a57c61983bd99 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 19 Dec 2021 22:12:12 +0000 Subject: [PATCH] Start cleanup of vst3 code --- distrho/src/DistrhoPluginVST3.cpp | 373 +++++++++++++++--------------- distrho/src/DistrhoUIVST3.cpp | 2 + 2 files changed, 185 insertions(+), 190 deletions(-) diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp index f6c7958e..4cff1cee 100644 --- a/distrho/src/DistrhoPluginVST3.cpp +++ b/distrho/src/DistrhoPluginVST3.cpp @@ -58,21 +58,28 @@ namespace std { #include /* TODO items: + * == parameters * - parameter enumeration as lists + * - implement getParameterValueForString (use names from enumeration if available, fallback to std::atof) + * - implement getParameterNormalized for MIDI CC params * - hide parameter outputs? * - hide program parameter? * - deal with parameter triggers + * == MIDI * - MIDI CC changes (need to store value to give to the host?) * - MIDI program changes * - MIDI sysex * - append MIDI input events in a sorted way + * == BUSES * - bus arrangements * - optional audio buses, create dummy buffer of max_block_size length for them * - routing info, do we care? * - set sidechain bus name from port group - * - implement getParameterValueForString (use names from enumeration if available, fallback to std::atof) + * == INFO * - set factory email (needs new DPF API, useful for LV2 as well) * - do something with get_controller_class_id and set_io_mode? + * == UI + * - proper way to create ui, from factory */ START_NAMESPACE_DISTRHO @@ -419,7 +426,7 @@ public: if (port.hints & kAudioPortIsCV) port.busId = inputBuses.audio + inputBuses.sidechain + cvInputBusId++; else if (port.hints & kAudioPortIsSidechain) - port.busId = 1; + port.busId = inputBuses.audio; else port.busId = 0; } @@ -451,7 +458,7 @@ public: if (port.hints & kAudioPortIsCV) port.busId = outputBuses.audio + outputBuses.sidechain + cvOutputBusId++; else if (port.hints & kAudioPortIsSidechain) - port.busId = 1; + port.busId = outputBuses.audio; else port.busId = 0; } @@ -1527,13 +1534,12 @@ public: #if DISTRHO_PLUGIN_WANT_MIDI_INPUT if (rindex < 130*16) { - // TODO + // TODO find CC/channel based on name return V3_NOT_IMPLEMENTED; } rindex -= 130*16; #endif - // TODO return V3_NOT_IMPLEMENTED; } @@ -2507,9 +2513,9 @@ struct dpf_edit_controller : v3_edit_controller_cpp { hostContextFromInitialize(nullptr) { d_stdout("dpf_edit_controller() has contexts %p %p", - hostContextFromFactory, hostContextFromComponent); + hostContextFromFactory, hostContextFromComponent); - // make sure context is valid through this controller lifetime + // make sure context is valid through out this controller lifetime if (hostContextFromComponent != nullptr) v3_cpp_obj_ref(hostContextFromComponent); @@ -2547,8 +2553,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } d_stdout("dpf_edit_controller::cleanup() has contexts %p %p", - hostContextFromFactory, hostContextFromComponent); - + hostContextFromFactory, hostContextFromComponent); } // ---------------------------------------------------------------------------------------------------------------- @@ -2574,6 +2579,16 @@ struct dpf_edit_controller : v3_edit_controller_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_edit_controller* const controller = *(dpf_edit_controller**)self; DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NO_INTERFACE); @@ -2590,16 +2605,6 @@ struct dpf_edit_controller : v3_edit_controller_cpp { } #endif -#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 - *iface = NULL; return V3_NO_INTERFACE; } @@ -2631,7 +2636,6 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API initialize(void* self, v3_plugin_base::v3_funknown** context) { - d_stdout("dpf_edit_controller::initialize => %p %p", self, context); dpf_edit_controller* const controller = *(dpf_edit_controller**)self; DISTRHO_SAFE_ASSERT_RETURN(controller != nullptr, V3_NOT_INITIALIZED); @@ -2642,7 +2646,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { v3_host_application** host = 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); + 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; @@ -2653,7 +2657,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API terminate(void* self) { - d_stdout("dpf_edit_controller::terminate => %p", 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); @@ -2687,7 +2691,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static v3_result V3_API set_component_state(void* self, v3_bstream* stream) { - d_stdout("dpf_edit_controller::set_component_state => %p %p", self, 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); @@ -2734,7 +2738,7 @@ struct dpf_edit_controller : v3_edit_controller_cpp { static int32_t V3_API get_parameter_count(void* self) { - // d_stdout("dpf_edit_controller::get_parameter_count => %p", 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); @@ -2746,7 +2750,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); + // 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); @@ -2783,7 +2787,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); + 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); @@ -2795,7 +2799,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); + 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); @@ -2829,7 +2833,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); + 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); @@ -2843,7 +2847,7 @@ 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); + 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); @@ -2943,15 +2947,11 @@ struct dpf_process_context_requirements : v3_process_context_requirements_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_process_context_requirements(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_process_context_requirements(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_process_context_requirements_iid)) + d_stdout("query_interface_process_context_requirements => %p %s %p", self, tuid2str(iid), iface); + if (v3_tuid_match(iid, v3_funknown_iid) || + v3_tuid_match(iid, v3_process_context_requirements_iid)) { *iface = self; return V3_OK; @@ -2968,11 +2968,11 @@ struct dpf_process_context_requirements : v3_process_context_requirements_cpp { { #if DISTRHO_PLUGIN_WANT_TIMEPOS return 0x0 - |V3_PROCESS_CTX_NEED_CONTINUOUS_TIME // V3_PROCESS_CTX_CONT_TIME_VALID - |V3_PROCESS_CTX_NEED_PROJECT_TIME // V3_PROCESS_CTX_PROJECT_TIME_VALID - |V3_PROCESS_CTX_NEED_TEMPO // V3_PROCESS_CTX_TEMPO_VALID - |V3_PROCESS_CTX_NEED_TIME_SIG // V3_PROCESS_CTX_TIME_SIG_VALID - |V3_PROCESS_CTX_NEED_TRANSPORT_STATE; // V3_PROCESS_CTX_PLAYING + | V3_PROCESS_CTX_NEED_CONTINUOUS_TIME // V3_PROCESS_CTX_CONT_TIME_VALID + | V3_PROCESS_CTX_NEED_PROJECT_TIME // V3_PROCESS_CTX_PROJECT_TIME_VALID + | V3_PROCESS_CTX_NEED_TEMPO // V3_PROCESS_CTX_TEMPO_VALID + | V3_PROCESS_CTX_NEED_TIME_SIG // V3_PROCESS_CTX_TIME_SIG_VALID + | V3_PROCESS_CTX_NEED_TRANSPORT_STATE; // V3_PROCESS_CTX_PLAYING #else return 0x0; #endif @@ -3011,15 +3011,12 @@ struct dpf_audio_processor : v3_audio_processor_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_audio_processor(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_audio_processor(void* const self, const v3_tuid iid, void** const iface) { - if (v3_tuid_match(iid, v3_funknown_iid)) - { - *iface = self; - return V3_OK; - } + d_stdout("query_interface_audio_processor => %p %s %p", self, tuid2str(iid), iface); - if (v3_tuid_match(iid, v3_audio_processor_iid)) + if (v3_tuid_match(iid, v3_funknown_iid) || + v3_tuid_match(iid, v3_audio_processor_iid)) { *iface = self; return V3_OK; @@ -3040,14 +3037,13 @@ struct dpf_audio_processor : v3_audio_processor_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_audio_processor - static v3_result V3_API set_bus_arrangements(void* self, - v3_speaker_arrangement* inputs, int32_t num_inputs, - v3_speaker_arrangement* outputs, int32_t num_outputs) + static v3_result V3_API set_bus_arrangements(void* const self, + v3_speaker_arrangement* const inputs, const int32_t num_inputs, + v3_speaker_arrangement* const outputs, const int32_t num_outputs) { // NOTE this is called a bunch of times - // d_stdout("dpf_audio_processor::set_bus_arrangements => %p %p %i %p %i", self, inputs, num_inputs, outputs, num_outputs); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, V3_NOT_INITIALIZED); + // d_stdout("dpf_audio_processor::set_bus_arrangements => %p %p %i %p %i", self, inputs, num_inputs, outputs, num_outputs); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3055,12 +3051,11 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->setBusArrangements(inputs, num_inputs, outputs, num_outputs); } - static v3_result V3_API get_bus_arrangement(void* self, int32_t bus_direction, - int32_t idx, v3_speaker_arrangement* arr) + static v3_result V3_API get_bus_arrangement(void* const self, const int32_t bus_direction, + const int32_t idx, v3_speaker_arrangement* const arr) { - d_stdout("dpf_audio_processor::get_bus_arrangement => %p %i %i %p", self, bus_direction, idx, arr); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_audio_processor::get_bus_arrangement => %p %i %i %p", self, bus_direction, idx, arr); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3068,17 +3063,16 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->getBusArrangement(bus_direction, idx, arr); } - static v3_result V3_API can_process_sample_size(void* self, int32_t symbolic_sample_size) + static v3_result V3_API can_process_sample_size(void*, const int32_t symbolic_sample_size) { - d_stdout("dpf_audio_processor::can_process_sample_size => %p %i", self, symbolic_sample_size); + d_stdout("dpf_audio_processor::can_process_sample_size => %i", symbolic_sample_size); return symbolic_sample_size == V3_SAMPLE_32 ? V3_OK : V3_NOT_IMPLEMENTED; } - static uint32_t V3_API get_latency_samples(void* self) + static uint32_t V3_API get_latency_samples(void* const self) { - d_stdout("dpf_audio_processor::get_latency_samples => %p", self); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, 0); + d_stdout("dpf_audio_processor::get_latency_samples => %p", self); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, 0); @@ -3086,11 +3080,10 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->getLatencySamples(); } - static v3_result V3_API setup_processing(void* self, v3_process_setup* setup) + static v3_result V3_API setup_processing(void* const self, v3_process_setup* const setup) { - d_stdout("dpf_audio_processor::setup_processing => %p", self); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_audio_processor::setup_processing => %p", self); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3100,11 +3093,10 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->setupProcessing(setup); } - static v3_result V3_API set_processing(void* self, v3_bool state) + static v3_result V3_API set_processing(void* const self, const v3_bool state) { - d_stdout("dpf_audio_processor::set_processing => %p %u", self, state); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_audio_processor::set_processing => %p %u", self, state); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3112,12 +3104,11 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->setProcessing(state); } - static v3_result V3_API process(void* self, v3_process_data* data) + static v3_result V3_API process(void* const self, v3_process_data* const data) { // NOTE runs during RT - // d_stdout("dpf_audio_processor::process => %p", self); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, V3_NOT_INITIALIZED); + // d_stdout("dpf_audio_processor::process => %p", self); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3125,11 +3116,10 @@ struct dpf_audio_processor : v3_audio_processor_cpp { return processor->vst3->process(data); } - static uint32_t V3_API get_tail_samples(void* self) + static uint32_t V3_API get_tail_samples(void* const self) { - d_stdout("dpf_audio_processor::get_tail_samples => %p", self); - dpf_audio_processor* const processor = *(dpf_audio_processor**)self; - DISTRHO_SAFE_ASSERT_RETURN(processor != nullptr, 0); + d_stdout("dpf_audio_processor::get_tail_samples => %p", self); + dpf_audio_processor* const processor = *static_cast(self); PluginVst3* const vst3 = processor->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, 0); @@ -3170,7 +3160,7 @@ struct dpf_component : v3_component_cpp { hostContextFromFactory(h), hostContextFromInitialize(nullptr) { - // make sure context is valid through this component lifetime + // make sure context is valid through out this component lifetime if (hostContextFromFactory != nullptr) v3_cpp_obj_ref(hostContextFromFactory); @@ -3215,28 +3205,20 @@ struct dpf_component : v3_component_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_funknown - static v3_result V3_API query_interface_component(void* self, const v3_tuid iid, void** iface) + static v3_result V3_API query_interface_component(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_component => %p %s %p", self, tuid2str(iid), iface); - if (v3_tuid_match(iid, v3_component_iid)) + if (v3_tuid_match(iid, v3_funknown_iid) || + v3_tuid_match(iid, v3_plugin_base_iid) || + v3_tuid_match(iid, v3_component_iid)) { *iface = self; return V3_OK; } - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NO_INTERFACE); + /* + dpf_component* const component = *static_cast(self); if (v3_tuid_match(iid, v3_audio_processor_iid)) { @@ -3275,24 +3257,28 @@ struct dpf_component : v3_component_cpp { *iface = &component->controller; return V3_OK; } + */ *iface = NULL; return V3_NO_INTERFACE; } - static uint32_t V3_API ref_component(void* self) + static uint32_t V3_API ref_component(void* const self) { - return ++(*(dpf_component**)self)->refcounter; + dpf_component* const component = *static_cast(self); + const int refcount = ++component->refcounter; + d_stdout("dpf_component::ref => %p | refcount %i", self, refcount); + return refcount; } - static uint32_t V3_API unref_component(void* self) + static uint32_t V3_API unref_component(void* const self) { - dpf_component** const componentptr = (dpf_component**)self; + dpf_component** const componentptr = static_cast(self); dpf_component* const component = *componentptr; if (const int refcount = --component->refcounter) { - d_stdout("dpf_component::unref => %p | refcount %i", self, refcount); + d_stdout("dpf_component::unref => %p | refcount %i", self, refcount); return refcount; } @@ -3355,7 +3341,7 @@ struct dpf_component : v3_component_cpp { if (unclean) return handleUncleanComponent(componentptr); - d_stdout("dpf_component::unref => %p | refcount is zero, deleting everything now!", self); + d_stdout("dpf_component::unref => %p | refcount is zero, deleting everything now!", self); if (component->hostContextFromFactory != nullptr) v3_cpp_obj_unref(component->hostContextFromFactory); @@ -3368,11 +3354,11 @@ struct dpf_component : v3_component_cpp { // ---------------------------------------------------------------------------------------------------------------- // 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) { - d_stdout("dpf_component::initialize => %p %p", self, context); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + dpf_component* const component = *static_cast(self); + + // check if already initialized DISTRHO_SAFE_ASSERT_RETURN(component->vst3 == nullptr, V3_INVALID_ARG); // query for host context @@ -3380,12 +3366,12 @@ struct dpf_component : v3_component_cpp { if (context != nullptr) v3_cpp_obj_query_interface(context, v3_host_application_iid, &host); - d_stdout("dpf_component::initialize => %p %p | host %p", self, context, host); + d_stdout("dpf_component::initialize => %p %p | host %p", self, context, host); // save it for later so we can unref it component->hostContextFromInitialize = host; - // provide the factory context to the plugin if this new one is invalid + // provide the factory context to the plugin if this new one is missing if (host == nullptr) host = component->hostContextFromFactory; @@ -3397,19 +3383,24 @@ struct dpf_component : v3_component_cpp { d_nextCanRequestParameterValueChanges = true; + // create the actual plugin component->vst3 = new PluginVst3(host); + return V3_OK; } - static v3_result V3_API terminate(void* self) + static v3_result V3_API terminate(void* const self) { - d_stdout("dpf_component::terminate => %p", self); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::terminate => %p", self); + dpf_component* const component = *static_cast(self); + + // check if already terminated DISTRHO_SAFE_ASSERT_RETURN(component->vst3 != nullptr, V3_INVALID_ARG); + // delete actual plugin component->vst3 = nullptr; + // unref context received during initialize if (component->hostContextFromInitialize != nullptr) { v3_cpp_obj_unref(component->hostContextFromInitialize); @@ -3422,24 +3413,23 @@ struct dpf_component : v3_component_cpp { // ---------------------------------------------------------------------------------------------------------------- // v3_component - static v3_result V3_API get_controller_class_id(void* self, v3_tuid class_id) + static v3_result V3_API get_controller_class_id(void*, v3_tuid class_id) { - d_stdout("dpf_component::get_controller_class_id => %p %s", self, tuid2str(class_id)); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); - - PluginVst3* const vst3 = component->vst3; - DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::get_controller_class_id => %p", class_id); - // TODO +#if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS return V3_NOT_IMPLEMENTED; +#else + std::memcpy(class_id, dpf_tuid_controller, sizeof(v3_tuid)); + return V3_OK; +#endif } - static v3_result V3_API set_io_mode(void* self, int32_t io_mode) + static v3_result V3_API set_io_mode(void* const self, const int32_t io_mode) { - d_stdout("dpf_component::set_io_mode => %p %i", self, io_mode); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::set_io_mode => %p %i", self, io_mode); + + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3448,12 +3438,11 @@ struct dpf_component : v3_component_cpp { return V3_NOT_IMPLEMENTED; } - static int32_t V3_API get_bus_count(void* self, int32_t media_type, int32_t bus_direction) + static int32_t V3_API get_bus_count(void* const self, const int32_t media_type, const int32_t bus_direction) { // NOTE runs during RT - // d_stdout("dpf_component::get_bus_count => %p %i %i", self, media_type, bus_direction); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + // d_stdout("dpf_component::get_bus_count => %p %i %i", self, media_type, bus_direction); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3461,12 +3450,11 @@ struct dpf_component : v3_component_cpp { return vst3->getBusCount(media_type, bus_direction); } - static v3_result V3_API get_bus_info(void* self, int32_t media_type, int32_t bus_direction, - int32_t bus_idx, v3_bus_info* info) + static v3_result V3_API get_bus_info(void* const self, const int32_t media_type, const int32_t bus_direction, + const int32_t bus_idx, v3_bus_info* const info) { - d_stdout("dpf_component::get_bus_info => %p %i %i %i %p", self, media_type, bus_direction, bus_idx, info); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::get_bus_info => %p %i %i %i %p", self, media_type, bus_direction, bus_idx, info); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3474,11 +3462,10 @@ struct dpf_component : v3_component_cpp { return vst3->getBusInfo(media_type, bus_direction, bus_idx, info); } - static v3_result V3_API get_routing_info(void* self, v3_routing_info* input, v3_routing_info* output) + static v3_result V3_API get_routing_info(void* const self, v3_routing_info* const input, v3_routing_info* const output) { - d_stdout("dpf_component::get_routing_info => %p %p %p", self, input, output); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::get_routing_info => %p %p %p", self, input, output); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3486,13 +3473,12 @@ struct dpf_component : v3_component_cpp { return vst3->getRoutingInfo(input, output); } - static v3_result V3_API activate_bus(void* self, int32_t media_type, int32_t bus_direction, - int32_t bus_idx, v3_bool state) + static v3_result V3_API activate_bus(void* const self, const int32_t media_type, const int32_t bus_direction, + const int32_t bus_idx, const v3_bool state) { // NOTE this is called a bunch of times - // d_stdout("dpf_component::activate_bus => %p %i %i %i %u", self, media_type, bus_direction, bus_idx, state); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + // d_stdout("dpf_component::activate_bus => %p %i %i %i %u", self, media_type, bus_direction, bus_idx, state); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3500,11 +3486,10 @@ struct dpf_component : v3_component_cpp { return vst3->activateBus(media_type, bus_direction, bus_idx, state); } - static v3_result V3_API set_active(void* self, v3_bool state) + static v3_result V3_API set_active(void* const self, const v3_bool state) { - d_stdout("dpf_component::set_active => %p %u", self, state); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::set_active => %p %u", self, state); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3512,11 +3497,10 @@ struct dpf_component : v3_component_cpp { return component->vst3->setActive(state); } - 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_component::set_state => %p", self); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::set_state => %p", self); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3524,11 +3508,10 @@ struct dpf_component : v3_component_cpp { return vst3->setState(stream); } - 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_component::get_state => %p %p", self, stream); - dpf_component* const component = *(dpf_component**)self; - DISTRHO_SAFE_ASSERT_RETURN(component != nullptr, V3_NOT_INITIALIZED); + d_stdout("dpf_component::get_state => %p %p", self, stream); + dpf_component* const component = *static_cast(self); PluginVst3* const vst3 = component->vst3; DISTRHO_SAFE_ASSERT_RETURN(vst3 != nullptr, V3_NOT_INITIALIZED); @@ -3616,7 +3599,7 @@ struct dpf_factory : v3_plugin_factory_cpp { v3_funknown** hostContext; dpf_factory() - : hostContext(nullptr) + : hostContext(nullptr) { dpf_tuid_class[2] = dpf_tuid_component[2] = dpf_tuid_controller[2] = dpf_tuid_processor[2] = dpf_tuid_view[2] = getPluginInfo().getUniqueId(); @@ -3669,25 +3652,10 @@ struct dpf_factory : v3_plugin_factory_cpp { static v3_result V3_API query_interface_factory(void* self, const v3_tuid iid, void** iface) { - if (v3_tuid_match(iid, v3_funknown_iid)) - { - *iface = self; - return V3_OK; - } - - if (v3_tuid_match(iid, v3_plugin_factory_iid)) - { - *iface = self; - return V3_OK; - } - - if (v3_tuid_match(iid, v3_plugin_factory_2_iid)) - { - *iface = self; - return V3_OK; - } - - if (v3_tuid_match(iid, v3_plugin_factory_3_iid)) + 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) || + v3_tuid_match(iid, v3_plugin_factory_3_iid)) { *iface = self; return V3_OK; @@ -3712,17 +3680,26 @@ struct dpf_factory : v3_plugin_factory_cpp { static int32_t V3_API num_classes(void*) { + // TODO allow to create other stuff return 1; } - static v3_result V3_API get_class_info(void*, int32_t idx, v3_class_info* const info) + static v3_result V3_API get_class_info(void*, const int32_t idx, v3_class_info* const info) { std::memset(info, 0, sizeof(*info)); - DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); - std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + 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; + } + info->cardinality = 0x7FFFFFFF; - 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; } @@ -3730,12 +3707,12 @@ struct dpf_factory : v3_plugin_factory_cpp { static v3_result V3_API create_instance(void* self, const v3_tuid class_id, const v3_tuid iid, void** 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); - dpf_factory* const factory = *(dpf_factory**)self; - DISTRHO_SAFE_ASSERT_RETURN(factory != nullptr, V3_NOT_INITIALIZED); - // query for host context v3_host_application** host = nullptr; if (factory->hostContext != nullptr) @@ -3753,11 +3730,19 @@ struct dpf_factory : v3_plugin_factory_cpp { static v3_result V3_API get_class_info_2(void*, int32_t idx, v3_class_info_2* info) { std::memset(info, 0, sizeof(*info)); - DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); - std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + 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; + } + info->cardinality = 0x7FFFFFFF; - DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); DISTRHO_NAMESPACE::strncpy(info->name, getPluginInfo().getName(), ARRAY_SIZE(info->name)); #if DISTRHO_PLUGIN_WANT_DIRECT_ACCESS @@ -3778,11 +3763,19 @@ struct dpf_factory : v3_plugin_factory_cpp { static v3_result V3_API get_class_info_utf16(void*, int32_t idx, v3_class_info_3* info) { std::memset(info, 0, sizeof(*info)); - DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); - 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)); + 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 diff --git a/distrho/src/DistrhoUIVST3.cpp b/distrho/src/DistrhoUIVST3.cpp index e3031d2b..c83ecbef 100644 --- a/distrho/src/DistrhoUIVST3.cpp +++ b/distrho/src/DistrhoUIVST3.cpp @@ -21,6 +21,8 @@ #include "travesty/host.h" #include "travesty/view.h" +#error 1 + #ifdef DISTRHO_PROPER_CPP11_SUPPORT # include #else