From 06a2089872905242ead2fc0d4c31cf5c0cea8cc5 Mon Sep 17 00:00:00 2001 From: reuk Date: Tue, 16 May 2023 20:53:27 +0100 Subject: [PATCH] VST3 Client: Update moduleinfotool to write compatibility info from plugin Reintegrates changes from cf9fc84669d1797d2563ff656d96013455173108 --- extras/Build/CMake/JUCEUtils.cmake | 4 +- .../ProjectSaving/jucer_ProjectExporter.h | 2 + .../format_types/VST3_SDK/JUCE_README.md | 3 ++ .../moduleinfotool/source/main.cpp | 42 +++++++++++++++++-- 4 files changed, 46 insertions(+), 5 deletions(-) diff --git a/extras/Build/CMake/JUCEUtils.cmake b/extras/Build/CMake/JUCEUtils.cmake index 0f96236f90..e278913672 100644 --- a/extras/Build/CMake/JUCEUtils.cmake +++ b/extras/Build/CMake/JUCEUtils.cmake @@ -949,6 +949,7 @@ function(_juce_add_vst3_manifest_helper_target) set(vst3_dir "${module_path}/juce_audio_processors/format_types/VST3_SDK") set(public_dir "${vst3_dir}/public.sdk") set(public_source_dir "${public_dir}/source") + set(public_common_dir "${public_source_dir}/common") set(public_vst_dir "${public_source_dir}/vst") set(hosting_dir "${public_vst_dir}/hosting") @@ -966,8 +967,9 @@ function(_juce_add_vst3_manifest_helper_target) add_executable(juce_vst3_helper "${extra_source}" "${hosting_dir}/module.cpp" + "${public_common_dir}/memorystream.cpp" + "${public_common_dir}/readfile.cpp" "${public_dir}/samples/vst-utilities/moduleinfotool/source/main.cpp" - "${public_source_dir}/common/memorystream.cpp" "${public_vst_dir}/moduleinfo/moduleinfocreator.cpp" "${public_vst_dir}/moduleinfo/moduleinfoparser.cpp" "${public_vst_dir}/utility/stringconvert.cpp" diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index c2a8c0efb0..404518bf0d 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -245,6 +245,8 @@ public: .getChildFile ("main.cpp"), source.getChildFile ("common") .getChildFile ("memorystream.cpp"), + source.getChildFile ("common") + .getChildFile ("readfile.cpp"), vst.getChildFile ("moduleinfo") .getChildFile ("moduleinfocreator.cpp"), vst.getChildFile ("moduleinfo") diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md b/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md index 8291435578..f3e3689c36 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md +++ b/modules/juce_audio_processors/format_types/VST3_SDK/JUCE_README.md @@ -1,2 +1,5 @@ This list details modifications made to the VST3 SDK in order to facilitate inclusion in JUCE. + +- The main.cpp of moduleinfotool was updated to include information exported + by the plugin's IPluginCompatibility object, if present. diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp index 588627e010..2d568ae831 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp @@ -35,14 +35,16 @@ // OF THE POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- +#include "base/source/fcommandline.h" +#include "pluginterfaces/base/fplatform.h" +#include "pluginterfaces/base/iplugincompatibility.h" +#include "pluginterfaces/vst/vsttypes.h" +#include "public.sdk/source/common/memorystream.h" +#include "public.sdk/source/common/readfile.h" #include "public.sdk/source/vst/hosting/module.h" #include "public.sdk/source/vst/moduleinfo/moduleinfocreator.h" #include "public.sdk/source/vst/moduleinfo/moduleinfoparser.h" #include "public.sdk/source/vst/utility/stringconvert.h" -#include "public.sdk/source/common/readfile.h" -#include "base/source/fcommandline.h" -#include "pluginterfaces/vst/vsttypes.h" -#include "pluginterfaces/base/fplatform.h" #include #include #include @@ -96,6 +98,35 @@ std::optional openAndParseCompatJSON (const std:: return result; } +//------------------------------------------------------------------------ +std::optional loadCompatibilityFromModule (const VST3::Hosting::Module& module) +{ + const auto& factory = module.getFactory(); + const auto& infos = factory.classInfos(); + + const auto iter = std::find_if (infos.begin(), infos.end(), [&] (const auto& info) + { + return info.category() == kPluginCompatibilityClass; + }); + + if (iter == infos.end()) + return {}; + + const auto compatibility = factory.createInstance (iter->ID()); + + if (compatibility == nullptr) + return {}; + + Steinberg::MemoryStream stream; + + if (compatibility->getCompatibilityJSON (&stream) != kResultOk) + return {}; + + const std::string_view streamView (stream.getData(), stream.getSize()); + + return ModuleInfoLib::parseCompatibilityJson (streamView, nullptr); +} + //------------------------------------------------------------------------ int createJSON (const std::optional& compat, const std::string& modulePath, const std::string& moduleVersion, @@ -111,6 +142,9 @@ int createJSON (const std::optional& compat, auto moduleInfo = ModuleInfoLib::createModuleInfo (*module, false); if (compat) moduleInfo.compatibility = *compat; + else if (auto loaded = loadCompatibilityFromModule (*module)) + moduleInfo.compatibility = *loaded; + moduleInfo.version = moduleVersion; std::stringstream output;