From a27d7a9b67a15443ae5911dbf5c14a299d303017 Mon Sep 17 00:00:00 2001 From: falkTX Date: Sun, 7 Aug 2022 01:16:03 +0100 Subject: [PATCH] VST3: Properly describe provided classes, fixes Ableton; Cleanup --- distrho/src/DistrhoPluginVST3.cpp | 241 +++++++++++++++--------------- 1 file changed, 123 insertions(+), 118 deletions(-) diff --git a/distrho/src/DistrhoPluginVST3.cpp b/distrho/src/DistrhoPluginVST3.cpp index a73f860c..2fdbda8d 100644 --- a/distrho/src/DistrhoPluginVST3.cpp +++ b/distrho/src/DistrhoPluginVST3.cpp @@ -603,110 +603,10 @@ public: #endif { #if DISTRHO_PLUGIN_NUM_INPUTS > 0 - std::vector visitedInputPortGroups; - for (uint32_t i=0; i::iterator end = visitedInputPortGroups.end(); - if (std::find(visitedInputPortGroups.begin(), end, port.groupId) == end) - { - visitedInputPortGroups.push_back(port.groupId); - ++inputBuses.numGroups; - } - continue; - } - - if (port.hints & kAudioPortIsCV) - ++inputBuses.numCV; - else - ++inputBuses.numMainAudio; - - if (port.hints & kAudioPortIsSidechain) - ++inputBuses.numSidechain; - } - - if (inputBuses.numMainAudio != 0) - inputBuses.audio = 1; - if (inputBuses.numSidechain != 0) - inputBuses.sidechain = 1; - - uint32_t cvInputBusId = 0; - for (uint32_t i=0; i(); #endif #if DISTRHO_PLUGIN_NUM_OUTPUTS > 0 - std::vector visitedOutputPortGroups; - for (uint32_t i=0; i::iterator end = visitedOutputPortGroups.end(); - if (std::find(visitedOutputPortGroups.begin(), end, port.groupId) == end) - { - visitedOutputPortGroups.push_back(port.groupId); - ++outputBuses.numGroups; - } - continue; - } - - if (port.hints & kAudioPortIsCV) - ++outputBuses.numCV; - else - ++outputBuses.numMainAudio; - - if (port.hints & kAudioPortIsSidechain) - ++outputBuses.numSidechain; - } - - if (outputBuses.numMainAudio != 0) - outputBuses.audio = 1; - if (outputBuses.numSidechain != 0) - outputBuses.sidechain = 1; - - uint32_t cvOutputBusId = 0; - for (uint32_t i=0; i(); #endif if (const uint32_t extraParameterCount = fParameterCount + kVst3InternalParameterBaseCount) @@ -1484,7 +1384,10 @@ public: AudioPortWithBusId& port(fPlugin.getAudioPort(true, i)); if (port.busId != busId) + { + d_stdout("port.busId != busId: %d %d", port.busId, busId); continue; + } v3_speaker_arrangement arr; @@ -1532,7 +1435,7 @@ public: return V3_OK; } #endif // DISTRHO_PLUGIN_NUM_INPUTS - d_stdout("invalid bus arrangement %d", busIndex); + d_stdout("invalid input bus arrangement %d", busIndex); return V3_INVALID_ARG; } else @@ -1543,7 +1446,10 @@ public: AudioPortWithBusId& port(fPlugin.getAudioPort(false, i)); if (port.busId != busId) + { + d_stdout("port.busId != busId: %d %d", port.busId, busId); continue; + } v3_speaker_arrangement arr; @@ -1591,7 +1497,7 @@ public: return V3_OK; } #endif // DISTRHO_PLUGIN_NUM_OUTPUTS - d_stdout("invalid bus arrangement %d", busIndex); + d_stdout("invalid output bus arrangement %d", busIndex); return V3_INVALID_ARG; } } @@ -2724,6 +2630,71 @@ private: TimePosition fTimePosition; #endif + // ---------------------------------------------------------------------------------------------------------------- + // bus related helper functions called on constructor + + #if DISTRHO_PLUGIN_NUM_INPUTS+DISTRHO_PLUGIN_NUM_OUTPUTS > 0 + template + void fillInBusInfoDetails() + { + constexpr const uint32_t numPorts = isInput ? DISTRHO_PLUGIN_NUM_INPUTS : DISTRHO_PLUGIN_NUM_OUTPUTS; + BusInfo& bufInfo(isInput ? inputBuses : outputBuses); + + std::vector visitedPortGroups; + for (uint32_t i=0; i::iterator end = visitedPortGroups.end(); + if (std::find(visitedPortGroups.begin(), end, port.groupId) == end) + { + visitedPortGroups.push_back(port.groupId); + ++bufInfo.numGroups; + } + continue; + } + + if (port.hints & kAudioPortIsCV) + ++bufInfo.numCV; + else + ++bufInfo.numMainAudio; + + if (port.hints & kAudioPortIsSidechain) + ++bufInfo.numSidechain; + } + + if (bufInfo.numMainAudio != 0) + bufInfo.audio = 1; + if (bufInfo.numSidechain != 0) + bufInfo.sidechain = 1; + + uint32_t busIdFromGroup = 0; + uint32_t busIdForCV = 0; + for (uint32_t i=0; i %i %p", idx, info); std::memset(info, 0, sizeof(*info)); - DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); + DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, 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)); + + if (idx == 0) + { + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); + } + else + { + std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); + } + return V3_OK; } @@ -4671,19 +4656,29 @@ struct dpf_factory : v3_plugin_factory_cpp { { d_stdout("dpf_factory::get_class_info_2 => %i %p", idx, info); std::memset(info, 0, sizeof(*info)); - DISTRHO_SAFE_ASSERT_RETURN(idx == 0, V3_INVALID_ARG); + DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG); info->cardinality = 0x7FFFFFFF; -#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI + #if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI 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)); + #endif 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 3.7.4", ARRAY_SIZE(info->sdk_version)); + + if (idx == 0) + { + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); + } + else + { + std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); + } + return V3_OK; } @@ -4694,19 +4689,29 @@ struct dpf_factory : v3_plugin_factory_cpp { { 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); + DISTRHO_SAFE_ASSERT_RETURN(idx <= 2, V3_INVALID_ARG); info->cardinality = 0x7FFFFFFF; -#if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI + #if DPF_VST3_USES_SEPARATE_CONTROLLER || !DISTRHO_PLUGIN_HAS_UI 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)); + #endif 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 3.7.4", ARRAY_SIZE(info->sdk_version)); + + if (idx == 0) + { + std::memcpy(info->class_id, dpf_tuid_class, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Audio Module Class", ARRAY_SIZE(info->category)); + } + else + { + std::memcpy(info->class_id, dpf_tuid_controller, sizeof(v3_tuid)); + DISTRHO_NAMESPACE::strncpy(info->category, "Component Controller Class", ARRAY_SIZE(info->category)); + } + return V3_OK; }