Some third party VST3 in the new bundle format don’t include a moduleinfo.json, which is optional as far as I remember. The VST3 format then fills a PluginDescription with the binary filename inside Contents\x86_64-win rather than the top-level bundle filename.
I have not yet fully understood why, but this leads to the PluginDescription always being out of date when compared against the filenames provided by searchPathsForPlugins(). These plug-ins are thus re-scanned every time a host is started. This can be very annoying and time consuming.
The issue here is that VST3 format’s searchPathsForPlugins() delivers bundle names (as expected), while PluginDescription uses the internal binary filenames. This mismatch causes some confusion down the road.
Solution:
The VST3 format should always fill PluginDescription with the bundle name, which defaults to a non-bundle filename when there’s no bundle structure.
Here’s a rudimentary first fix in juce_VST3PluginFormat.cpp
const File getBundleFile (const File& fn)
{
auto bundleName = fn.getParentDirectory().getParentDirectory().getParentDirectory();
if (bundleName.hasFileExtension(".vst3")
&& (! fn.isDirectory())
&& fn.getParentDirectory().getParentDirectory().getFileName() == "Contents")
return bundleName;
else
return fn;
}
Change in both createPluginDescription(), createPluginDescriptions()
auto bundleFile = getBundleFile (pluginFile);
description.fileOrIdentifier = bundleFile.getFullPathName();
description.lastFileModTime = bundleFile.getLastModificationTime();
This ensures all VST3 are handled equally, with or without moduleinfo.json
Note: This issue was observed on Windows only, probably because of different file extensions being used on macOS. The fix works cross-platform anyway.
