From 9c50bbde2ba415697013902e213265b3b35cc975 Mon Sep 17 00:00:00 2001 From: Tom Poole Date: Thu, 23 May 2019 14:46:08 +0100 Subject: [PATCH] VST3: Increased the instantiation speed of large shell plug-ins --- .../format_types/juce_VST3PluginFormat.cpp | 44 ++++++------------- 1 file changed, 14 insertions(+), 30 deletions(-) diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index c901656b03..e6a3a736c6 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -792,29 +792,6 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (DescriptionFactory) }; -struct MatchingDescriptionFinder : public DescriptionFactory -{ - MatchingDescriptionFinder (VST3HostContext* h, IPluginFactory* f, const PluginDescription& desc) - : DescriptionFactory (h, f), description (desc) - { - } - - static const char* getSuccessString() noexcept { return "Found Description"; } - - Result performOnDescription (PluginDescription& desc) - { - if (description.isDuplicateOf (desc)) - return Result::fail (getSuccessString()); - - return Result::ok(); - } - -private: - const PluginDescription& description; - - JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (MatchingDescriptionFinder) -}; - struct DescriptionLister : public DescriptionFactory { DescriptionLister (VST3HostContext* host, IPluginFactory* pluginFactory) @@ -1088,15 +1065,22 @@ private: if (pluginFactory != nullptr) { - ComSmartPtr host (new VST3HostContext()); - MatchingDescriptionFinder finder (host, pluginFactory, description); + auto numClasses = pluginFactory->countClasses(); - auto result = finder.findDescriptionsAndPerform (f); - - if (result.getErrorMessage() == MatchingDescriptionFinder::getSuccessString()) + for (Steinberg::int32 i = 0; i < numClasses; ++i) { - name = description.name; - return true; + PClassInfo info; + pluginFactory->getClassInfo (i, &info); + + if (std::strcmp (info.category, kVstAudioEffectClass) != 0) + continue; + + if (toString (info.name).trim() == description.name + && getHashForTUID (info.cid) == description.uid) + { + name = description.name; + return true; + } } }