diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 6a032fa594..26ca267cab 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -674,6 +674,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -721,6 +722,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" @@ -3191,6 +3194,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -3238,6 +3242,8 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index f80394e608..9fcc7af0b6 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -914,6 +914,9 @@ true + + true + true @@ -3498,6 +3501,7 @@ + @@ -3541,6 +3545,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 8a42e5619d..f554894e99 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -1603,6 +1603,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -5082,6 +5085,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -5211,6 +5217,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj index 7b3c5bc01a..6434b0b275 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj @@ -914,6 +914,9 @@ true + + true + true @@ -3498,6 +3501,7 @@ + @@ -3541,6 +3545,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters index 0269f158b0..1c9b0a4757 100644 --- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters @@ -1603,6 +1603,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -5082,6 +5085,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -5211,6 +5217,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index d14a0bf159..1da8107684 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -629,6 +629,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -676,6 +677,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" @@ -2829,6 +2832,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -2876,6 +2880,8 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj index 723a414e57..43b13f21c8 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj @@ -874,6 +874,9 @@ true + + true + true @@ -3070,6 +3073,7 @@ + @@ -3113,6 +3117,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters index d9891e52d2..daafb5b4ff 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters @@ -1420,6 +1420,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4440,6 +4443,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4569,6 +4575,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index 9e780dd435..8b81ebb973 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -662,6 +662,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -709,6 +710,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" @@ -3015,6 +3018,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -3062,6 +3066,8 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index 0e15fa3ef8..0ebb582415 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -882,6 +882,9 @@ true + + true + true @@ -3250,6 +3253,7 @@ + @@ -3293,6 +3297,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index c9c303abc8..112b567ee5 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -1495,6 +1495,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4716,6 +4719,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4845,6 +4851,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj index 8defa769a0..31e0e4b400 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj @@ -882,6 +882,9 @@ true + + true + true @@ -3250,6 +3253,7 @@ + @@ -3293,6 +3297,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters index 00323eac0b..739f98447a 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters @@ -1495,6 +1495,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4716,6 +4719,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4845,6 +4851,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index 8c6cb29e72..fe01c8482e 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -633,6 +633,7 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -680,6 +681,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" @@ -2913,6 +2916,7 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ftypes.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/futils.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/ibstream.h" @@ -2960,6 +2964,8 @@ set_source_files_properties( "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/LICENSE.txt" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/README.md" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/samples/vst-utilities/moduleinfotool/source/main.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp" + "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.cpp" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/memorystream.h" "../../../../../modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp" diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj index dbd231cf59..3e3b3b4bf2 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj @@ -874,6 +874,9 @@ true + + true + true @@ -3161,6 +3164,7 @@ + @@ -3204,6 +3208,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters index 8540038cb4..c9f5a49f51 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters @@ -1450,6 +1450,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4581,6 +4584,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4710,6 +4716,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index b29b374f90..67f28ba25b 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -890,6 +890,9 @@ true + + true + true @@ -3346,6 +3349,7 @@ + @@ -3389,6 +3393,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 557924d8bf..3a61b8bbef 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -1516,6 +1516,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4830,6 +4833,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4959,6 +4965,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj index c5f60508cd..785a09d65f 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj @@ -890,6 +890,9 @@ true + + true + true @@ -3346,6 +3349,7 @@ + @@ -3389,6 +3393,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters index 977ae82575..c90aeca7db 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -1516,6 +1516,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4830,6 +4833,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4959,6 +4965,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj index 7a022809df..9f00cbdb16 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj @@ -873,6 +873,9 @@ true + + true + true @@ -3137,6 +3140,7 @@ + @@ -3180,6 +3184,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters index 7ea6ca93da..1a0a02a238 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters @@ -1447,6 +1447,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\samples\vst-utilities\moduleinfotool\source + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common @@ -4548,6 +4551,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\base @@ -4677,6 +4683,9 @@ JUCE Modules\juce_audio_processors\format_types\VST3_SDK\pluginterfaces\vst + + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common + JUCE Modules\juce_audio_processors\format_types\VST3_SDK\public.sdk\source\common diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.cpp index 1310d079ac..c682f21dda 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3ManifestHelper.cpp @@ -55,6 +55,10 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wc++98-compat-extra-semi", JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387 6031) +#ifndef _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING + #define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING +#endif + #ifndef NOMINMAX #define NOMINMAX 1 #endif @@ -70,6 +74,7 @@ JUCE_BEGIN_IGNORE_WARNINGS_MSVC (6387 6031) #include #include #include +#include #include #include #include diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/README.md b/modules/juce_audio_processors/format_types/VST3_SDK/README.md index 3befbc0642..3f81424007 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/README.md +++ b/modules/juce_audio_processors/format_types/VST3_SDK/README.md @@ -22,7 +22,7 @@ - AAX, AUv3 and AU Wrappers - VST 3 plug-ins Examples -The full VST 3 SDK is available [here!](https://www.steinberg.net/en/company/developers.html). It contains: +The full **VST 3 SDK** is available [here!](https://www.steinberg.net/en/company/developers.html). It contains: - VST 3 plug-in Test Host Application/Validator, - the **Steinberg VST 3 Plug-In SDK Licensing Agreement** that you have to sign if you want to develop or host **VST 3** plug-ins. @@ -33,15 +33,15 @@ The full VST 3 SDK is available [here!](https://www.steinberg.net/en/company/dev Supported Platforms: -| Operating System |Architecture |Compiler | Notes| -| :------------------------------------ | :-----------------------: | :-------------------------------: | :-----------: | -|Windows 10/11 |x86, x86_64, arm64 |MSVC 2022, MSVC 2019 | | -|Windows 8.1 |x86, x86_64 |MSVC 2019, MSVC 2017 | | -|macOS 10.13, 10.14, 10.15, 11, 12, 13 |x86, x86_64, Apple Silicon |Xcode 10 - 14 | | -|iOS 13 - iOS 16 |arm64 |Xcode 11 - 14 | | -|Linux - Raspberry Pi OS (Buster) |arm32 |GCC 8.3 and higher |Visual Studio Code| -|Linux - Ubuntu 18.04 LTS |x86, x86_64 |GCC 8.3 and higher |Visual Studio Code, Qt Creator| -|Linux - Ubuntu 20.04 LTS |x86, x86_64 |GCC 8.3 and higher |Visual Studio Code, Qt Creator| +| Operating System |Architecture |Compiler | Notes| +| :------------------------------ | :-----------------------: | :---------------------: | :--------------------------: | +|Windows 10/11 |x86, x86_64, arm64 |MSVC 2022, MSVC 2019 | | +|Windows 8.1 |x86, x86_64 |MSVC 2019, MSVC 2017 | | +|macOS 10.13 - 14 |x86, x86_64, Apple Silicon |Xcode 10 - 15 | | +|iOS 13 - iOS 17 |arm64 |Xcode 11 - 15 | | +|Linux - Raspberry Pi OS (Buster) |arm32 |GCC 8.3 and higher |Visual Studio Code | +|Linux - Ubuntu 18.04 LTS |x86, x86_64 |GCC 8.3 and higher |Visual Studio Code, Qt Creator| +|Linux - Ubuntu 20.04 LTS |x86, x86_64 |GCC 8.3 and higher |Visual Studio Code, Qt Creator| ---
diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf b/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf index ec7da49827..af7d0246d7 100644 Binary files a/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf and b/modules/juce_audio_processors/format_types/VST3_SDK/VST3_License_Agreement.pdf differ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp index 45dd41940a..bf95b50fb0 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fbuffer.cpp @@ -304,7 +304,7 @@ bool Buffer::makeHexString (String& result) if (data == nullptr || bytes == 0) return false; - char8* stringBuffer = (char8*)malloc ((bytes * 2) + 1); + char8* stringBuffer = NEWSTR8 ((bytes * 2) + 1); if (!stringBuffer) return false; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp index 239afb5617..d58df95d06 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fobject.cpp @@ -39,6 +39,7 @@ #include "base/source/fobject.h" #include "base/thread/include/flock.h" +#include #include #define SMTG_VALIDATE_DEPENDENCY_COUNT DEVELOPMENT // validating dependencyCount @@ -49,6 +50,13 @@ namespace Steinberg { +// Entry point for addRef/release tracking. See fobjecttracker.h +//------------------------------------------------------------------------ +#if DEVELOPMENT +using FObjectTrackerFn = std::function; +FObjectTrackerFn gFObjectTracker = nullptr; +#endif + IUpdateHandler* FObject::gUpdateHandler = nullptr; //------------------------------------------------------------------------ @@ -112,12 +120,26 @@ FObject::~FObject () //------------------------------------------------------------------------ uint32 PLUGIN_API FObject::addRef () { +#if DEVELOPMENT + if (gFObjectTracker) + { + gFObjectTracker (this, true); + } +#endif + return FUnknownPrivate::atomicAdd (refCount, 1); } //------------------------------------------------------------------------ uint32 PLUGIN_API FObject::release () { +#if DEVELOPMENT + if (gFObjectTracker) + { + gFObjectTracker (this, false); + } +#endif + if (FUnknownPrivate::atomicAdd (refCount, -1) == 0) { refCount = -1000; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp index 3a1a2a5aad..af193cf189 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstreamer.cpp @@ -723,7 +723,7 @@ char8* FStreamer::readStr8 () if (length > 262144) return nullptr; - char8* s = (length > 0) ? NEWVEC char8[length] : nullptr; + char8* s = (length > 0) ? NEWSTR8 (length) : nullptr; if (s) readRaw (s, length * sizeof (char8)); return s; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp index 77024c248e..60cbf5d128 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.cpp @@ -233,7 +233,7 @@ static inline Steinberg::int32 sprintf16 (Steinberg::char16* str, const Steinber { va_list marker; va_start (marker, format); - return vsnwprintf (str, -1, format, marker); + return vsnwprintf (str, static_cast (-1), format, marker); } #elif SMTG_OS_LINUX @@ -3564,6 +3564,14 @@ bool String::fromVariant (const FVariant& var) printInt64 (var.getInt ()); return true; + case FVariant::kObject: + if (auto string = ICast (var.getObject ())) + if (string->isWideString ()) + assign (string->getText16 ()); + else + assign (string->getText8 ()); + return true; + default: remove (); } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h index b8676d6d86..3332e47c92 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/fstring.h @@ -45,6 +45,7 @@ #include "base/source/fobject.h" #include +#include namespace Steinberg { @@ -307,6 +308,10 @@ protected: Extends class ConstString by operations which allow modifications. +If allocated externally and passed in via take() or extracted via pass(), memory +is expected to be allocated with C's malloc() (rather than new) and deallocated with free(). +Use the NEWSTR8/16 and DELETESTR8/16 macros below. + \see ConstString */ //----------------------------------------------------------------------------- class String : public ConstString @@ -481,6 +486,12 @@ private: bool checkToMultiByte (uint32 destCodePage = kCP_Default) const; // to remove debug code from inline - const_cast inside!!! }; +// String memory allocation macros +#define NEWSTR8(len) ((char8*)::malloc(len)) // len includes trailing zero +#define NEWSTR16(len) ((char16*)::malloc(2*(len))) +#define DELETESTR8(p) (::free((char*)(p))) // cast to strip const +#define DELETESTR16(p) (::free((char16*)(p))) + // String concatenation functions. inline String operator+ (const ConstString& s1, const ConstString& s2) {return String (s1).append (s2);} inline String operator+ (const ConstString& s1, const char8* s2) {return String (s1).append (s2);} diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp index e722d45ed7..b2caf8ac4e 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/base/source/updatehandler.cpp @@ -72,7 +72,10 @@ inline IPtr getUnknownBase (FUnknown* unknown) { FUnknown* result = nullptr; if (unknown) - unknown->queryInterface (FUnknown::iid, (void**)&result); + { + if (unknown->queryInterface (FObject::iid, (void**)&result) != kResultTrue) + unknown->queryInterface (FUnknown::iid, (void**)&result); + } return owned (result); } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h index fea5e8d629..5c3b6fa724 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fplatform.h @@ -82,14 +82,9 @@ #define SMTG_EXPORT_SYMBOL __declspec (dllexport) #define SMTG_HIDDEN_SYMBOL - #ifndef _CRT_SECURE_NO_WARNINGS - #define _CRT_SECURE_NO_WARNINGS - #endif - #ifdef _MSC_VER #pragma warning (disable : 4244) //! @brief warning C4244: Conversion from 'type1' to 'type2', possible loss of data. #pragma warning (disable : 4250) //! @brief warning C4250: Inheritance via dominance is allowed - #pragma warning (disable : 4996) //! @brief warning C4996: deprecated functions #pragma warning (3 : 4189) //! @brief warning C4189: local variable is initialized but not referenced #pragma warning (3 : 4238) //! @brief warning C4238: nonstandard extension used : class rvalue used as lvalue diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h index a365b69594..42bb0b91d5 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fstrdefs.h @@ -86,11 +86,13 @@ #define ENDLINE ENDLINE_A #endif -#if SMTG_OS_WINDOWS && !defined(__GNUC__) && defined(_MSC_VER) && (_MSC_VER < 1900) +#if SMTG_OS_WINDOWS && !defined(__GNUC__) && defined(_MSC_VER) #define stricmp _stricmp #define strnicmp _strnicmp +#if (_MSC_VER < 1900) #define snprintf _snprintf #endif +#endif namespace Steinberg { diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp index b88fc5bf9b..a9bdeca547 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.cpp @@ -410,12 +410,6 @@ void FUID::toRegistryString (char8* string) const #endif } -//------------------------------------------------------------------------ -void FUID::print (char8* string, int32 style) const -{ - print (style, string, 62); -} - //------------------------------------------------------------------------ void FUID::print (int32 style, char8* string, size_t stringBufferSize) const { @@ -439,22 +433,26 @@ void FUID::print (int32 style, char8* string, size_t stringBufferSize) const switch (style) { case kINLINE_UID: + // length is 60 (with null-terminate) snprintf (string, stringBufferSize, "INLINE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4); break; case kDECLARE_UID: + // length is 61 (with null-terminate) snprintf (string, stringBufferSize, "DECLARE_UID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4); break; case kFUID: + // length is 54 (with null-terminate) snprintf (string, stringBufferSize, "FUID (0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4); break; case kCLASS_UID: default: + // length is 78 (with null-terminate) snprintf (string, stringBufferSize, "DECLARE_CLASS_IID (Interface, 0x%08X, 0x%08X, 0x%08X, 0x%08X)", l1, l2, l3, l4); diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h index 56cf292cbc..47f902f33a 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknown.h @@ -314,11 +314,6 @@ public: \param stringBufferSize is the size of the output string */ void print (int32 style, char8* string = nullptr, size_t stringBufferSize = 0) const; -#if SMTG_CPP17 - [[deprecated ("Use the print method with the buffer size")]] -#endif - void print (char8* string = nullptr, int32 style = kINLINE_UID) const; - template inline explicit FUID (const char (&uid)[N]) { diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h new file mode 100644 index 0000000000..35f109a0ba --- /dev/null +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/funknownimpl.h @@ -0,0 +1,470 @@ +//----------------------------------------------------------------------------- +// Flags : clang-format SMTGSequencer +// Project : SDK Core +// +// Category : SDK Core Interfaces +// Filename : pluginterfaces/base/funknownimpl.h +// Created by : Steinberg, 10/2021 +// Description : Steinberg Module Architecture Interface Implementation Helper +// +//----------------------------------------------------------------------------- +// This file is part of a Steinberg SDK. It is subject to the license terms +// in the LICENSE file found in the top-level directory of this distribution +// and at www.steinberg.net/sdklicenses. +// No part of the SDK, including this file, may be copied, modified, propagated, +// or distributed except according to the terms contained in the LICENSE file. +//----------------------------------------------------------------------------- + +#pragma once + +//------------------------------------------------------------------------ +#include "pluginterfaces/base/fplatform.h" +#include "pluginterfaces/base/funknown.h" +#include +#include + +//------------------------------------------------------------------------ +#if !(SMTG_CPP11) +#error "C++11 is required for this header" +#endif + +// clang-format off +/** +This header provides classes for working with FUnknown. + +An interface which shall support Steinbergs Module Architecture should inherit from U::Unknown and provide a typedef +@c IID of type U::UID. + +On OS X you can generate an U::UID and copy it to the clipboard with the following shell command: +@code +uuidgen | { read id; echo -n "using IID = U::UID<0x${id:0:8}, 0x${id:9:4}${id:14:4}, 0x${id:19:4}${id:24:4}, 0x${id:28:8}>;" ; } | pbcopy +@endcode + +Example: +@code{.cpp} +struct IFoo : public U::Unknown +{ + // Use a generated random uid here. + using IID = U::UID<0x01234567, 0x89012345, 0x67890123, 0x45678901>; + + virtual void bar () = 0; +}; +@endcode + +A class implementing the interface @c IFoo uses the U::Implements template to specify the +interfaces it implements. All interfaces which the class should derive from need to be listed in the +U::Directly template. + +Example: +@code{.cpp} +struct FooImpl : public U::Implements> +{ + void bar () override {} +}; +@endcode + +To check if a class can provide a specific interface use the U::cast function. + +Example: +@code{.cpp} +void test (U::Unknown* obj) +{ + if (auto foo = U::cast (obj)) + { + // obj provided IFoo + } +} +@endcode + +The U::Implements class supports a second template parameter U::Indirectly for specifying +a list of interfaces which should be available via @c queryInterface but not inherited from. +This is useful if an interface extends another interface. + +Example: +@code{.cpp} +struct IBar : public IFoo +{ + using IID = U::UID<0x11223344, 0x55667788, 0x99001122, 0x33445566>; + + virtual void baz () = 0; +}; + +struct BarImpl : public U::Implements, U::Indirectly> +{ + void bar () override {} + void baz () override {} +}; +@endcode + +In some cases a class shall be extended and an additional interface implemented. +This is possible with the U::Extends template which is a generalization of the U::Implements +template and allows specifying a base class from which should be inherited. + +Example: +@code{.cpp} +struct ITest : public U::Unknown +{ + using IID = U::UID<0x99887766, 0x55443322, 0x11009988, 0x77665544>; + + virtual bool equal (int a, int b) const = 0; +}; + +struct TestImpl : public U::Extends> +{ + bool equal (int a, int b) const override { return a == b; } +}; +@endcode + +To pass arbitrary arguments to the specified base class one can use the inherited @c Base +typedef. All arguments passed to @c Base are automatically perfectly forwarded to the base class. + +In the following example the value 42 is passed to the @c AlternativeFooImpl base class: +@code{.cpp} +struct AlternativeFooImpl : public U::Implements> +{ + AlternativeFooImpl (int dummy = 0) : dummy {dummy} {} + void bar () override {} + + int dummy; +}; + +struct AlternativeTestImpl : public U::Extends> +{ + AlternativeTestImpl () : Base {42} {} + + bool equal (int a, int b) const override { return a == b; } +}; +@endcode +*/ +// clang-format on + +//------------------------------------------------------------------------ +namespace Steinberg { +namespace FUnknownImpl { + +/** Typedef to keep everything in this namespace. */ +using Unknown = FUnknown; + +/** A base class which hides the FUnknown::iid static var */ +struct HideIIDBase : FUnknown +{ + using iid = void; +}; + +/** Common destroyer policy for ski object instances.*/ +struct Destroyer +{ + template + static void destroy (UnknownT* ptr) + { + if (!!ptr) + ptr->release (); + } +}; + +template +class ImplementsImpl; + +/** + * This class provides a compile-time uid and enables interfaces to specify a UID as a simple + * typedef. This way the FUID, DECLARE_CLASS_IID and DEF_CLASS_IID code can be omitted. + */ +template +struct UID +{ + enum : int8 + { + l1_1 = static_cast ((t1 & 0xFF000000) >> 24), + l1_2 = static_cast ((t1 & 0x00FF0000) >> 16), + l1_3 = static_cast ((t1 & 0x0000FF00) >> 8), + l1_4 = static_cast ((t1 & 0x000000FF)), + l2_1 = static_cast ((t2 & 0xFF000000) >> 24), + l2_2 = static_cast ((t2 & 0x00FF0000) >> 16), + l2_3 = static_cast ((t2 & 0x0000FF00) >> 8), + l2_4 = static_cast ((t2 & 0x000000FF)), + l3_1 = static_cast ((t3 & 0xFF000000) >> 24), + l3_2 = static_cast ((t3 & 0x00FF0000) >> 16), + l3_3 = static_cast ((t3 & 0x0000FF00) >> 8), + l3_4 = static_cast ((t3 & 0x000000FF)), + l4_1 = static_cast ((t4 & 0xFF000000) >> 24), + l4_2 = static_cast ((t4 & 0x00FF0000) >> 16), + l4_3 = static_cast ((t4 & 0x0000FF00) >> 8), + l4_4 = static_cast ((t4 & 0x000000FF)) + }; + + UID () = delete; + + static const TUID& toTUID () + { + // clang-format off + static TUID uuid = { +#if COM_COMPATIBLE + l1_4, l1_3, l1_2, l1_1, + l2_2, l2_1, l2_4, l2_3, +#else + l1_1, l1_2, l1_3, l1_4, + l2_1, l2_2, l2_3, l2_4, +#endif + l3_1, l3_2, l3_3, l3_4, + l4_1, l4_2, l4_3, l4_4 + }; + // clang-format on + return uuid; + } +}; + +/** @return the TUID for an interface. */ +template +const TUID& getTUID () +{ + return ::Steinberg::getTUID (); +} + +/** + * Checks if the given Unknown can provide the specified interface and returns it in an IPtr. + * + * @return an IPtr pointing to an instance of the requested interface or nullptr in case the + * object does not provide the interface. + */ +template +IPtr cast (Unknown* u) +{ + I* out = nullptr; + return u && u->queryInterface (getTUID (), reinterpret_cast (&out)) == kResultOk ? + owned (out) : + nullptr; +} + +/** Casts to Unknown* and then to the specified interface. */ +template +IPtr cast (ImplementsImpl* u) +{ + return cast (u->unknownCast ()); +} + +/** Casts to Unknown* and then to the specified interface. */ +template +IPtr cast (const IPtr& u) +{ + return cast (u.get ()); +} + +//------------------------------------------------------------------------ +namespace Detail { + +/** + * This struct implements reference counting for the @c U::Implements template. + * It also provides a @c queryInterface method stub to support @c queryInterface + * call made in the @c U::Implements template. + */ +struct RefCounted +{ +//------------------------------------------------------------------------ + RefCounted () = default; + RefCounted (const RefCounted&) {} + RefCounted (RefCounted&& other) SMTG_NOEXCEPT : refCount {other.refCount.load ()} {} + virtual ~RefCounted () = default; + + RefCounted& operator= (const RefCounted&) { return *this; } + RefCounted& operator= (RefCounted&& other) SMTG_NOEXCEPT + { + refCount = other.refCount.load (); + return *this; + } + + uint32 PLUGIN_API addRef () { return ++refCount; } + + uint32 PLUGIN_API release () + { + if (--refCount == 0) + { + destroyInstance (); + refCount = -1000; + delete this; + return 0; + } + return refCount; + } + +//------------------------------------------------------------------------ +private: + virtual void destroyInstance () {} + + std::atomic refCount {1}; +}; + +//------------------------------------------------------------------------ +struct NonDestroyable +{ +//------------------------------------------------------------------------ + NonDestroyable () = default; + virtual ~NonDestroyable () = default; + uint32 PLUGIN_API addRef () { return 1000; } + uint32 PLUGIN_API release () { return 1000; } + +private: + virtual void destroyInstance () {} +}; + +//------------------------------------------------------------------------ +template +struct QueryInterfaceEnd : T +{ +//------------------------------------------------------------------------ + tresult PLUGIN_API queryInterface (const TUID /*iid*/, void** obj) + { + *obj = nullptr; + return kNoInterface; + } +//------------------------------------------------------------------------ +}; + +//------------------------------------------------------------------------ +} // Detail + +/** + * This struct is used to group a list of interfaces from which should be inherited and which + * should be available via the @c queryInterface method. + */ +template +struct Directly +{ +}; + +/** + * This struct is used to group a list of interfaces from which should not be inherited but which + * should be available via the @c queryInterface method. + */ +template +struct Indirectly +{ +}; + +template +class ImplementsImpl +{ + static_assert (sizeof (Base) == -1, "use U::Directly and U::Indirectly to specify interfaces"); +}; + +template +class ImplementsImpl, Directly> +{ + static_assert (sizeof (Base) == -1, "U::Indirectly only allowed after U::Directly"); +}; + +/** This class implements the required virtual methods for the U::Unknown class. */ +template +class ImplementsImpl, Indirectly> +: public BaseClass, public I, public DirectIFs... +{ +public: +//------------------------------------------------------------------------ + /** + * This is a convenience typedef for the deriving class to pass arguments to the + * constructor, which are in turn passed to the base class of this class. + */ + using Base = ImplementsImpl, Indirectly>; + + template + ImplementsImpl (Args&&... args) : BaseClass {std::forward (args)...} + { + } + + tresult PLUGIN_API queryInterface (const TUID tuid, void** obj) override + { + if (!obj) + return kInvalidArgument; + + if (queryInterfaceImpl (tuid, *obj) || + queryInterfaceImpl (tuid, *obj)) + { + static_cast (*obj)->addRef (); + return kResultOk; + } + + return BaseClass::queryInterface (tuid, obj); + } + + uint32 PLUGIN_API addRef () override { return BaseClass::addRef (); } + uint32 PLUGIN_API release () override { return BaseClass::release (); } + + Unknown* unknownCast () { return static_cast (static_cast (this)); } + +//------------------------------------------------------------------------ +private: + template + inline constexpr bool match (const TUID tuid) const noexcept + { + return reinterpret_cast (tuid)[0] == + reinterpret_cast (getTUID ())[0] && + reinterpret_cast (tuid)[1] == + reinterpret_cast (getTUID ())[1]; + } + + template + inline constexpr bool queryInterfaceImpl (const TUID, void*&) const noexcept + { + return false; + } + + template + inline bool queryInterfaceImpl (const TUID tuid, void*& obj) noexcept + { + if (match (tuid) || match (tuid)) + { + obj = static_cast (this->unknownCast ()); + return true; + } + + obj = getInterface (tuid); + return obj != nullptr; + } + + template + inline constexpr void* getInterface (const TUID) const noexcept + { + return nullptr; + } + + template + inline void* getInterface (const TUID tuid) noexcept + { + return match (tuid) ? static_cast (this) : + getInterface (tuid); + } +}; + +/** This typedef enables using a custom base class with the interface implementation. */ +template > +using Extends = ImplementsImpl; + +/** This typedef provides the interface implementation. */ +template > +using Implements = ImplementsImpl, D, I>; + +/** This typedef provides the interface implementation for objects which should not be destroyed via + * FUnknown::release (like singletons). */ +template > +using ImplementsNonDestroyable = + ImplementsImpl, D, I>; + +//------------------------------------------------------------------------ +} // FUnknownImpl + +//------------------------------------------------------------------------ +/** Shortcut namespace for implementing FUnknown based objects. */ +namespace U { + +using Unknown = FUnknownImpl::HideIIDBase; +using FUnknownImpl::UID; +using FUnknownImpl::Extends; +using FUnknownImpl::Implements; +using FUnknownImpl::ImplementsNonDestroyable; +using FUnknownImpl::Directly; +using FUnknownImpl::Indirectly; +using FUnknownImpl::cast; +using FUnknownImpl::getTUID; + +//------------------------------------------------------------------------ +} // namespace U +} // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h index 491c93fbf0..c563817125 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/base/fvariant.h @@ -18,6 +18,7 @@ #include "pluginterfaces/base/fstrdefs.h" #include "pluginterfaces/base/funknown.h" +#include //------------------------------------------------------------------------ namespace Steinberg { @@ -249,9 +250,9 @@ inline void FVariant::empty () if (type & kOwner) { if ((type & kString8) && string8) - delete[] string8; + free (const_cast (string8)); // should match DELETESTR8 else if ((type & kString16) && string16) - delete[] string16; + free (const_cast (string16)); // should match DELETESTR16 else if ((type & kObject) && object) object->release (); @@ -268,14 +269,14 @@ inline FVariant& FVariant::operator= (const FVariant& variant) if ((type & kString8) && variant.string8) { - string8 = new char8[strlen (variant.string8) + 1]; + string8 = static_cast (malloc (strlen (variant.string8) + 1)); // should match NEWSTR8 strcpy (const_cast (string8), variant.string8); type |= kOwner; } else if ((type & kString16) && variant.string16) { auto len = static_cast (strlen16 (variant.string16)); - string16 = new char16[len + 1]; + string16 = static_cast (malloc ((len + 1) * sizeof (char16))); // should match NEWSTR16 char16* tmp = const_cast (string16); memcpy (tmp, variant.string16, len * sizeof (char16)); tmp[len] = 0; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h index 1f4651105f..741784327a 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstcomponent.h @@ -9,7 +9,7 @@ //----------------------------------------------------------------------------- // This file is part of a Steinberg SDK. It is subject to the license terms // in the LICENSE file found in the top-level directory of this distribution -// and at www.steinberg.net/sdklicenses. +// and at www.steinberg.net/sdklicenses. // No part of the SDK, including this file, may be copied, modified, propagated, // or distributed except according to the terms contained in the LICENSE file. //----------------------------------------------------------------------------- @@ -23,6 +23,7 @@ #include "pluginterfaces/base/falignpush.h" //------------------------------------------------------------------------ +//------------------------------------------------------------------------ namespace Steinberg { class IBStream; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h index 48128fbe90..271d4224c8 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivsteditcontroller.h @@ -9,7 +9,7 @@ //----------------------------------------------------------------------------- // This file is part of a Steinberg SDK. It is subject to the license terms // in the LICENSE file found in the top-level directory of this distribution -// and at www.steinberg.net/sdklicenses. +// and at www.steinberg.net/sdklicenses. // No part of the SDK, including this file, may be copied, modified, propagated, // or distributed except according to the terms contained in the LICENSE file. //----------------------------------------------------------------------------- @@ -46,30 +46,56 @@ namespace Vst { struct ParameterInfo { //------------------------------------------------------------------------ - ParamID id; ///< unique identifier of this parameter (named tag too) - String128 title; ///< parameter title (e.g. "Volume") - String128 shortTitle; ///< parameter shortTitle (e.g. "Vol") - String128 units; ///< parameter unit (e.g. "dB") - int32 stepCount; ///< number of discrete steps (0: continuous, 1: toggle, discrete value otherwise - ///< (corresponding to max - min, for example: 127 for a min = 0 and a max = 127) - see \ref vst3ParameterIntro) - ParamValue defaultNormalizedValue; ///< default normalized value [0,1] (in case of discrete value: defaultNormalizedValue = defDiscreteValue / stepCount) - UnitID unitId; ///< id of unit this parameter belongs to (see \ref vst3Units) + ParamID id; ///< unique identifier of this parameter (named tag too) + String128 title; ///< parameter title (e.g. "Volume") + String128 shortTitle; ///< parameter shortTitle (e.g. "Vol") + String128 units; ///< parameter unit (e.g. "dB") + int32 stepCount; ///< number of discrete steps (0: continuous, 1: toggle, discrete value + /// otherwise (corresponding to max - min, for example: + /// 127 for min = 0 and max = 127) - see \ref vst3ParameterIntro) + ParamValue defaultNormalizedValue; ///< default normalized value [0,1] + /// in case of discrete value: + /// defaultNormalizedValue = defDiscreteValue/stepCount + UnitID unitId; ///< id of unit this parameter belongs to (see \ref vst3Units) - int32 flags; ///< ParameterFlags (see below) - enum ParameterFlags + int32 flags; ///< ParameterFlags (see below) + + enum ParameterFlags : int32 { - kNoFlags = 0, ///< no flags wanted - kCanAutomate = 1 << 0, ///< parameter can be automated - kIsReadOnly = 1 << 1, ///< parameter cannot be changed from outside the plug-in (implies that kCanAutomate is NOT set) - kIsWrapAround = 1 << 2, ///< attempts to set the parameter value out of the limits will result in a wrap around [SDK 3.0.2] - kIsList = 1 << 3, ///< parameter should be displayed as list in generic editor or automation editing [SDK 3.1.0] - kIsHidden = 1 << 4, ///< parameter should be NOT displayed and cannot be changed from outside the plug-in - ///< (implies that kCanAutomate is NOT set and kIsReadOnly is set) [SDK 3.7.0] + /** No flags wanted. + * [SDK 3.0.0] */ + kNoFlags = 0, - kIsProgramChange = 1 << 15, ///< parameter is a program change (unitId gives info about associated unit - ///< - see \ref vst3ProgramLists) - kIsBypass = 1 << 16 ///< special bypass parameter (only one allowed): plug-in can handle bypass - ///< (highly recommended to export a bypass parameter for effect plug-in) + /** Parameter can be automated. + * [SDK 3.0.0] */ + kCanAutomate = 1 << 0, + + /** Parameter cannot be changed from outside the plug-in + * (implies that kCanAutomate is NOT set). + * [SDK 3.0.0] */ + kIsReadOnly = 1 << 1, + + /** Attempts to set the parameter value out of the limits will result in a wrap around. + * [SDK 3.0.2] */ + kIsWrapAround = 1 << 2, + + /** Parameter should be displayed as list in generic editor or automation editing. + * [SDK 3.1.0] */ + kIsList = 1 << 3, + /** Parameter should be NOT displayed and cannot be changed from outside the plug-in. + * It implies that kCanAutomate is NOT set and kIsReadOnly is set. + * [SDK 3.7.0] */ + kIsHidden = 1 << 4, + + /** Parameter is a program change (unitId gives info about associated unit - see \ref + * vst3ProgramLists). + * [SDK 3.0.0] */ + kIsProgramChange = 1 << 15, + + /** Special bypass parameter (only one allowed): plug-in can handle bypass. + * Highly recommended to export a bypass parameter for effect plug-in. + * [SDK 3.0.0] */ + kIsBypass = 1 << 16 }; //------------------------------------------------------------------------ }; @@ -83,90 +109,92 @@ const CString kEditor = "editor"; //------------------------------------------------------------------------ /** Flags used for IComponentHandler::restartComponent */ -enum RestartFlags +enum RestartFlags : int32 { /** The Component should be reloaded - * The host has to unload completely the plug-in (controller/processor) and reload it. - * [SDK 3.0.0] */ + * The host has to unload completely the plug-in (controller/processor) and reload it. + * [SDK 3.0.0] */ kReloadComponent = 1 << 0, - /** Input / Output Bus configuration has changed - * The plug-in informs the host that either the bus configuration or the bus count has changed. - * The host has to deactivate the plug-in, asks the plug-in for its wanted new bus configurations, - * adapts its processing graph and reactivate the plug-in. - * [SDK 3.0.0] */ - kIoChanged = 1 << 1, + /** Input/Output Bus configuration has changed + * The plug-in informs the host that either the bus configuration or the bus count has changed. + * The host has to deactivate the plug-in, asks the plug-in for its wanted new bus + * configurations, adapts its processing graph and reactivate the plug-in. + * [SDK 3.0.0] */ + kIoChanged = 1 << 1, /** Multiple parameter values have changed (as result of a program change for example) - * The host invalidates all caches of parameter values and asks the edit controller for the current values. - * [SDK 3.0.0] */ - kParamValuesChanged = 1 << 2, + * The host invalidates all caches of parameter values and asks the edit controller for the + * current values. + * [SDK 3.0.0] */ + kParamValuesChanged = 1 << 2, /** Latency has changed - * The plug informs the host that its latency has changed, getLatencySamples should return the new latency after setActive (true) was called - * The host has to deactivate and reactivate the plug-in, then afterwards the host could ask for the current latency (getLatencySamples) - * See IAudioProcessor::getLatencySamples - * [SDK 3.0.0] */ + * The plug informs the host that its latency has changed, getLatencySamples should return the new latency after setActive (true) was called + * The host has to deactivate and reactivate the plug-in, then afterwards the host could ask for the current latency (getLatencySamples) + * See IAudioProcessor::getLatencySamples + * [SDK 3.0.0] */ kLatencyChanged = 1 << 3, - /** Parameter titles, default values or flags (ParameterFlags) have changed - * The host invalidates all caches of parameter infos and asks the edit controller for the current infos. - * [SDK 3.0.0] */ - kParamTitlesChanged = 1 << 4, + /** Parameter titles (title, shortTitle and units), default values, stepCount or flags (ParameterFlags) have changed + * The host invalidates all caches of parameter infos and asks the edit controller for the + * current infos. + * [SDK 3.0.0] */ + kParamTitlesChanged = 1 << 4, /** MIDI Controllers and/or Program Changes Assignments have changed - * The plug-in informs the host that its MIDI-CC mapping has changed (for example after a MIDI learn or new loaded preset) - * or if the stepCount or UnitID of a ProgramChange parameter has changed. - * The host has to rebuild the MIDI-CC => parameter mapping (getMidiControllerAssignment) - * and reread program changes parameters (stepCount and associated unitID) - * [SDK 3.0.1] */ + * The plug-in informs the host that its MIDI-CC mapping has changed (for example after a MIDI learn or new loaded preset) + * or if the stepCount or UnitID of a ProgramChange parameter has changed. + * The host has to rebuild the MIDI-CC => parameter mapping (getMidiControllerAssignment) + * and reread program changes parameters (stepCount and associated unitID) + * [SDK 3.0.1] */ kMidiCCAssignmentChanged = 1 << 5, /** Note Expression has changed (info, count, PhysicalUIMapping, ...) - * Either the note expression type info, the count of note expressions or the physical UI mapping has changed. - * The host invalidates all caches of note expression infos and asks the edit controller for the current ones. - * See INoteExpressionController, NoteExpressionTypeInfo and INoteExpressionPhysicalUIMapping - * [SDK 3.5.0] */ + * Either the note expression type info, the count of note expressions or the physical UI mapping has changed. + * The host invalidates all caches of note expression infos and asks the edit controller for the current ones. + * See INoteExpressionController, NoteExpressionTypeInfo and INoteExpressionPhysicalUIMapping + * [SDK 3.5.0] */ kNoteExpressionChanged = 1 << 6, /** Input / Output bus titles have changed - * The host invalidates all caches of bus titles and asks the edit controller for the current titles. - * [SDK 3.5.0] */ + * The host invalidates all caches of bus titles and asks the edit controller for the current titles. + * [SDK 3.5.0] */ kIoTitlesChanged = 1 << 7, /** Prefetch support has changed - * The plug-in informs the host that its PrefetchSupport has changed - * The host has to deactivate the plug-in, calls IPrefetchableSupport::getPrefetchableSupport - * and reactivate the plug-in. - * See IPrefetchableSupport - * [SDK 3.6.1] */ + * The plug-in informs the host that its PrefetchSupport has changed + * The host has to deactivate the plug-in, calls IPrefetchableSupport::getPrefetchableSupport + * and reactivate the plug-in. + * See IPrefetchableSupport + * [SDK 3.6.1] */ kPrefetchableSupportChanged = 1 << 8, /** RoutingInfo has changed - * The plug-in informs the host that its internal routing (relation of an event-input-channel to - * an audio-output-bus) has changed. The host asks the plug-in for the new routing with - * IComponent::getRoutingInfo, \ref vst3Routing - * See IComponent - * [SDK 3.6.6] */ + * The plug-in informs the host that its internal routing (relation of an event-input-channel to + * an audio-output-bus) has changed. The host asks the plug-in for the new routing with + * IComponent::getRoutingInfo, \ref vst3Routing + * See IComponent + * [SDK 3.6.6] */ kRoutingInfoChanged = 1 << 9, /** Key switches has changed (info, count) - * Either the Key switches info, the count of Key switches has changed. - * The host invalidates all caches of Key switches infos and asks the edit controller - * (IKeyswitchController) for the current ones. - * See IKeyswitchController - * [SDK 3.7.3] */ + * Either the Key switches info, the count of Key switches has changed. + * The host invalidates all caches of Key switches infos and asks the edit controller + * (IKeyswitchController) for the current ones. + * See IKeyswitchController + * [SDK 3.7.3] */ kKeyswitchChanged = 1 << 10, /** Mapping of ParamID has changed - * The Plug-in informs the host that its parameters ID has changed. This has to be called by the - * edit controller in the method setComponentState or setState (during projects loading) when the - * plug-in detects that the given state was associated to an older version of the plug-in, or to a - * plug-in to replace (for ex. migrating VST2 => VST3), with a different set of parameter IDs, then - * the host could remap any used parameters like automation by asking the IRemapParamID interface - * (which extends IEditController). - * See IRemapParamID - * [SDK 3.7.11] */ + * The Plug-in informs the host that its parameters ID has changed. This has to be called by the + * edit controller in the method setComponentState or setState (during projects loading) when the + * plug-in detects that the given state was associated to an older version of the plug-in, or to a + * plug-in to replace (for ex. migrating VST2 => VST3), with a different set of parameter IDs, then + * the host could remap any used parameters like automation by asking the IRemapParamID interface + * (which extends IEditController). + * See IRemapParamID + * [SDK 3.7.11] */ kParamIDMappingChanged = 1 << 11 }; @@ -187,20 +215,21 @@ class IComponentHandler : public FUnknown public: //------------------------------------------------------------------------ /** To be called before calling a performEdit (e.g. on mouse-click-down event). - This must be called in the UI-Thread context! */ - virtual tresult PLUGIN_API beginEdit (ParamID id) = 0; + * This must be called in the UI-Thread context! */ + virtual tresult PLUGIN_API beginEdit (ParamID id /*in*/) = 0; /** Called between beginEdit and endEdit to inform the handler that a given parameter has a new * value. This must be called in the UI-Thread context! */ - virtual tresult PLUGIN_API performEdit (ParamID id, ParamValue valueNormalized) = 0; + virtual tresult PLUGIN_API performEdit (ParamID id /*in*/, + ParamValue valueNormalized /*in*/) = 0; /** To be called after calling a performEdit (e.g. on mouse-click-up event). - This must be called in the UI-Thread context! */ - virtual tresult PLUGIN_API endEdit (ParamID id) = 0; + * This must be called in the UI-Thread context! */ + virtual tresult PLUGIN_API endEdit (ParamID id /*in*/) = 0; /** Instructs host to restart the component. This must be called in the UI-Thread context! - \param flags is a combination of RestartFlags */ - virtual tresult PLUGIN_API restartComponent (int32 flags) = 0; + * @param[in] flags is a combination of RestartFlags */ + virtual tresult PLUGIN_API restartComponent (int32 flags /*in*/) = 0; //------------------------------------------------------------------------ static const FUID iid; @@ -220,10 +249,11 @@ One part handles: - Setting dirty state of the plug-in - Requesting the host to open the editor -The other part handles parameter group editing from the plug-in UI. It wraps a set of \ref IComponentHandler::beginEdit / -\ref Steinberg::Vst::IComponentHandler::performEdit / \ref Steinberg::Vst::IComponentHandler::endEdit functions (see \ref IComponentHandler) -which should use the same timestamp in the host when writing automation. -This allows for better synchronizing of multiple parameter changes at once. +The other part handles parameter group editing from the plug-in UI. It wraps a set of \ref +IComponentHandler::beginEdit / \ref Steinberg::Vst::IComponentHandler::performEdit / \ref +Steinberg::Vst::IComponentHandler::endEdit functions (see \ref IComponentHandler) which should use +the same timestamp in the host when writing automation. This allows for better synchronizing of +multiple parameter changes at once. \section IComponentHandler2Example Examples of different use cases @@ -269,25 +299,28 @@ hostHandler2->finishGroupEdit (); class IComponentHandler2 : public FUnknown { public: - //------------------------------------------------------------------------ - /** Tells host that the plug-in is dirty (something besides parameters has changed since last save), - if true the host should apply a save before quitting. */ - virtual tresult PLUGIN_API setDirty (TBool state) = 0; +//------------------------------------------------------------------------ + /** Tells host that the plug-in is dirty (something besides parameters has changed since last + * save), if true the host should apply a save before quitting. */ + virtual tresult PLUGIN_API setDirty (TBool state /*in*/) = 0; - /** Tells host that it should open the plug-in editor the next time it's possible. - You should use this instead of showing an alert and blocking the program flow (especially on loading projects). */ + /** Tells host that it should open the plug-in editor the next time it's possible. You should + * use this instead of showing an alert and blocking the program flow (especially on loading + * projects). */ virtual tresult PLUGIN_API requestOpenEditor (FIDString name = ViewType::kEditor) = 0; - //------------------------------------------------------------------------ +//------------------------------------------------------------------------ /** Starts the group editing (call before a \ref IComponentHandler::beginEdit), - the host will keep the current timestamp at this call and will use it for all \ref IComponentHandler::beginEdit - / \ref IComponentHandler::performEdit / \ref IComponentHandler::endEdit calls until a \ref finishGroupEdit (). */ + * the host will keep the current timestamp at this call and will use it for all + * \ref IComponentHandler::beginEdit, \ref IComponentHandler::performEdit, + * \ref IComponentHandler::endEdit calls until a \ref finishGroupEdit (). */ virtual tresult PLUGIN_API startGroupEdit () = 0; - /** Finishes the group editing started by a \ref startGroupEdit (call after a \ref IComponentHandler::endEdit). */ + /** Finishes the group editing started by a \ref startGroupEdit (call after a \ref + * IComponentHandler::endEdit). */ virtual tresult PLUGIN_API finishGroupEdit () = 0; - //------------------------------------------------------------------------ +//------------------------------------------------------------------------ static const FUID iid; }; @@ -322,8 +355,8 @@ class IComponentHandlerBusActivation : public FUnknown public: //------------------------------------------------------------------------ /** request the host to activate or deactivate a specific bus. */ - virtual tresult PLUGIN_API requestBusActivation (MediaType type, BusDirection dir, int32 index, - TBool state) = 0; + virtual tresult PLUGIN_API requestBusActivation (MediaType type /*in*/, BusDirection dir /*in*/, + int32 index /*in*/, TBool state /*in*/) = 0; //------------------------------------------------------------------------ static const FUID iid; @@ -342,10 +375,10 @@ DECLARE_CLASS_IID (IComponentHandlerBusActivation, 0x067D02C1, 0x5B4E274D, 0xA92 Allows the plug-in to request the host to create a progress for some specific tasks which take some time. The host can visualize the progress as read-only UI elements. For example, after loading a project where a plug-in needs to load extra -data (e.g. samples) in a background thread, this enables the host to get and visualize the current status of the loading -progress and to inform the user when the loading is finished. -Note: During the progress, the host can unload the plug-in at any time. Make sure that the plug-in -supports this use case. +data (e.g. samples) in a background thread, this enables the host to get and visualize the current +status of the loading progress and to inform the user when the loading is finished. Note: During the +progress, the host can unload the plug-in at any time. Make sure that the plug-in supports this use +case. \section IProgressExample Example @@ -356,18 +389,19 @@ supports this use case. FUnknownPtr progress (componentHandler); if (progress) - progress->start (IProgress::ProgressType::UIBackgroundTask, STR ("Load Samples..."), mProgressID); + progress->start (IProgress::ProgressType::UIBackgroundTask, STR ("Load Samples..."), + mProgressID); // ... myProgressValue += incProgressStep; FUnknownPtr progress (componentHandler); if (progress) - progress->update (mProgressID, myProgressValue); + progress->update (mProgressID, myProgressValue); // ... FUnknownPtr progress (componentHandler); if (progress) - progress->finish (mProgressID); + progress->finish (mProgressID); \endcode \see \ref IComponentHandler @@ -378,20 +412,26 @@ public: //------------------------------------------------------------------------ enum ProgressType : uint32 { - AsyncStateRestoration = 0, ///< plug-in state is restored async (in a background Thread) - UIBackgroundTask ///< a plug-in task triggered by a UI action + /** plug-in state is restored async (in a background Thread) */ + AsyncStateRestoration = 0, + + /** a plug-in task triggered by a UI action */ + UIBackgroundTask }; using ID = uint64; /** Start a new progress of a given type and optional Description. outID is as ID created by the * host to identify this newly created progress (for update and finish method) */ - virtual tresult PLUGIN_API start (ProgressType type, const tchar* optionalDescription, - ID& outID) = 0; + virtual tresult PLUGIN_API start (ProgressType type /*in*/, + const tchar* optionalDescription /*in*/, + ID& outID /*out*/) = 0; + /** Update the progress value (normValue between [0, 1]) associated to the given id */ - virtual tresult PLUGIN_API update (ID id, ParamValue normValue) = 0; + virtual tresult PLUGIN_API update (ID id /*in*/, ParamValue normValue /*in*/) = 0; + /** Finish the progress associated to the given id */ - virtual tresult PLUGIN_API finish (ID id) = 0; + virtual tresult PLUGIN_API finish (ID id /*in*/) = 0; //------------------------------------------------------------------------ static const FUID iid; @@ -406,55 +446,67 @@ DECLARE_CLASS_IID (IProgress, 0x00C9DC5B, 0x9D904254, 0x91A388C8, 0xB4E91B69) - [released: 3.0.0] - [mandatory] -The controller part of an effect or instrument with parameter handling (export, definition, conversion...). -\see \ref IComponent::getControllerClassId, \ref IMidiMapping +The controller part of an effect or instrument with parameter handling (export, definition, +conversion, ...). \see \ref IComponent::getControllerClassId, \ref IMidiMapping */ class IEditController : public IPluginBase { public: //------------------------------------------------------------------------ /** Receives the component state. */ - virtual tresult PLUGIN_API setComponentState (IBStream* state) = 0; + virtual tresult PLUGIN_API setComponentState (IBStream* state /*in*/) = 0; /** Sets the controller state. */ - virtual tresult PLUGIN_API setState (IBStream* state) = 0; + virtual tresult PLUGIN_API setState (IBStream* state /*in*/) = 0; /** Gets the controller state. */ - virtual tresult PLUGIN_API getState (IBStream* state) = 0; + virtual tresult PLUGIN_API getState (IBStream* state /*inout*/) = 0; // parameters ------------------------- /** Returns the number of parameters exported. */ virtual int32 PLUGIN_API getParameterCount () = 0; + /** Gets for a given index the parameter information. */ - virtual tresult PLUGIN_API getParameterInfo (int32 paramIndex, ParameterInfo& info /*out*/) = 0; + virtual tresult PLUGIN_API getParameterInfo (int32 paramIndex /*in*/, + ParameterInfo& info /*out*/) = 0; /** Gets for a given paramID and normalized value its associated string representation. */ - virtual tresult PLUGIN_API getParamStringByValue (ParamID id, ParamValue valueNormalized /*in*/, String128 string /*out*/) = 0; + virtual tresult PLUGIN_API getParamStringByValue (ParamID id /*in*/, + ParamValue valueNormalized /*in*/, + String128 string /*out*/) = 0; + /** Gets for a given paramID and string its normalized value. */ - virtual tresult PLUGIN_API getParamValueByString (ParamID id, TChar* string /*in*/, ParamValue& valueNormalized /*out*/) = 0; + virtual tresult PLUGIN_API getParamValueByString (ParamID id /*in*/, TChar* string /*in*/, + ParamValue& valueNormalized /*out*/) = 0; /** Returns for a given paramID and a normalized value its plain representation - (for example -6 for -6dB - see \ref vst3AutomationIntro). */ - virtual ParamValue PLUGIN_API normalizedParamToPlain (ParamID id, ParamValue valueNormalized) = 0; - /** Returns for a given paramID and a plain value its normalized value. (see \ref vst3AutomationIntro) */ - virtual ParamValue PLUGIN_API plainParamToNormalized (ParamID id, ParamValue plainValue) = 0; + * (for example -6 for -6dB - see \ref vst3AutomationIntro). */ + virtual ParamValue PLUGIN_API normalizedParamToPlain (ParamID id /*in*/, + ParamValue valueNormalized /*in*/) = 0; + + /** Returns for a given paramID and a plain value its normalized value. (see \ref + * vst3AutomationIntro). */ + virtual ParamValue PLUGIN_API plainParamToNormalized (ParamID id /*in*/, + ParamValue plainValue /*in*/) = 0; /** Returns the normalized value of the parameter associated to the paramID. */ - virtual ParamValue PLUGIN_API getParamNormalized (ParamID id) = 0; - /** Sets the normalized value to the parameter associated to the paramID. The controller must never - pass this value-change back to the host via the IComponentHandler. It should update the according - GUI element(s) only!*/ - virtual tresult PLUGIN_API setParamNormalized (ParamID id, ParamValue value) = 0; + virtual ParamValue PLUGIN_API getParamNormalized (ParamID id /*in*/) = 0; + + /** Sets the normalized value to the parameter associated to the paramID. The controller must + * never pass this value-change back to the host via the IComponentHandler. + * It should update the according GUI element(s) only! */ + virtual tresult PLUGIN_API setParamNormalized (ParamID id /*in*/, ParamValue value /*in*/) = 0; // handler ---------------------------- /** Gets from host a handler which allows the Plugin-in to communicate with the host. - Note: This is mandatory if the host is using the IEditController! */ - virtual tresult PLUGIN_API setComponentHandler (IComponentHandler* handler) = 0; + * Note: This is mandatory if the host is using the IEditController! */ + virtual tresult PLUGIN_API setComponentHandler (IComponentHandler* handler /*in*/) = 0; // view ------------------------------- - /** Creates the editor view of the plug-in, currently only "editor" is supported, see \ref ViewType. - The life time of the editor view will never exceed the life time of this controller instance. */ - virtual IPlugView* PLUGIN_API createView (FIDString name) = 0; + /** Creates the editor view of the plug-in, currently only "editor" is supported, see \ref + * ViewType. The life time of the editor view will never exceed the life time of this controller + * instance. */ + virtual IPlugView* PLUGIN_API createView (FIDString name /*in*/) = 0; //------------------------------------------------------------------------ static const FUID iid; @@ -462,23 +514,23 @@ public: DECLARE_CLASS_IID (IEditController, 0xDCD7BBE3, 0x7742448D, 0xA874AACC, 0x979C759E) +//------------------------------------------------------------------------ +/** \defgroup vst3typedef VST 3 Data Types */ +/*@{*/ +//------------------------------------------------------------------------ +/** Knob Mode Type */ +using KnobMode = int32; +/*@}*/ + //------------------------------------------------------------------------ /** Knob Mode */ -enum KnobModes +enum KnobModes : KnobMode { kCircularMode = 0, ///< Circular with jump to clicked position kRelativCircularMode, ///< Circular without jump to clicked position kLinearMode ///< Linear: depending on vertical movement }; -//------------------------------------------------------------------------ -/** \defgroup vst3typedef VST 3 Data Types */ -/*@{*/ -//------------------------------------------------------------------------ -/** Knob Mode Type */ -typedef int32 KnobMode; -/*@}*/ - //------------------------------------------------------------------------ /** Edit controller component interface extension: Vst::IEditController2 \ingroup vstIPlug vst310 @@ -495,20 +547,21 @@ and to open the plug-in about box or help documentation. class IEditController2 : public FUnknown { public: - /** Host could set the Knob Mode for the plug-in. Return kResultFalse means not supported mode. \see KnobModes. */ - virtual tresult PLUGIN_API setKnobMode (KnobMode mode) = 0; + /** Host could set the Knob Mode for the plug-in. Return kResultFalse means not supported mode. + * \see KnobModes. */ + virtual tresult PLUGIN_API setKnobMode (KnobMode mode /*in*/) = 0; - /** Host could ask to open the plug-in help (could be: opening a PDF document or link to a web page). - The host could call it with onlyCheck set to true for testing support of open Help. - Return kResultFalse means not supported function. */ - virtual tresult PLUGIN_API openHelp (TBool onlyCheck) = 0; + /** Host could ask to open the plug-in help (could be: opening a PDF document or link to a web + * page). The host could call it with onlyCheck set to true for testing support of open Help. + * Return kResultFalse means not supported function. */ + virtual tresult PLUGIN_API openHelp (TBool onlyCheck /*in*/) = 0; /** Host could ask to open the plug-in about box. - The host could call it with onlyCheck set to true for testing support of open AboutBox. - Return kResultFalse means not supported function. */ - virtual tresult PLUGIN_API openAboutBox (TBool onlyCheck) = 0; + * The host could call it with onlyCheck set to true for testing support of open AboutBox. + * Return kResultFalse means not supported function. */ + virtual tresult PLUGIN_API openAboutBox (TBool onlyCheck /*in*/) = 0; - //------------------------------------------------------------------------ +//------------------------------------------------------------------------ static const FUID iid; }; @@ -527,13 +580,13 @@ restrictions that can be avoided in software. Controller data in particular come and often ignored semantics. On top of this they can interfere with regular parameter automation and the host is unaware of what happens in the plug-in when passing MIDI controllers directly. -So any functionality that is to be controlled by MIDI controllers must be exported as regular parameter. -The host will transform incoming MIDI controller data using this interface and transmit them as regular -parameter change. This allows the host to automate them in the same way as other parameters. -CtrlNumber can be a typical MIDI controller value extended to some others values like pitchbend or -aftertouch (see \ref ControllerNumbers). -If the mapping has changed, the plug-in must call IComponentHandler::restartComponent (kMidiCCAssignmentChanged) -to inform the host about this change. +So any functionality that is to be controlled by MIDI controllers must be exported as regular +parameter. The host will transform incoming MIDI controller data using this interface and transmit +them as regular parameter change. This allows the host to automate them in the same way as other +parameters. CtrlNumber can be a typical MIDI controller value extended to some others values like +pitchbend or aftertouch (see \ref ControllerNumbers). If the mapping has changed, the plug-in must +call IComponentHandler::restartComponent (kMidiCCAssignmentChanged) to inform the host about this +change. \section IMidiMappingExample Example @@ -542,28 +595,33 @@ to inform the host about this change. // in myeditcontroller.h class MyEditController: public EditControllerEx1, public IMidiMapping { - //... - //---IMidiMapping--------------------------- - tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex, int16 channel, CtrlNumber midiControllerNumber, ParamID& id) SMTG_OVERRIDE; - //---Interface--------- - OBJ_METHODS (MyEditController, EditControllerEx1) - DEFINE_INTERFACES - DEF_INTERFACE (IMidiMapping) - END_DEFINE_INTERFACES (MyEditController) - REFCOUNT_METHODS (MyEditController) + //... + //---IMidiMapping--------------------------- + tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex, int16 channel, + CtrlNumber midiControllerNumber, + ParamID& id) override; + //---Interface--------- + OBJ_METHODS (MyEditController, EditControllerEx1) + DEFINE_INTERFACES + DEF_INTERFACE (IMidiMapping) + END_DEFINE_INTERFACES (MyEditController) + REFCOUNT_METHODS (MyEditController) }; //-------------------------------------- // in myeditcontroller.cpp -tresult PLUGIN_API MyEditController::getMidiControllerAssignment (int32 busIndex, int16 midiChannel, CtrlNumber midiControllerNumber, ParamID& tag) +tresult PLUGIN_API MyEditController::getMidiControllerAssignment (int32 busIndex, + int16 midiChannel, + CtrlNumber midiControllerNumber, + ParamID& tag) { - // for my first Event bus and for MIDI channel 0 and for MIDI CC Volume only - if (busIndex == 0 && midiChannel == 0 && midiControllerNumber == kCtrlVolume) - { - tag = kGainId; - return kResultTrue; - } - return kResultFalse; + // for my first Event bus and for MIDI channel 0 and for MIDI CC Volume only + if (busIndex == 0 && midiChannel == 0 && midiControllerNumber == kCtrlVolume) + { + tag = kGainId; + return kResultTrue; + } + return kResultFalse; } \endcode @@ -571,16 +629,20 @@ tresult PLUGIN_API MyEditController::getMidiControllerAssignment (int32 busIndex class IMidiMapping : public FUnknown { public: - /** Gets an (preferred) associated ParamID for a given Input Event Bus index, channel and MIDI Controller. - * @param[in] busIndex - index of Input Event Bus - * @param[in] channel - channel of the bus - * @param[in] midiControllerNumber - see \ref ControllerNumbers for expected values (could be bigger than 127) - * @param[in] id - return the associated ParamID to the given midiControllerNumber - */ - virtual tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex, int16 channel, - CtrlNumber midiControllerNumber, ParamID& id/*out*/) = 0; + /** Gets an (preferred) associated ParamID for a given Input Event Bus index, channel and MIDI + * Controller. + * @param[in] busIndex - index of Input Event Bus + * @param[in] channel - channel of the bus + * @param[in] midiControllerNumber - see \ref ControllerNumbers for expected values (could be + * bigger than 127) + * @param[out] id - return the associated ParamID to the given midiControllerNumber + */ + virtual tresult PLUGIN_API getMidiControllerAssignment (int32 busIndex /*in*/, + int16 channel /*in*/, + CtrlNumber midiControllerNumber /*in*/, + ParamID& id /*out*/) = 0; - //------------------------------------------------------------------------ +//------------------------------------------------------------------------ static const FUID iid; }; @@ -595,9 +657,9 @@ DECLARE_CLASS_IID (IMidiMapping, 0xDF0FF9F7, 0x49B74669, 0xB63AB732, 0x7ADBF5E5) - [optional] If this interface is implemented by the edit controller, and when performing edits from outside -the plug-in (host / remote) of a not automatable and not read-only, and not hidden flagged parameter (kind of helper parameter), -the host will start with a beginEditFromHost before calling setParamNormalized and end with an endEditFromHost. -Here the sequence that the host will call: +the plug-in (host / remote) of a not automatable and not read-only, and not hidden flagged parameter +(kind of helper parameter), the host will start with a beginEditFromHost before calling +setParamNormalized and end with an endEditFromHost. Here the sequence that the host will call: \section IEditControllerExample Example @@ -610,18 +672,19 @@ plugEditController->setParamNormalized (id, value + 0.1); plugEditController->endEditFromHost (id); \endcode -\see \ref IEditController +\see \ref IEditController */ class IEditControllerHostEditing : public FUnknown { public: - /** Called before a setParamNormalized sequence, a endEditFromHost will be call at the end of the editing action. */ - virtual tresult PLUGIN_API beginEditFromHost (ParamID paramID) = 0; + /** Called before a setParamNormalized sequence, a endEditFromHost will be call at the end of + * the editing action. */ + virtual tresult PLUGIN_API beginEditFromHost (ParamID paramID /*in*/) = 0; /** Called after a beginEditFromHost and a sequence of setParamNormalized. */ - virtual tresult PLUGIN_API endEditFromHost (ParamID paramID) = 0; + virtual tresult PLUGIN_API endEditFromHost (ParamID paramID /*in*/) = 0; - //------------------------------------------------------------------------ +//------------------------------------------------------------------------ static const FUID iid; }; @@ -641,7 +704,7 @@ class IComponentHandlerSystemTime : public FUnknown public: //------------------------------------------------------------------------ /** get the current systemTime (the same as the one used in ProcessContext::systemTime). */ - virtual tresult PLUGIN_API getSystemTime (int64& systemTime) = 0; + virtual tresult PLUGIN_API getSystemTime (int64& systemTime /*out*/) = 0; //------------------------------------------------------------------------ static const FUID iid; }; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstremapparamid.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstremapparamid.h index bf655d4e31..aafe9531c0 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstremapparamid.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/ivstremapparamid.h @@ -54,8 +54,10 @@ public: * @param[in] pluginToReplaceUID - TUID of plug-in (processor) that will be replaced * @param[in] oldParamID - paramID (or index for VST 2 plug-ins) to be replaced * @param[out] newParamID - contains the associated paramID to be used - * Return kResultTrue means that a compatible parameter is available - * Return kResultFalse means that NO compatible parameter is available + * + * @return kResultTrue if a compatible parameter is available (newParamID has the appropriate + * value, it could be the same than oldParamID), or kResultFalse if no compatible parameter is + * available (newParamID is undefined) */ virtual tresult PLUGIN_API getCompatibleParamID (const TUID pluginToReplaceUID /*in*/, ParamID oldParamID /*in*/, @@ -66,6 +68,7 @@ public: DECLARE_CLASS_IID (IRemapParamID, 0x2B88021E, 0x6286B646, 0xB49DF76A, 0x5663061C) + //------------------------------------------------------------------------ } // namespace Vst } // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h index ad70211d1a..077cd03c37 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vstspeaker.h @@ -271,16 +271,20 @@ const SpeakerArrangement k70_2 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeake const SpeakerArrangement k71_2 = k70_2 | kSpeakerLfe; const SpeakerArrangement k91Atmos = k71_2; // 9.1 Dolby Atmos (3D) +/** L R C Ls Rs Sl Sr Tfl Tfr */ // 7.0.2 (~ITU 2+7+0.0) +const SpeakerArrangement k70_2_TF = k70Music | kSpeakerTfl | kSpeakerTfr; + +/** L R C Lfe Ls Rs Sl Sr Tfl Tfr */ // 7.1.2 (~ITU 2+7+0.1) +const SpeakerArrangement k71_2_TF = k70_2_TF | kSpeakerLfe; + /** L R C Ls Rs Sl Sr Tfl Tfr Trc */ // 7.0.3 (ITU 3+7+0.0 Sound System F) -const SpeakerArrangement k70_3 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | - kSpeakerSl | kSpeakerSr | kSpeakerTfl | kSpeakerTfr | kSpeakerTrc; +const SpeakerArrangement k70_3 = k70_2_TF | kSpeakerTrc; /** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trc Lfe2 */ // 7.2.3 (ITU 3+7+0.2 Sound System F) const SpeakerArrangement k72_3 = k70_3 | kSpeakerLfe | kSpeakerLfe2; /** L R C Ls Rs Sl Sr Tfl Tfr Trl Trr */ // 7.0.4 (ITU 4+7+0.0 Sound System J) -const SpeakerArrangement k70_4 = kSpeakerL | kSpeakerR | kSpeakerC | kSpeakerLs | kSpeakerRs | kSpeakerSl | kSpeakerSr | - kSpeakerTfl | kSpeakerTfr | kSpeakerTrl | kSpeakerTrr; +const SpeakerArrangement k70_4 = k70_2_TF | kSpeakerTrl | kSpeakerTrr; /** L R C Lfe Ls Rs Sl Sr Tfl Tfr Trl Trr */ // 7.1.4 (ITU 4+7+0.1 Sound System J) const SpeakerArrangement k71_4 = k70_4 | kSpeakerLfe; @@ -502,6 +506,8 @@ const CString kString50_4_1 = "5.0.4.1"; const CString kString51_4_1 = "5.1.4.1"; const CString kString70_2 = "7.0.2"; const CString kString71_2 = "7.1.2"; +const CString kString70_2_TF = "7.0.2 Top Front"; +const CString kString71_2_TF = "7.1.2 Top Front"; const CString kString70_3 = "7.0.3"; const CString kString72_3 = "7.2.3"; const CString kString70_4 = "7.0.4"; @@ -605,6 +611,8 @@ const CString kString50_4_1S = "L R C Ls Rs Tfl Tfr Trl Trr Bfc"; const CString kString51_4_1S = "L R C LFE Ls Rs Tfl Tfr Trl Trr Bfc"; const CString kString70_2S = "L R C Ls Rs Sl Sr Tsl Tsr"; const CString kString71_2S = "L R C LFE Ls Rs Sl Sr Tsl Tsr"; +const CString kString70_2_TFS = "L R C Ls Rs Sl Sr Tfl Tfr"; +const CString kString71_2_TFS = "L R C LFE Ls Rs Sl Sr Tfl Tfr"; const CString kString70_3S = "L R C Ls Rs Sl Sr Tfl Tfr Trc"; const CString kString72_3S = "L R C LFE Ls Rs Sl Sr Tfl Tfr Trc LFE2"; const CString kString70_4S = "L R C Ls Rs Sl Sr Tfl Tfr Trl Trr"; @@ -939,6 +947,10 @@ inline SpeakerArrangement getSpeakerArrangementFromString (CString arrStr) return k70_2; if (!strcmp8 (arrStr, kString71_2)) return k71_2; + if (!strcmp8 (arrStr, kString70_2_TF)) + return k70_2_TF; + if (!strcmp8 (arrStr, kString71_2_TF)) + return k71_2_TF; if (!strcmp8 (arrStr, kString70_3)) return k70_3; if (!strcmp8 (arrStr, kString72_3)) @@ -1097,6 +1109,8 @@ inline CString getSpeakerArrangementString (SpeakerArrangement arr, bool withSpe case k51_6: return withSpeakersName ? kString51_6S : kString51_6; case k70_2: return withSpeakersName ? kString70_2S : kString70_2; case k71_2: return withSpeakersName ? kString71_2S : kString71_2; + case k70_2_TF: return withSpeakersName ? kString70_2_TFS : kString70_2_TF; + case k71_2_TF: return withSpeakersName ? kString71_2_TFS : kString71_2_TF; case k70_3: return withSpeakersName ? kString70_3S : kString70_3; case k72_3: return withSpeakersName ? kString72_3S : kString72_3; case k70_4: return withSpeakersName ? kString70_4S : kString70_4; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h index 243f02aa72..797cd24bb4 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/pluginterfaces/vst/vsttypes.h @@ -24,17 +24,18 @@ namespace Vst { //------------------------------------------------------------------------ /** VST 3 SDK Version */ #ifndef kVstVersionString -#define kVstVersionString "VST 3.7.11" ///< SDK version for PClassInfo2 +#define kVstVersionString "VST 3.7.12" ///< SDK version for PClassInfo2 #endif #define kVstVersionMajor 3 #define kVstVersionMinor 7 -#define kVstVersionSub 11 +#define kVstVersionSub 12 #define VST_VERSION ((kVstVersionMajor << 16) | (kVstVersionMinor << 8) | kVstVersionSub) // Versions History which allows to write such code: // #if VST_VERSION >= VST_3_6_5_VERSION +#define VST_3_7_12_VERSION 0x03070C #define VST_3_7_11_VERSION 0x03070B #define VST_3_7_10_VERSION 0x03070A #define VST_3_7_9_VERSION 0x030709 @@ -124,6 +125,7 @@ static SMTG_CONSTEXPR const uint32 SDKVersion = // Versions History which allows to write such code: // if constexpr (SDKVersion >= SDKVersion_3_6_5) { ... } +static SMTG_CONSTEXPR const uint32 SDKVersion_3_7_12 = VST_3_7_12_VERSION; static SMTG_CONSTEXPR const uint32 SDKVersion_3_7_11 = VST_3_7_11_VERSION; static SMTG_CONSTEXPR const uint32 SDKVersion_3_7_10 = VST_3_7_10_VERSION; static SMTG_CONSTEXPR const uint32 SDKVersion_3_7_9 = VST_3_7_9_VERSION; 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 b18b92fcd5..a48e1eef01 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 @@ -353,7 +353,7 @@ int run (int argc, char* argv[]) { writeToFile = true; #if SMTG_OS_WINDOWS - auto tmp = VST3::StringConvert::convert (valueMap[optOutputPath]); + auto tmp = Vst::StringConvert::convert (valueMap[optOutputPath]); auto outputFile = reinterpret_cast (tmp.data ()); #else auto outputFile = valueMap[optOutputPath]; @@ -400,7 +400,7 @@ Utf8Args toUtf8Args (int argc, wchar_t* wargv[]) for (int i = 0; i < argc; i++) { auto str = reinterpret_cast (wargv[i]); - utf8Args.push_back (VST3::StringConvert::convert (str)); + utf8Args.push_back (Steinberg::Vst::StringConvert::convert (str)); } return utf8Args; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp new file mode 100644 index 0000000000..28eacf1c69 --- /dev/null +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.cpp @@ -0,0 +1,121 @@ +//----------------------------------------------------------------------------- +// Flags : clang-format SMTGSequencer +// Project : VST SDK +// +// Category : Helpers +// Filename : public.sdk/source/common/commonstringconvert.cpp +// Created by : Steinberg, 07/2024 +// Description : c++11 unicode string convert functions +// +//----------------------------------------------------------------------------- +// LICENSE +// (c) 2024, Steinberg Media Technologies GmbH, All Rights Reserved +//----------------------------------------------------------------------------- +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Steinberg Media Technologies nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. +//----------------------------------------------------------------------------- + +#include "commonstringconvert.h" + +#include +#include +#include + +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + +//------------------------------------------------------------------------ +namespace Steinberg { +namespace StringConvert { + +//------------------------------------------------------------------------ +namespace { + +#if defined(_MSC_VER) && _MSC_VER >= 1900 +#define USE_WCHAR_AS_UTF16TYPE +using UTF16Type = wchar_t; +#else +using UTF16Type = char16_t; +#endif + +using Converter = std::wstring_convert, UTF16Type>; + +//------------------------------------------------------------------------ +Converter& converter () +{ + static Converter conv; + return conv; +} + +//------------------------------------------------------------------------ +} // anonymous + +//------------------------------------------------------------------------ +std::u16string convert (const std::string& utf8Str) +{ +#if defined(USE_WCHAR_AS_UTF16TYPE) + auto wstr = converter ().from_bytes (utf8Str); + return {wstr.data (), wstr.data () + wstr.size ()}; +#else + return converter ().from_bytes (utf8Str); +#endif +} + +//------------------------------------------------------------------------ +std::string convert (const std::u16string& str) +{ + return converter ().to_bytes (reinterpret_cast (str.data ()), + reinterpret_cast (str.data () + str.size ())); +} + +//------------------------------------------------------------------------ +std::string convert (const char* str, uint32_t max) +{ + std::string result; + if (str) + { + result.reserve (max); + for (uint32_t i = 0; i < max; ++i, ++str) + { + if (*str == 0) + break; + result += *str; + } + } + return result; +} + +//------------------------------------------------------------------------ +} // StringConvert +} // Steinberg + +#ifdef __clang__ +#pragma clang diagnostic pop +#elif defined(_MSC_VER) +#pragma warning(pop) +#endif diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h new file mode 100644 index 0000000000..2b2d8ca0e5 --- /dev/null +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/commonstringconvert.h @@ -0,0 +1,94 @@ +//----------------------------------------------------------------------------- +// Flags : clang-format SMTGSequencer +// Project : VST SDK +// +// Category : stringconvert +// Filename : public.sdk/source/common/commonstringconvert.h +// Created by : Steinberg, 07/2024 +// Description : read file routine +// +//----------------------------------------------------------------------------- +// LICENSE +// (c) 2024, Steinberg Media Technologies GmbH, All Rights Reserved +//----------------------------------------------------------------------------- +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistributions of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other materials provided with the distribution. +// * Neither the name of the Steinberg Media Technologies nor the names of its +// contributors may be used to endorse or promote products derived from this +// software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED +// OF THE POSSIBILITY OF SUCH DAMAGE. +//----------------------------------------------------------------------------- + +#pragma once + +#include +#include + +namespace Steinberg { +namespace StringConvert { + +//------------------------------------------------------------------------ +/** + * convert an UTF-8 string to an UTF-16 string + * + * @param utf8Str UTF-8 string + * + * @return UTF-16 string + */ +std::u16string convert (const std::string& utf8Str); + +//------------------------------------------------------------------------ +/** + * convert an UTF-16 string to an UTF-8 string + * + * @param str UTF-16 string + * + * @return UTF-8 string + */ +std::string convert (const std::u16string& str); + +//------------------------------------------------------------------------ +/** + * convert a ASCII string buffer to an UTF-8 string + * + * @param str ASCII string buffer + * @param max maximum characters in str + * + * @return UTF-8 string + */ +std::string convert (const char* str, uint32_t max); + +//------------------------------------------------------------------------ +/** + * convert a number to an UTF-16 string + * + * @param value number + * + * @return UTF-16 string + */ +template +std::u16string toString (NumberT value) +{ + auto u8str = std::to_string (value); + return StringConvert::convert (u8str); +} + +//------------------------------------------------------------------------ +} // namespace StringConvert +} // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp index 24c18869ff..add9a2b1ba 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/pluginview.cpp @@ -51,7 +51,6 @@ CPluginView::CPluginView (const ViewRect* _rect) //------------------------------------------------------------------------ CPluginView::~CPluginView () { - setFrame (nullptr); } //------------------------------------------------------------------------ @@ -97,4 +96,5 @@ tresult PLUGIN_API CPluginView::getSize (ViewRect* size) return kInvalidArgument; } -} // end of namespace +//------------------------------------------------------------------------ +} // namespace Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp index f1f0216ed4..ae082a88ce 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.cpp @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2024, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -40,11 +40,14 @@ #include "pluginterfaces/base/fplatform.h" #if SMTG_OS_WINDOWS -#include "public.sdk/source/vst/utility/stringconvert.h" +#include "commonstringconvert.h" #endif #include + +#if !SMTG_CPP17 #include +#endif namespace Steinberg { @@ -52,7 +55,7 @@ namespace Steinberg { std::string readFile (const std::string& path) { #if SMTG_OS_WINDOWS - auto u16Path = VST3::StringConvert::convert (path); + auto u16Path = StringConvert::convert (path); std::ifstream file (reinterpret_cast (u16Path.data ()), std::ios_base::in | std::ios_base::binary); #else @@ -74,7 +77,7 @@ std::string readFile (const std::string& path) std::stringstream buffer; buffer << file.rdbuf (); return buffer.str (); -#endif +#endif // SMTG_CPP17 } //------------------------------------------------------------------------ diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h index 8fe2ab925e..34ff7ff20f 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/common/readfile.h @@ -9,7 +9,7 @@ // //----------------------------------------------------------------------------- // LICENSE -// (c) 2023, Steinberg Media Technologies GmbH, All Rights Reserved +// (c) 2024, Steinberg Media Technologies GmbH, All Rights Reserved //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp index 266c08c3b3..78f52e0743 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/hostclasses.cpp @@ -53,7 +53,7 @@ HostApplication::HostApplication () //----------------------------------------------------------------------------- tresult PLUGIN_API HostApplication::getName (String128 name) { - return VST3::StringConvert::convert ("My VST3 HostApplication", name) ? kResultTrue : + return StringConvert::convert ("My VST3 HostApplication", name) ? kResultTrue : kInternalError; } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp index 88d910f6ff..28f819b46d 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module.cpp @@ -37,6 +37,7 @@ #include "module.h" #include "public.sdk/source/vst/utility/stringconvert.h" #include "public.sdk/source/vst/utility/optional.h" +#include "pluginterfaces/base/funknownimpl.h" #include #include @@ -69,18 +70,21 @@ FactoryInfo& FactoryInfo::operator= (PFactoryInfo&& other) noexcept //------------------------------------------------------------------------ std::string FactoryInfo::vendor () const noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; return StringConvert::convert (info.vendor, PFactoryInfo::kNameSize); } //------------------------------------------------------------------------ std::string FactoryInfo::url () const noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; return StringConvert::convert (info.url, PFactoryInfo::kURLSize); } //------------------------------------------------------------------------ std::string FactoryInfo::email () const noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; return StringConvert::convert (info.email, PFactoryInfo::kEmailSize); } @@ -145,8 +149,8 @@ PluginFactory::ClassInfos PluginFactory::classInfos () const noexcept Optional factoryInfo; ClassInfos classes; classes.reserve (count); - auto f3 = Steinberg::FUnknownPtr (factory); - auto f2 = Steinberg::FUnknownPtr (factory); + auto f3 = Steinberg::U::cast (factory); + auto f2 = Steinberg::U::cast (factory); Steinberg::PClassInfo ci; Steinberg::PClassInfo2 ci2; Steinberg::PClassInfoW ci3; @@ -228,6 +232,7 @@ Steinberg::uint32 ClassInfo::classFlags () const noexcept //------------------------------------------------------------------------ ClassInfo::ClassInfo (const PClassInfo& info) noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; data.classID = info.cid; data.cardinality = info.cardinality; data.category = StringConvert::convert (info.category, PClassInfo::kCategorySize); @@ -237,6 +242,7 @@ ClassInfo::ClassInfo (const PClassInfo& info) noexcept //------------------------------------------------------------------------ ClassInfo::ClassInfo (const PClassInfo2& info) noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; data.classID = info.cid; data.cardinality = info.cardinality; data.category = StringConvert::convert (info.category, PClassInfo::kCategorySize); @@ -252,6 +258,7 @@ ClassInfo::ClassInfo (const PClassInfo2& info) noexcept //------------------------------------------------------------------------ ClassInfo::ClassInfo (const PClassInfoW& info) noexcept { + namespace StringConvert = Steinberg::Vst::StringConvert; data.classID = info.cid; data.cardinality = info.cardinality; data.category = StringConvert::convert (info.category, PClassInfo::kCategorySize); diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp index 96b87979ac..2b08d7e888 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_linux.cpp @@ -35,8 +35,11 @@ //----------------------------------------------------------------------------- #include "module.h" -#include "../utility/optional.h" -#include "../utility/stringconvert.h" +#include "public.sdk/source/vst/utility/optional.h" +#include "public.sdk/source/vst/utility/stringconvert.h" + +#include "pluginterfaces/base/funknownimpl.h" + #include #include #include @@ -62,12 +65,12 @@ #include namespace filesystem = std::experimental::filesystem; -#else // USE_FILESYSTEM == 0 +#else // USE_EXPERIMENTAL_FS == 0 #include namespace filesystem = std::filesystem; -#endif // USE_FILESYSTEM +#endif // USE_EXPERIMENTAL_FS //------------------------------------------------------------------------ extern "C" { @@ -215,7 +218,7 @@ public: errorDescription = "Calling 'ModuleEntry' failed"; return false; } - auto f = Steinberg::FUnknownPtr (owned (factoryProc ())); + auto f = Steinberg::U::cast (owned (factoryProc ())); if (!f) { errorDescription = "Calling 'GetPluginFactory' returned nullptr"; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm index 8532906728..4d8062ee54 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_mac.mm @@ -286,7 +286,7 @@ void getApplicationModules (Module::PathList& result) //------------------------------------------------------------------------ void getModuleSnapshots (const std::string& path, Module::SnapshotList& result) { - auto nsString = [NSString stringWithUTF8String:path.data ()]; + auto* nsString = [NSString stringWithUTF8String:path.data ()]; if (!nsString) return; auto bundleUrl = [NSURL fileURLWithPath:nsString]; @@ -372,7 +372,7 @@ Module::SnapshotList Module::getSnapshots (const std::string& modulePath) //------------------------------------------------------------------------ Optional Module::getModuleInfoPath (const std::string& modulePath) { - auto nsString = [NSString stringWithUTF8String:modulePath.data ()]; + auto* nsString = [NSString stringWithUTF8String:modulePath.data ()]; if (!nsString) return {}; auto bundleUrl = [NSURL fileURLWithPath:nsString]; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp index ae1d03a7da..c3f276598d 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/hosting/module_win32.cpp @@ -34,9 +34,11 @@ // OF THE POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- -#include "../utility/optional.h" -#include "../utility/stringconvert.h" #include "module.h" +#include "public.sdk/source/vst/utility/optional.h" +#include "public.sdk/source/vst/utility/stringconvert.h" + +#include "pluginterfaces/base/funknownimpl.h" #include #include @@ -168,8 +170,11 @@ public: } //--- ----------------------------------------------------------------------- - HINSTANCE loadAsPackage (const std::string& inPath, const char* archString = architectureString) + HINSTANCE loadAsPackage (const std::string& inPath, std::string& errorDescription, + const char* archString = architectureString) { + namespace StringConvert = Steinberg::Vst::StringConvert; + filesystem::path p (inPath); auto filename = p.filename (); p /= "Contents"; @@ -179,34 +184,25 @@ public: HINSTANCE instance = LoadLibraryW (reinterpret_cast (wideStr.data ())); #if SMTG_CPU_ARM_64EC if (instance == nullptr) - instance = loadAsPackage (inPath, architectureArm64XString); + instance = loadAsPackage (inPath, errorDescription, architectureArm64XString); if (instance == nullptr) - instance = loadAsPackage (inPath, architectureX64String); + instance = loadAsPackage (inPath, errorDescription, architectureX64String); #endif + if (instance == nullptr) + getLastError (p.string (), errorDescription); return instance; } //--- ----------------------------------------------------------------------- HINSTANCE loadAsDll (const std::string& inPath, std::string& errorDescription) { + namespace StringConvert = Steinberg::Vst::StringConvert; + auto wideStr = StringConvert::convert (inPath); HINSTANCE instance = LoadLibraryW (reinterpret_cast (wideStr.data ())); if (instance == nullptr) { - auto lastError = GetLastError (); - LPVOID lpMessageBuffer {nullptr}; - if (FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, - nullptr, lastError, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), - (LPSTR)&lpMessageBuffer, 0, nullptr) > 0) - { - errorDescription = "LoadLibray failed: " + std::string ((char*)lpMessageBuffer); - LocalFree (lpMessageBuffer); - } - else - { - errorDescription = - "LoadLibrary failed with error number : " + std::to_string (lastError); - } + getLastError (inPath, errorDescription); } else { @@ -218,7 +214,7 @@ public: //--- ----------------------------------------------------------------------- bool load (const std::string& inPath, std::string& errorDescription) override { - // filesystem::u8path is deprecated in C++20 +// filesystem::u8path is deprecated in C++20 #if SMTG_CPP20 const filesystem::path tmp (inPath); #else @@ -227,7 +223,7 @@ public: if (filesystem::is_directory (tmp)) { // try as package (bundle) - mModule = loadAsPackage (inPath); + mModule = loadAsPackage (inPath, errorDescription); } else { @@ -250,7 +246,7 @@ public: errorDescription = "Calling 'InitDll' failed"; return false; } - auto f = Steinberg::FUnknownPtr (owned (factoryProc ())); + auto f = Steinberg::U::cast (owned (factoryProc ())); if (!f) { errorDescription = "Calling 'GetPluginFactory' returned nullptr"; @@ -261,6 +257,27 @@ public: } HINSTANCE mModule {nullptr}; + +private: + //--- ----------------------------------------------------------------------- + void getLastError (const std::string& inPath, std::string& errorDescription) + { + auto lastError = GetLastError (); + LPVOID lpMessageBuffer {nullptr}; + if (FormatMessageA (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, nullptr, + lastError, MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPSTR)&lpMessageBuffer, 0, nullptr) > 0) + { + errorDescription = "LoadLibraryW failed for path " + inPath + ": " + + std::string ((char*)lpMessageBuffer); + LocalFree (lpMessageBuffer); + } + else + { + errorDescription = "LoadLibraryW failed with error number: " + + std::to_string (lastError) + " for path " + inPath; + } + } }; //------------------------------------------------------------------------ @@ -323,6 +340,8 @@ bool isFolderSymbolicLink (const filesystem::path& p) //------------------------------------------------------------------------ Optional getKnownFolder (REFKNOWNFOLDERID folderID) { + namespace StringConvert = Steinberg::Vst::StringConvert; + PWSTR wideStr {}; if (FAILED (SHGetKnownFolderPath (folderID, 0, nullptr, &wideStr))) return {}; @@ -378,7 +397,7 @@ VST3::Optional resolveShellLink (const filesystem::path& p) void addToPathList (Module::PathList& pathList, const std::string& toAdd) { #if LOG_ENABLE - std::cout << "=> add: " << toAdd << "\n"; + std::cout << "=> add: " << toAdd << "\n"; #endif pathList.push_back (toAdd); @@ -525,6 +544,8 @@ Module::Ptr Module::create (const std::string& path, std::string& errorDescripti //------------------------------------------------------------------------ Module::PathList Module::getModulePaths () { + namespace StringConvert = Steinberg::Vst::StringConvert; + // find plug-ins located in common/VST3 PathList list; if (auto knownFolder = getKnownFolder (FOLDERID_UserProgramFilesCommon)) @@ -546,7 +567,7 @@ Module::PathList Module::getModulePaths () #endif findModules (path, list); } - + // find plug-ins located in VST3 (application folder) WCHAR modulePath[kIPPathNameMax]; GetModuleFileNameW (nullptr, modulePath, kIPPathNameMax); diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp index 75cf08c0a7..967e34618c 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.cpp @@ -12,35 +12,45 @@ //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, +// +// * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation +// this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of the Steinberg Media Technologies nor the names of its -// contributors may be used to endorse or promote products derived from this +// contributors may be used to endorse or promote products derived from this // software without specific prior written permission. -// +// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- -#include "stringconvert.h" -#include -#include -#include +#include "pluginterfaces/base/fplatform.h" -//------------------------------------------------------------------------ -namespace VST3 { +#if SMTG_OS_WINDOWS +#ifndef _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING +#define _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING +#endif +#endif // SMTG_OS_WINDOWS + +#include "public.sdk/source/vst/utility/stringconvert.h" +#include "public.sdk/source/common/commonstringconvert.h" + +#include +#include +#include + +namespace Steinberg { +namespace Vst { namespace StringConvert { //------------------------------------------------------------------------ @@ -53,6 +63,14 @@ using UTF16Type = wchar_t; using UTF16Type = char16_t; #endif +#ifdef __clang__ +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" +#elif defined(_MSC_VER) +#pragma warning(push) +#pragma warning(disable : 4996) +#endif + using Converter = std::wstring_convert, UTF16Type>; //------------------------------------------------------------------------ @@ -62,18 +80,19 @@ Converter& converter () return conv; } +#ifdef __clang__ +#pragma clang diagnostic pop +#elif defined(_MSC_VER) +#pragma warning(pop) +#endif + //------------------------------------------------------------------------ } // anonymous //------------------------------------------------------------------------ std::u16string convert (const std::string& utf8Str) { -#if defined(USE_WCHAR_AS_UTF16TYPE) - auto wstr = converter ().from_bytes (utf8Str); - return {wstr.data (), wstr.data () + wstr.size ()}; -#else - return converter ().from_bytes (utf8Str); -#endif + return Steinberg::StringConvert::convert (utf8Str); } //------------------------------------------------------------------------ @@ -122,27 +141,16 @@ std::string convert (const Steinberg::Vst::TChar* str, uint32_t max) //------------------------------------------------------------------------ std::string convert (const std::u16string& str) { - return converter ().to_bytes (reinterpret_cast (str.data ()), - reinterpret_cast (str.data () + str.size ())); + return Steinberg::StringConvert::convert (str); } //------------------------------------------------------------------------ std::string convert (const char* str, uint32_t max) { - std::string result; - if (str) - { - result.reserve (max); - for (uint32_t i = 0; i < max; ++i, ++str) - { - if (*str == 0) - break; - result += *str; - } - } - return result; + return Steinberg::StringConvert::convert (str, max); } //------------------------------------------------------------------------ -} // String -} // VST3 +} // StringConvert +} // Vst +} // Steinberg diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h index b3bc1ac65a..c9fbc90445 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/stringconvert.h @@ -12,24 +12,24 @@ //----------------------------------------------------------------------------- // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: -// -// * Redistributions of source code must retain the above copyright notice, +// +// * Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation +// this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // * Neither the name of the Steinberg Media Technologies nor the names of its -// contributors may be used to endorse or promote products derived from this +// contributors may be used to endorse or promote products derived from this // software without specific prior written permission. -// +// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. -// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, -// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, -// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, +// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE // OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED // OF THE POSSIBILITY OF SUCH DAMAGE. //----------------------------------------------------------------------------- @@ -39,19 +39,27 @@ #include "pluginterfaces/vst/vsttypes.h" #include -//------------------------------------------------------------------------ -namespace VST3 { +namespace Steinberg { +namespace Vst { namespace StringConvert { //------------------------------------------------------------------------ /** - * convert an UTF-8 string to an UTF-16 string - * - * @param utf8Str UTF-8 string - * - * @return UTF-16 string + * Forward to Steinberg::StringConvert::convert (...) */ -extern std::u16string convert (const std::string& utf8Str); +std::u16string convert (const std::string& utf8Str); + +//------------------------------------------------------------------------ +/** + * Forward to Steinberg::StringConvert::convert (...) + */ +std::string convert (const std::u16string& str); + +//------------------------------------------------------------------------ +/** + * Forward to Steinberg::StringConvert::convert (...) + */ +std::string convert (const char* str, uint32_t max); //------------------------------------------------------------------------ /** @@ -62,7 +70,7 @@ extern std::u16string convert (const std::string& utf8Str); * * @return true on success */ -extern bool convert (const std::string& utf8Str, Steinberg::Vst::String128 str); +bool convert (const std::string& utf8Str, Steinberg::Vst::String128 str); //------------------------------------------------------------------------ /** @@ -74,7 +82,7 @@ extern bool convert (const std::string& utf8Str, Steinberg::Vst::String128 str); * * @return true on success */ -extern bool convert (const std::string& utf8Str, Steinberg::Vst::TChar* str, +bool convert (const std::string& utf8Str, Steinberg::Vst::TChar* str, uint32_t maxCharacters); //------------------------------------------------------------------------ @@ -85,7 +93,7 @@ extern bool convert (const std::string& utf8Str, Steinberg::Vst::TChar* str, * * @return UTF-8 string */ -extern std::string convert (const Steinberg::Vst::TChar* str); +std::string convert (const Steinberg::Vst::TChar* str); //------------------------------------------------------------------------ /** @@ -96,28 +104,7 @@ extern std::string convert (const Steinberg::Vst::TChar* str); * * @return UTF-8 string */ -extern std::string convert (const Steinberg::Vst::TChar* str, uint32_t max); - -//------------------------------------------------------------------------ -/** - * convert an UTF-16 string to an UTF-8 string - * - * @param str UTF-16 string - * - * @return UTF-8 string - */ -extern std::string convert (const std::u16string& str); - -//------------------------------------------------------------------------ -/** - * convert a ASCII string buffer to an UTF-8 string - * - * @param str ASCII string buffer - * @param max maximum characters in str - * - * @return UTF-8 string - */ -extern std::string convert (const char* str, uint32_t max); +std::string convert (const Steinberg::Vst::TChar* str, uint32_t max); //------------------------------------------------------------------------ } // StringConvert @@ -133,15 +120,92 @@ inline const Steinberg::Vst::TChar* toTChar (const std::u16string& str) * convert a number to an UTF-16 string * * @param value number - * + * * @return UTF-16 string */ -template +template std::u16string toString (NumberT value) { auto u8str = std::to_string (value); return StringConvert::convert (u8str); } +//------------------------------------------------------------------------ +} // Vst +} // Steinberg + +//------------------------------------------------------------------------ +// Deprecated VST3 namespace +//------------------------------------------------------------------------ +namespace VST3 { +namespace StringConvert { + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline std::u16string convert (const std::string& utf8Str) +{ + return Steinberg::Vst::StringConvert::convert (utf8Str); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline std::string convert (const std::u16string& str) +{ + return Steinberg::Vst::StringConvert::convert (str); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline std::string convert (const char* str, uint32_t max) +{ + return Steinberg::Vst::StringConvert::convert (str, max); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline bool convert (const std::string& utf8Str, Steinberg::Vst::String128 str) +{ + return Steinberg::Vst::StringConvert::convert (utf8Str, str); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline bool convert (const std::string& utf8Str, Steinberg::Vst::TChar* str, uint32_t maxCharacters) +{ + return Steinberg::Vst::StringConvert::convert (utf8Str, str, maxCharacters); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline std::string convert (const Steinberg::Vst::TChar* str) +{ + return Steinberg::Vst::StringConvert::convert (str); +} + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::StringConvert::convert (...)") +inline std::string convert (const Steinberg::Vst::TChar* str, uint32_t max) +{ + return Steinberg::Vst::StringConvert::convert (str, max); +} + +//------------------------------------------------------------------------ +} // StringConvert + +//------------------------------------------------------------------------ +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::toTChar (...)") +inline const Steinberg::Vst::TChar* toTChar (const std::u16string& str) +{ + return Steinberg::Vst::toTChar (str); +} + +//------------------------------------------------------------------------ +template +SMTG_DEPRECATED_MSG ("Use Steinberg::Vst::toString (...)") +std::u16string toString (NumberT value) +{ + return Steinberg::Vst::toString (value); +} + //------------------------------------------------------------------------ } // VST3 diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/vst2persistence.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/vst2persistence.cpp index a6ccdb0098..5179628629 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/vst2persistence.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/utility/vst2persistence.cpp @@ -520,7 +520,7 @@ Optional tryVst2StateLoad (Steinberg::IBStream& stream, int32_t numPrograms; if (!(state >> numPrograms)) return {}; - if (numPrograms < 1) + if (numPrograms < 1 && fxMagic == bankMagic) return {}; int32_t currentProgram = 0; diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp index d2e5ffb1d9..e93faf4553 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vstcomponentbase.cpp @@ -36,6 +36,7 @@ #include "vstcomponentbase.h" #include "base/source/fstring.h" +#include "pluginterfaces/base/funknownimpl.h" namespace Steinberg { namespace Vst { @@ -129,8 +130,7 @@ tresult PLUGIN_API ComponentBase::notify (IMessage* message) //------------------------------------------------------------------------ IMessage* ComponentBase::allocateMessage () const { - FUnknownPtr hostApp (hostContext); - if (hostApp) + if (auto hostApp = U::cast (hostContext)) return Vst::allocateMessage (hostApp); return nullptr; } diff --git a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp index be32db509d..afdf97aec5 100644 --- a/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp +++ b/modules/juce_audio_processors/format_types/VST3_SDK/public.sdk/source/vst/vsteditcontroller.cpp @@ -36,6 +36,7 @@ #include "public.sdk/source/vst/vsteditcontroller.h" #include "base/source/updatehandler.h" +#include "pluginterfaces/base/funknownimpl.h" #include "pluginterfaces/base/ustring.h" #include @@ -363,8 +364,7 @@ tresult PLUGIN_API EditControllerEx1::getUnitInfo (int32 unitIndex, UnitInfo& in tresult EditControllerEx1::notifyUnitSelection () { tresult result = kResultFalse; - FUnknownPtr unitHandler (componentHandler); - if (unitHandler) + if (auto unitHandler = U::cast (componentHandler)) result = unitHandler->notifyUnitSelection (selectedUnit); return result; } @@ -389,8 +389,7 @@ ProgramList* EditControllerEx1::getProgramList (ProgramListID listId) const tresult EditControllerEx1::notifyProgramListChange (ProgramListID listId, int32 programIndex) { tresult result = kResultFalse; - FUnknownPtr unitHandler (componentHandler); - if (unitHandler) + if (auto unitHandler = U::cast (componentHandler)) result = unitHandler->notifyProgramListChange (listId, programIndex); return result; } @@ -478,8 +477,7 @@ void PLUGIN_API EditControllerEx1::update (FUnknown* changedUnknown, int32 /*mes auto* programList = FCast (changedUnknown); if (programList) { - FUnknownPtr unitHandler (componentHandler); - if (unitHandler) + if (auto unitHandler = U::cast (componentHandler)) unitHandler->notifyProgramListChange (programList->getID (), kAllProgramInvalid); } } diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h index b8eb6dcddd..db2c4f11d7 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -38,6 +38,11 @@ #error To build JUCE VST3 plug-ins on BSD you must use an external BSD-compatible VST3 SDK with JUCE_CUSTOM_VST3_SDK=1 #endif +// It's important to include this *before* any of the Steinberg headers. +// On Windows, the VST3 headers might end up defining `stricmp` as `_stricmp` before including +// or , which prevents the use of stricmp in JUCE source. +#include + // Wow, those Steinberg guys really don't worry too much about compiler warnings. JUCE_BEGIN_IGNORE_WARNINGS_LEVEL_MSVC (0, 4505 4702 6011 6031 6221 6386 6387 6330 6001 28199) @@ -83,7 +88,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-W#warnings", "-Wunused-but-set-variable", "-Wunused-function", "-Wunused-parameter", - "-Wzero-as-null-pointer-constant") + "-Wzero-as-null-pointer-constant", + "-Wdangling-else") #undef DEVELOPMENT #define DEVELOPMENT 0 // This avoids a Clang warning in Steinberg code about unused values @@ -157,10 +163,10 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-W#warnings", #include #endif -#pragma push_macro ("True") -#undef True -#pragma push_macro ("False") -#undef False + #pragma push_macro ("True") + #undef True + #pragma push_macro ("False") + #undef False JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wmultichar", "-Wfour-char-constants") @@ -173,6 +179,7 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-W#warnings", #include #include #include + #include #include #include #include @@ -190,8 +197,8 @@ JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-W#warnings", JUCE_END_IGNORE_WARNINGS_GCC_LIKE -#pragma pop_macro ("True") -#pragma pop_macro ("False") + #pragma pop_macro ("True") + #pragma pop_macro ("False") #if VST_VERSION >= 0x03060c // 3.6.12 #include