From 4fe7240eb2df4acd023baa4b83e69102f62dfba5 Mon Sep 17 00:00:00 2001 From: jules Date: Wed, 5 Feb 2014 16:20:57 +0000 Subject: [PATCH] Initial version of VST3 plugin support. --- .../MacOSX/JuceDemo.xcodeproj/project.pbxproj | 4 + .../Builds/VisualStudio2010/JuceDemo.vcxproj | 2 + .../VisualStudio2010/JuceDemo.vcxproj.filters | 6 + .../Builds/VisualStudio2012/JuceDemo.vcxproj | 2 + .../VisualStudio2012/JuceDemo.vcxproj.filters | 6 + .../Builds/VisualStudio2013/JuceDemo.vcxproj | 2 + .../VisualStudio2013/JuceDemo.vcxproj.filters | 6 + .../iOS/JuceDemo.xcodeproj/project.pbxproj | 12 +- .../Introjucer/JuceLibraryCode/BinaryData.cpp | 4 +- .../Introjucer/JuceLibraryCode/BinaryData.h | 2 +- .../BinaryData/AudioPluginXCodeScript.txt | 2 +- .../Source/Project/jucer_AudioPluginModule.h | 2 - .../audio plugin demo/Builds/Linux/Makefile | 14 +- .../JuceDemoPlugin.xcodeproj/project.pbxproj | 32 +- .../VisualStudio2005/JuceDemoPlugin.vcproj | 28 +- .../VisualStudio2008/JuceDemoPlugin.vcproj | 28 +- .../VisualStudio2008/JuceDemoPlugin.vcxproj | 61 +- .../JuceDemoPlugin.vcxproj.filters | 247 +-- extras/audio plugin demo/JuceDemoPlugin.jucer | 3 +- .../JuceLibraryCode/AppConfig.h | 8 +- .../Plugin Host.xcodeproj/project.pbxproj | 19 +- .../VisualStudio2010/Plugin Host.vcxproj | 2 + .../Plugin Host.vcxproj.filters | 6 + extras/audio plugin host/Plugin Host.jucer | 2 +- .../Builds/VisualStudio2008/juce_dll.vcproj | 2 + .../VST3/juce_VST3_Wrapper.cpp | 1521 +++++++++++++++++ .../VST3/juce_VST3_Wrapper.mm | 272 +++ .../juce_audio_plugin_client/juce_module_info | 5 +- .../utility/juce_CheckSettingMacros.h | 10 +- .../format_types/juce_VST3Common.h | 2 +- .../format_types/juce_VST3Headers.h | 1 - 31 files changed, 2136 insertions(+), 177 deletions(-) create mode 100644 modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp create mode 100644 modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm diff --git a/extras/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj b/extras/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj index 18ab84957a..601049efa9 100644 --- a/extras/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj +++ b/extras/Demo/Builds/MacOSX/JuceDemo.xcodeproj/project.pbxproj @@ -645,6 +645,7 @@ 95568D274244E02150C7F417 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V1.h"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"; sourceTree = "SOURCE_ROOT"; }; 9617B3B5FA9439D342F23ADC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AnimationDemo.cpp; path = ../../Source/Demos/AnimationDemo.cpp; sourceTree = "SOURCE_ROOT"; }; 96F43E8EB364D3E40689D368 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + 9750423DB3DB6570382DA3C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; 97C3A2B9575153E4CA0537B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectShowComponent.cpp"; path = "../../../../modules/juce_video/native/juce_win32_DirectShowComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; 9895036432E9AE55EE16323F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../../../modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; }; 989CD2B68A4EF90456E19ED9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; @@ -742,6 +743,7 @@ B1C05A8D59655916054612D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; B27A7B237782F9E15E4BF8D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../../../modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; B2BD3F284DBA9EDFFF80ECE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2C11FB8D4762ABB6CB9B934 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; B305C104F5A573E8AFEFA763 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; B341BC1AD30CCDDAD967EB0E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; B3569FEFF39695CCD1E060AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -1239,6 +1241,8 @@ 58FB0C4FE674CC5BB7B1DCA7, 8396EA11DD261260F1A96DF9, A6FADD9A009BA1F1D36239FD, + B2C11FB8D4762ABB6CB9B934, + 9750423DB3DB6570382DA3C1, 9B9E034C5761096ACB8A76C3, 73267FE8DDE50FD1E6E31ED4, 8AE56D2F4E33B015C3D73EB8, diff --git a/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj b/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj index 35aba9dc5b..88f4884977 100644 --- a/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj +++ b/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj @@ -1344,6 +1344,8 @@ + + diff --git a/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj.filters b/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj.filters index 5102c57bc9..7ae84b5849 100644 --- a/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj.filters +++ b/extras/Demo/Builds/VisualStudio2010/JuceDemo.vcxproj.filters @@ -1863,6 +1863,12 @@ Juce Modules\juce_audio_processors\format_types + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types diff --git a/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj b/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj index 22581f7389..07f1e050e2 100644 --- a/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj +++ b/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj @@ -1350,6 +1350,8 @@ + + diff --git a/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj.filters b/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj.filters index 5102c57bc9..7ae84b5849 100644 --- a/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj.filters +++ b/extras/Demo/Builds/VisualStudio2012/JuceDemo.vcxproj.filters @@ -1863,6 +1863,12 @@ Juce Modules\juce_audio_processors\format_types + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types diff --git a/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj b/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj index be89ddfc49..4b5b158d7b 100644 --- a/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj +++ b/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj @@ -1350,6 +1350,8 @@ + + diff --git a/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj.filters b/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj.filters index ca027921a7..ec2c050287 100644 --- a/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj.filters +++ b/extras/Demo/Builds/VisualStudio2013/JuceDemo.vcxproj.filters @@ -1863,6 +1863,12 @@ Juce Modules\juce_audio_processors\format_types + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types diff --git a/extras/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj b/extras/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj index 20164d8f7a..6653908d2e 100644 --- a/extras/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj +++ b/extras/Demo/Builds/iOS/JuceDemo.xcodeproj/project.pbxproj @@ -636,6 +636,7 @@ 95568D274244E02150C7F417 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LookAndFeel_V1.h"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V1.h"; sourceTree = "SOURCE_ROOT"; }; 9617B3B5FA9439D342F23ADC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AnimationDemo.cpp; path = ../../Source/Demos/AnimationDemo.cpp; sourceTree = "SOURCE_ROOT"; }; 96F43E8EB364D3E40689D368 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; + 9750423DB3DB6570382DA3C1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; 97C3A2B9575153E4CA0537B7 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectShowComponent.cpp"; path = "../../../../modules/juce_video/native/juce_win32_DirectShowComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; 9895036432E9AE55EE16323F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_video.mm"; path = "../../../../modules/juce_video/juce_video.mm"; sourceTree = "SOURCE_ROOT"; }; 989CD2B68A4EF90456E19ED9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; @@ -731,6 +732,7 @@ B1C05A8D59655916054612D8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LiveConstantEditor.h"; path = "../../../../modules/juce_gui_extra/misc/juce_LiveConstantEditor.h"; sourceTree = "SOURCE_ROOT"; }; B27A7B237782F9E15E4BF8D5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_graphics.mm"; path = "../../../../modules/juce_graphics/juce_graphics.mm"; sourceTree = "SOURCE_ROOT"; }; B2BD3F284DBA9EDFFF80ECE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_KeyPress.cpp"; path = "../../../../modules/juce_gui_basics/keyboard/juce_KeyPress.cpp"; sourceTree = "SOURCE_ROOT"; }; + B2C11FB8D4762ABB6CB9B934 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; B305C104F5A573E8AFEFA763 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormat.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; B341BC1AD30CCDDAD967EB0E = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Synthesiser.h"; path = "../../../../modules/juce_audio_basics/synthesisers/juce_Synthesiser.h"; sourceTree = "SOURCE_ROOT"; }; B3569FEFF39695CCD1E060AC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -943,9 +945,7 @@ F1E995A1E00C6545A4C3297B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = KeyMappingsDemo.cpp; path = ../../Source/Demos/KeyMappingsDemo.cpp; sourceTree = "SOURCE_ROOT"; }; F29F6395C4935C1A663A1D15 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GZIPDecompressorInputStream.h"; path = "../../../../modules/juce_core/zip/juce_GZIPDecompressorInputStream.h"; sourceTree = "SOURCE_ROOT"; }; F380FE12E78619086BA33CDB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; - F42FE65C750920656EA22BF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; - F746F30147C6BE88F60E92CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../../../modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; - F9F4D5D9783B88F2DE889023 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../../../modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; + F91A3C07D81BE2D4A191C9A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../../../modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; FBCD860CD7113A3136B127C8 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreText.framework; path = System/Library/Frameworks/CoreText.framework; sourceTree = SDKROOT; }; 229D2DAADACF15540C3BBD15 = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = JuceDemo.app; sourceTree = "BUILT_PRODUCTS_DIR"; }; E34DFFF51D0F7C34FB826C4C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FloatVectorOperations.h"; path = "../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.h"; sourceTree = "SOURCE_ROOT"; }; @@ -958,6 +958,7 @@ F3A9E0AE5ED05CA1AD6F56E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SystemAudioVolume.h"; path = "../../../../modules/juce_audio_devices/audio_io/juce_SystemAudioVolume.h"; sourceTree = "SOURCE_ROOT"; }; F3AF542BB3A9E6CC1D6E37DD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; F3B746DC92EFE7A9B8EA9E43 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_UndoableAction.h"; path = "../../../../modules/juce_data_structures/undomanager/juce_UndoableAction.h"; sourceTree = "SOURCE_ROOT"; }; + F42FE65C750920656EA22BF8 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiTimer.h"; path = "../../../../modules/juce_events/timers/juce_MultiTimer.h"; sourceTree = "SOURCE_ROOT"; }; F43CED7548EE5C9F841CB1FA = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; F4676BB721F96DC5DDDAE746 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CoreAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_CoreAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; F48E6A27D809C49D42D3202C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -970,16 +971,17 @@ F667601C17DC912B73B817DE = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; }; F6DB1C1E0D9315245E87CBC2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Initialisation.h"; path = "../../../../modules/juce_events/messages/juce_Initialisation.h"; sourceTree = "SOURCE_ROOT"; }; F704F70F80BA62A48F3651BF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBasedDocument.h"; path = "../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.h"; sourceTree = "SOURCE_ROOT"; }; + F746F30147C6BE88F60E92CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JSON.cpp"; path = "../../../../modules/juce_core/javascript/juce_JSON.cpp"; sourceTree = "SOURCE_ROOT"; }; F753A7C2031832BB628CBB2B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_ALSA.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_linux_ALSA.cpp"; sourceTree = "SOURCE_ROOT"; }; F779C79AC37C83A60B997641 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; F843FC09B4C2A10C76D8D35C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginDirectoryScanner.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginDirectoryScanner.cpp"; sourceTree = "SOURCE_ROOT"; }; F881704607DB79F9A3CF7491 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Audio.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_android_Audio.cpp"; sourceTree = "SOURCE_ROOT"; }; F89584972F16A8EC49E5E74D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RelativeCoordinatePositioner.h"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativeCoordinatePositioner.h"; sourceTree = "SOURCE_ROOT"; }; - F91A3C07D81BE2D4A191C9A2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Timer.h"; path = "../../../../modules/juce_events/timers/juce_Timer.h"; sourceTree = "SOURCE_ROOT"; }; F965E478C21D19EF32760A9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; }; F97F775EDCD2D1C497625D4F = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Fonts.mm"; path = "../../../../modules/juce_graphics/native/juce_mac_Fonts.mm"; sourceTree = "SOURCE_ROOT"; }; F98BEA2FEE66A3DEAD9D43B1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_mac_SystemTrayIcon.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_mac_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; F99F73DEBB0EB724142FA930 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_PropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; + F9F4D5D9783B88F2DE889023 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SubregionStream.h"; path = "../../../../modules/juce_core/streams/juce_SubregionStream.h"; sourceTree = "SOURCE_ROOT"; }; FA5777F9FFCC6BE9D9F98874 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Desktop.h"; path = "../../../../modules/juce_gui_basics/components/juce_Desktop.h"; sourceTree = "SOURCE_ROOT"; }; FA8B6B0F6D43146BAAE04D4D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../../../modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; FAC5DDBFB00254C35D8987F2 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_gui_basics/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; @@ -1229,6 +1231,8 @@ 58FB0C4FE674CC5BB7B1DCA7, 8396EA11DD261260F1A96DF9, A6FADD9A009BA1F1D36239FD, + B2C11FB8D4762ABB6CB9B934, + 9750423DB3DB6570382DA3C1, 9B9E034C5761096ACB8A76C3, 73267FE8DDE50FD1E6E31ED4, 8AE56D2F4E33B015C3D73EB8, diff --git a/extras/Introjucer/JuceLibraryCode/BinaryData.cpp b/extras/Introjucer/JuceLibraryCode/BinaryData.cpp index 4accd3cf9b..ef5a35b4b6 100644 --- a/extras/Introjucer/JuceLibraryCode/BinaryData.cpp +++ b/extras/Introjucer/JuceLibraryCode/BinaryData.cpp @@ -18,7 +18,7 @@ static const unsigned char temp_binary_data_0[] = "# this looks inside the binary to detect which platforms are needed.. \r\n" "copyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\r\n" "copyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\r\n" -"copyVST3=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VST3Plugin' | wc -l`\r\n" +"copyVST3=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'GetPluginFactory' | wc -l`\r\n" "copyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\r\n" "copyAAX=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'ACFStartup' | wc -l`\r\n" "\r\n" @@ -1228,7 +1228,7 @@ const char* getNamedResource (const char* resourceNameUTF8, int& numBytes) throw switch (hash) { - case 0x44be9398: numBytes = 2910; return AudioPluginXCodeScript_txt; + case 0x44be9398: numBytes = 2916; return AudioPluginXCodeScript_txt; case 0x4a0cfd09: numBytes = 151; return background_tile_png; case 0x763d39dc: numBytes = 1050; return colourscheme_dark_xml; case 0xe8b08520: numBytes = 1050; return colourscheme_light_xml; diff --git a/extras/Introjucer/JuceLibraryCode/BinaryData.h b/extras/Introjucer/JuceLibraryCode/BinaryData.h index 644a262113..9b351817af 100644 --- a/extras/Introjucer/JuceLibraryCode/BinaryData.h +++ b/extras/Introjucer/JuceLibraryCode/BinaryData.h @@ -10,7 +10,7 @@ namespace BinaryData { extern const char* AudioPluginXCodeScript_txt; - const int AudioPluginXCodeScript_txtSize = 2910; + const int AudioPluginXCodeScript_txtSize = 2916; extern const char* background_tile_png; const int background_tile_pngSize = 151; diff --git a/extras/Introjucer/Source/BinaryData/AudioPluginXCodeScript.txt b/extras/Introjucer/Source/BinaryData/AudioPluginXCodeScript.txt index 4fb934c9ee..e4cf3dbdf8 100644 --- a/extras/Introjucer/Source/BinaryData/AudioPluginXCodeScript.txt +++ b/extras/Introjucer/Source/BinaryData/AudioPluginXCodeScript.txt @@ -7,7 +7,7 @@ original=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME # this looks inside the binary to detect which platforms are needed.. copyAU=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'AudioUnit' | wc -l` copyVST=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'VSTPlugin' | wc -l` -copyVST3=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'VST3Plugin' | wc -l` +copyVST3=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'GetPluginFactory' | wc -l` copyRTAS=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'CProcess' | wc -l` copyAAX=`nm -g "$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH" | grep -i 'ACFStartup' | wc -l` diff --git a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h index 35b6777bed..c6d3038acb 100644 --- a/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h +++ b/extras/Introjucer/Source/Project/jucer_AudioPluginModule.h @@ -277,8 +277,6 @@ namespace VSTHelpers for (ProjectExporter::ConfigIterator config (exporter); config.next();) { - config->getValue (Ids::msvcModuleDefinitionFile) = modulePath.getChildFile ("juce_VST3_WinExports.def").toWindowsStyle(); - if (config->getValue (Ids::useRuntimeLibDLL).getValue().isVoid()) config->getValue (Ids::useRuntimeLibDLL) = true; diff --git a/extras/audio plugin demo/Builds/Linux/Makefile b/extras/audio plugin demo/Builds/Linux/Makefile index bf69b3bc48..3d3b4b3e1e 100644 --- a/extras/audio plugin demo/Builds/Linux/Makefile +++ b/extras/audio plugin demo/Builds/Linux/Makefile @@ -18,12 +18,12 @@ ifeq ($(CONFIG),Debug) TARGET_ARCH := -march=native endif - CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules + CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I "~/SDKs/VST3 SDK" -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -g -ggdb -fPIC -O0 CXXFLAGS += $(CFLAGS) LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt LDDEPS := - RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules + RESFLAGS := -D "LINUX=1" -D "DEBUG=1" -D "_DEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I "~/SDKs/VST3 SDK" -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules TARGET := JuceDemoPlugin.so BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) @@ -39,12 +39,12 @@ ifeq ($(CONFIG),Release) TARGET_ARCH := -march=native endif - CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules + CPPFLAGS := $(DEPFLAGS) -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I "~/SDKs/VST3 SDK" -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules CFLAGS += $(CPPFLAGS) $(TARGET_ARCH) -fPIC -Os CXXFLAGS += $(CFLAGS) LDFLAGS += $(TARGET_ARCH) -L$(BINDIR) -L$(LIBDIR) -shared -fvisibility=hidden -L/usr/X11R6/lib/ -lX11 -lXext -lXinerama -lasound -ldl -lfreetype -lpthread -lrt LDDEPS := - RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules + RESFLAGS := -D "LINUX=1" -D "NDEBUG=1" -D "JUCER_LINUX_MAKE_7346DA2A=1" -D "JUCE_APP_VERSION=1.0.0" -D "JUCE_APP_VERSION_HEX=0x10000" -I /usr/include -I /usr/include/freetype2 -I "~/SDKs/VST3 SDK" -I ~/SDKs/vstsdk2.4 -I ../../JuceLibraryCode -I ../../../../modules TARGET := JuceDemoPlugin.so BLDCMD = $(CXX) -o $(OUTDIR)/$(TARGET) $(OBJECTS) $(LDFLAGS) $(RESOURCES) $(TARGET_ARCH) CLEANCMD = rm -rf $(OUTDIR)/$(TARGET) $(OBJDIR) @@ -65,6 +65,7 @@ OBJECTS := \ $(OBJDIR)/juce_gui_basics_90929794.o \ $(OBJDIR)/juce_gui_extra_b81d9e1c.o \ $(OBJDIR)/juce_PluginUtilities_65545a8.o \ + $(OBJDIR)/juce_VST3_Wrapper_788e19af.o \ $(OBJDIR)/juce_VST_Wrapper_8aa348b1.o \ .PHONY: clean @@ -154,6 +155,11 @@ $(OBJDIR)/juce_PluginUtilities_65545a8.o: ../../../../modules/juce_audio_plugin_ @echo "Compiling juce_PluginUtilities.cpp" @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" +$(OBJDIR)/juce_VST3_Wrapper_788e19af.o: ../../../../modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp + -@mkdir -p $(OBJDIR) + @echo "Compiling juce_VST3_Wrapper.cpp" + @$(CXX) $(CXXFLAGS) -o "$@" -c "$<" + $(OBJDIR)/juce_VST_Wrapper_8aa348b1.o: ../../../../modules/juce_audio_plugin_client/VST/juce_VST_Wrapper.cpp -@mkdir -p $(OBJDIR) @echo "Compiling juce_VST_Wrapper.cpp" diff --git a/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj b/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj index deb6f88b79..162c1d26bb 100644 --- a/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj +++ b/extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj @@ -64,6 +64,8 @@ 1F20808BDEB51EAFFA12781B = {isa = PBXBuildFile; fileRef = 0444196DEC527454F5783BAD; }; 60CA6D3CBBC03A25C7B86C35 = {isa = PBXBuildFile; fileRef = 3755479207D218969425F91F; }; 0AA1C3259E16BA80C124622D = {isa = PBXBuildFile; fileRef = 1D4AFBEC703C6F373B292D9A; settings = {COMPILER_FLAGS = "-w"; }; }; + 080999E86692B638CD108D70 = {isa = PBXBuildFile; fileRef = 6CEFF94C7852DB3BFA5E29EB; }; + BFD65DA4F2FE24DF532304DA = {isa = PBXBuildFile; fileRef = 7D08D5465E74DF02EA4E7410; }; 6AAB8C946DA0E3E1B96EEF7E = {isa = PBXBuildFile; fileRef = 1E496F7BF3B3C59E5ECACCDE; }; BCFB9D694F4DD8A76C6B9878 = {isa = PBXBuildFile; fileRef = 8EB324480D60B3E3A81541E5; }; 002643D66417E4FFF5CC516A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MathsFunctions.h"; path = "../../../../modules/juce_core/maths/juce_MathsFunctions.h"; sourceTree = "SOURCE_ROOT"; }; @@ -433,6 +435,7 @@ 6A2DA68C812379D32A014951 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_Files.cpp"; path = "../../../../modules/juce_core/native/juce_win32_Files.cpp"; sourceTree = "SOURCE_ROOT"; }; 6A3C840E1B6CD34CA8C8DB4B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GroupComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_GroupComponent.h"; sourceTree = "SOURCE_ROOT"; }; 6A593B7ADFAC09D547EA809D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = AUCarbonViewBase.cpp; path = Extras/CoreAudio/AudioUnits/AUPublic/AUCarbonViewBase/AUCarbonViewBase.cpp; sourceTree = "DEVELOPER_DIR"; }; + 6A72E46DBDCFAD6F7039E739 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; 6A7D750E4C8BF2580F262F76 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XMLCodeTokeniser.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_XMLCodeTokeniser.cpp"; sourceTree = "SOURCE_ROOT"; }; 6AAAA6BD093B9CCD11BC26EC = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ListenerList.h"; path = "../../../../modules/juce_events/broadcasters/juce_ListenerList.h"; sourceTree = "SOURCE_ROOT"; }; 6B5564F5E6A5B70B890C146D = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WindowsMediaAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_WindowsMediaAudioFormat.h"; sourceTree = "SOURCE_ROOT"; }; @@ -440,6 +443,7 @@ 6C5452492262FE01944BE60C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TableHeaderComponent.h"; path = "../../../../modules/juce_gui_basics/widgets/juce_TableHeaderComponent.h"; sourceTree = "SOURCE_ROOT"; }; 6C8619FFBFA374CE3A374481 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiMessage.cpp"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiMessage.cpp"; sourceTree = "SOURCE_ROOT"; }; 6CE9C1799C65E997A35E22CD = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAAUParameter.h; path = Extras/CoreAudio/PublicUtility/CAAUParameter.h; sourceTree = "DEVELOPER_DIR"; }; + 6CEFF94C7852DB3BFA5E29EB = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_VST3_Wrapper.cpp"; path = "../../../../modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp"; sourceTree = "SOURCE_ROOT"; }; 6D085AD80CA57F2F8A5C393B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUDispatch.h; path = Extras/CoreAudio/AudioUnits/AUPublic/AUBase/AUDispatch.h; sourceTree = "DEVELOPER_DIR"; }; 6DD7B1CA8F5F2857F2210D04 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ImageConvolutionKernel.cpp"; path = "../../../../modules/juce_graphics/images/juce_ImageConvolutionKernel.cpp"; sourceTree = "SOURCE_ROOT"; }; 6E79399429D2A1B149CCB022 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserComponent.h"; sourceTree = "SOURCE_ROOT"; }; @@ -501,6 +505,7 @@ 7C8781DF19D1E9F5F4383C8B = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ToolbarButton.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_ToolbarButton.h"; sourceTree = "SOURCE_ROOT"; }; 7CAABF65B56BE6A4529B2513 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AppleRemote.h"; path = "../../../../modules/juce_gui_extra/misc/juce_AppleRemote.h"; sourceTree = "SOURCE_ROOT"; }; 7CBA5F2277845FDC3AABFEAD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_UIViewComponentPeer.mm"; path = "../../../../modules/juce_gui_basics/native/juce_ios_UIViewComponentPeer.mm"; sourceTree = "SOURCE_ROOT"; }; + 7D08D5465E74DF02EA4E7410 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_VST3_Wrapper.mm"; path = "../../../../modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm"; sourceTree = "SOURCE_ROOT"; }; 7D2452DC43894CAD497C0FA4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentBuilder.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentBuilder.cpp"; sourceTree = "SOURCE_ROOT"; }; 7D5CFA5B4C64986B875C71DC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_XmlDocument.cpp"; path = "../../../../modules/juce_core/xml/juce_XmlDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; 7DC4334C7DA62856B8E70B25 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -515,6 +520,7 @@ 80164398F844C51A6F8532F5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../../../modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; }; 8018BB0CE64058FD6D6D6EA6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Windowing.mm"; path = "../../../../modules/juce_gui_basics/native/juce_mac_Windowing.mm"; sourceTree = "SOURCE_ROOT"; }; 802E244849C0AE5DACD3FCCB = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_mac_CoreGraphicsHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_mac_CoreGraphicsHelpers.h"; sourceTree = "SOURCE_ROOT"; }; + 807E89E43737DE8DB65A4179 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; 80D58EDB557D5702F6D8749F = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ApplicationCommandManager.h"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandManager.h"; sourceTree = "SOURCE_ROOT"; }; 815230D20705ECC2BC4FF93A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; }; 81766EF7DB6CE1CB01017097 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -665,7 +671,6 @@ ACAD736DA78EA0A66BF1CE29 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TopLevelWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_TopLevelWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; ACB591F236B9E8054BF9ECB9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DialogWindow.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_DialogWindow.cpp"; sourceTree = "SOURCE_ROOT"; }; AD33682668F35136E9195684 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MidiMessage.h"; path = "../../../../modules/juce_audio_basics/midi/juce_MidiMessage.h"; sourceTree = "SOURCE_ROOT"; }; - AD4C568CF5706BEDBE181243 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; AD7E9320CE88BADD17DA949C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiOutput.cpp"; path = "../../../../modules/juce_audio_devices/midi_io/juce_MidiOutput.cpp"; sourceTree = "SOURCE_ROOT"; }; B2686DED597A081F237B1B1D = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioSampleBuffer.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioSampleBuffer.cpp"; sourceTree = "SOURCE_ROOT"; }; B43E810ABF9939F0F6E76318 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NewLine.h"; path = "../../../../modules/juce_core/text/juce_NewLine.h"; sourceTree = "SOURCE_ROOT"; }; @@ -687,6 +692,7 @@ ACC4E765AD4BF1D025FB4E83 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; ACD46CD092A8EC640448BD70 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferingAudioSource.cpp"; path = "../../../../modules/juce_audio_basics/sources/juce_BufferingAudioSource.cpp"; sourceTree = "SOURCE_ROOT"; }; ACDF0E99B316A7C266F6EFFD = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LAMEEncoderAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_LAMEEncoderAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; + AD4C568CF5706BEDBE181243 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; AE3318FE584B5928D1F10897 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Threads.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; AE3C497B58239EA75FD18AD9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_GlyphArrangement.h"; path = "../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"; sourceTree = "SOURCE_ROOT"; }; AEE273E29C5B07B96BAFFA46 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedArray.h"; path = "../../../../modules/juce_core/containers/juce_ReferenceCountedArray.h"; sourceTree = "SOURCE_ROOT"; }; @@ -1124,10 +1130,13 @@ D2B28401B2AF968A31121042 = {isa = PBXGroup; children = ( 1E496F7BF3B3C59E5ECACCDE, 8EB324480D60B3E3A81541E5, ); name = VST; sourceTree = ""; }; - A0988D15320C772CDF47FE3E = {isa = PBXGroup; children = ( + 7C26271A9DCC07B765B85F37 = {isa = PBXGroup; children = ( + 6CEFF94C7852DB3BFA5E29EB, + 7D08D5465E74DF02EA4E7410, ); name = VST3; sourceTree = ""; }; + 2BA0AE934C290AE78BF7B5F4 = {isa = PBXGroup; children = ( 1BAAB47A9C5B1D76D28FA282, DCF6DECFAD7F4D907C0458A5, ); name = AAX; sourceTree = ""; }; - 139649376A0174D40DD80EDB = {isa = PBXGroup; children = ( + B6DB58CA96E5A337FBF7C778 = {isa = PBXGroup; children = ( 7B870EE6D43B984CADE69C28, 94AA9AF4939F914AD00CEE1F, 58CEA1474B2E77B7287D735B, @@ -1139,8 +1148,9 @@ E96D0837CDD1CE8B768E4077, 4E83A3689ABB09F285F6FB2C, D2B28401B2AF968A31121042, - A0988D15320C772CDF47FE3E, - 139649376A0174D40DD80EDB, + 7C26271A9DCC07B765B85F37, + 2BA0AE934C290AE78BF7B5F4, + B6DB58CA96E5A337FBF7C778, 76781D53929F0C91E6FA34A9, E65E231978B796AA7868DC4A, ); name = "juce_audio_plugin_client"; sourceTree = ""; }; 57F611C99ED4CDF784F6A28F = {isa = PBXGroup; children = ( @@ -1167,6 +1177,8 @@ A9B46A5FF98D7B9DF8598C12, C19323831CE86566D60C725E, 9A6686BC6FC38F6D1917D7C7, + 807E89E43737DE8DB65A4179, + 6A72E46DBDCFAD6F7039E739, F6AE333028FC864D4653A7B5, 070E3EFE91BE8407EE1EBD8C, A9C466FBA4FCF6484BCF86A2, @@ -2032,6 +2044,8 @@ 0444196DEC527454F5783BAD, 3755479207D218969425F91F, 1D4AFBEC703C6F373B292D9A, + 6CEFF94C7852DB3BFA5E29EB, + 7D08D5465E74DF02EA4E7410, 1E496F7BF3B3C59E5ECACCDE, 8EB324480D60B3E3A81541E5, 8FB68CA43E49DD39E013DB82, ); name = "Juce Library Code"; sourceTree = ""; }; @@ -2078,7 +2092,7 @@ "JUCE_APP_VERSION_HEX=0x10000", ); GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GENERATE_PKGINFO_FILE = YES; - HEADER_SEARCH_PATHS = ("~/SDKs/vstsdk2.4", "../../JuceLibraryCode", "../../../../modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); + HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "~/SDKs/vstsdk2.4", "../../JuceLibraryCode", "../../../../modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; @@ -2107,7 +2121,7 @@ GCC_SYMBOLS_PRIVATE_EXTERN = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; GENERATE_PKGINFO_FILE = YES; - HEADER_SEARCH_PATHS = ("~/SDKs/vstsdk2.4", "../../JuceLibraryCode", "../../../../modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); + HEADER_SEARCH_PATHS = ("\"~/SDKs/VST3 SDK\"", "~/SDKs/vstsdk2.4", "../../JuceLibraryCode", "../../../../modules", "$(DEVELOPER_DIR)/Extras/CoreAudio/PublicUtility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/Utility", "$(DEVELOPER_DIR)/Extras/CoreAudio/AudioUnits/AUPublic/AUBase", "$(inherited)"); INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Library/Audio/Plug-Ins/Components/"; LIBRARY_STYLE = Bundle; @@ -2201,6 +2215,8 @@ C99CF7958D391CB2F97CC5F8, 60CA6D3CBBC03A25C7B86C35, 0AA1C3259E16BA80C124622D, + 080999E86692B638CD108D70, + BFD65DA4F2FE24DF532304DA, 6AAB8C946DA0E3E1B96EEF7E, BCFB9D694F4DD8A76C6B9878, ); runOnlyForDeploymentPostprocessing = 0; }; 95E57A758351FE57067B605F = {isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( @@ -2216,7 +2232,7 @@ CC4D3A6F1EF2934059AA9FEB, 221F46E90C0A8651AB76A0E5, B46C12D99498E9FA8F1D083A, ); runOnlyForDeploymentPostprocessing = 0; }; - E277BCF6E051A6008DD74155 = {isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; name = "Post-build script"; shellPath = /bin/sh; shellScript = "\n# This script takes the build product and copies it to the AU, VST, and RTAS folders, depending on \n# which plugin types you've built\n\noriginal=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\n\n# this looks inside the binary to detect which platforms are needed.. \ncopyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\ncopyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\ncopyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\ncopyAAX=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'ACFStartup' | wc -l`\n\nif [ $copyAU -gt 0 ]; then\n echo \"Copying to AudioUnit folder...\"\n AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component\n if [ -d \"$AU\" ]; then \n rm -r \"$AU\"\n fi\n\n cp -r \"$original\" \"$AU\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$AU/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$AU/Contents/$INFOPLIST_FILE\"\n\n # Fix info.plist for AUs built with Xcode 3\n if [ -f \"$DEVELOPER_DIR/Library/Developer/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp\" ]; then\n echo\n else\n echo \"Removing AudioComponents entry from Info.plist because this is not a new-format AU\"\n /usr/libexec/PlistBuddy -c \"Delete AudioComponents\" \"$AU/Contents/Info.plist\"\n fi\nfi\n\nif [ $copyVST -gt 0 ]; then\n echo \"Copying to VST folder...\"\n VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst\n if [ -d \"$VST\" ]; then \n rm -r \"$VST\"\n fi\n\n cp -r \"$original\" \"$VST\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST/Contents/$INFOPLIST_FILE\"\nfi\n\nif [ $copyRTAS -gt 0 ]; then\n echo \"Copying to RTAS folder...\"\n RTAS=/Library/Application\\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm\n if [ -d \"$RTAS\" ]; then\n rm -r \"$RTAS\"\n fi\n\n cp -r \"$original\" \"$RTAS\"\nfi\n\nif [ $copyAAX -gt 0 ]; then\n echo \"Copying to AAX folder...\"\n\n if [ -d \"/Applications/ProTools_3PDev/Plug-Ins\" ]; then\n AAX1=\"/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX1\" ]; then\n rm -r \"$AAX1\"\n fi\n\n cp -r \"$original\" \"$AAX1\"\n fi\n\n if [ -d \"/Library/Application Support/Avid/Audio/Plug-Ins\" ]; then\n AAX2=\"/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX2\" ]; then\n rm -r \"$AAX2\"\n fi\n\n cp -r \"$original\" \"$AAX2\"\n fi\nfi\n"; }; + E277BCF6E051A6008DD74155 = {isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; name = "Post-build script"; shellPath = /bin/sh; shellScript = "\n# This script takes the build product and copies it to the AU, VST, VST3, RTAS and AAX folders, depending on \n# which plugin types you've built\n\noriginal=$CONFIGURATION_BUILD_DIR/$FULL_PRODUCT_NAME\n\n# this looks inside the binary to detect which platforms are needed.. \ncopyAU=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'AudioUnit' | wc -l`\ncopyVST=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'VSTPlugin' | wc -l`\ncopyVST3=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'GetPluginFactory' | wc -l`\ncopyRTAS=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'CProcess' | wc -l`\ncopyAAX=`nm -g \"$CONFIGURATION_BUILD_DIR/$EXECUTABLE_PATH\" | grep -i 'ACFStartup' | wc -l`\n\nif [ $copyAU -gt 0 ]; then\n echo \"Copying to AudioUnit folder...\"\n AU=~/Library/Audio/Plug-Ins/Components/$PRODUCT_NAME.component\n if [ -d \"$AU\" ]; then \n rm -r \"$AU\"\n fi\n\n cp -r \"$original\" \"$AU\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$AU/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$AU/Contents/$INFOPLIST_FILE\"\n\n # Fix info.plist for AUs built with Xcode 3\n if [ -f \"$DEVELOPER_DIR/Library/Developer/CoreAudio/AudioUnits/AUPublic/AUBase/AUPlugInDispatch.cpp\" ]; then\n echo\n else\n echo \"Removing AudioComponents entry from Info.plist because this is not a new-format AU\"\n /usr/libexec/PlistBuddy -c \"Delete AudioComponents\" \"$AU/Contents/Info.plist\"\n fi\nfi\n\nif [ $copyVST -gt 0 ]; then\n echo \"Copying to VST folder...\"\n VST=~/Library/Audio/Plug-Ins/VST/$PRODUCT_NAME.vst\n if [ -d \"$VST\" ]; then \n rm -r \"$VST\"\n fi\n\n cp -r \"$original\" \"$VST\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST/Contents/$INFOPLIST_FILE\"\nfi\n\nif [ $copyVST3 -gt 0 ]; then\n echo \"Copying to VST3 folder...\"\n VST3=~/Library/Audio/Plug-Ins/VST3/$PRODUCT_NAME.vst3\n if [ -d \"$VST3\" ]; then \n rm -r \"$VST3\"\n fi\n\n cp -r \"$original\" \"$VST3\"\n sed -i \"\" -e 's/TDMwPTul/BNDLPTul/g' \"$VST3/Contents/PkgInfo\"\n sed -i \"\" -e 's/TDMw/BNDL/g' \"$VST3/Contents/$INFOPLIST_FILE\"\nfi\n\nif [ $copyRTAS -gt 0 ]; then\n echo \"Copying to RTAS folder...\"\n RTAS=/Library/Application\\ Support/Digidesign/Plug-Ins/$PRODUCT_NAME.dpm\n if [ -d \"$RTAS\" ]; then\n rm -r \"$RTAS\"\n fi\n\n cp -r \"$original\" \"$RTAS\"\nfi\n\nif [ $copyAAX -gt 0 ]; then\n echo \"Copying to AAX folder...\"\n\n if [ -d \"/Applications/ProTools_3PDev/Plug-Ins\" ]; then\n AAX1=\"/Applications/ProTools_3PDev/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX1\" ]; then\n rm -r \"$AAX1\"\n fi\n\n cp -r \"$original\" \"$AAX1\"\n fi\n\n if [ -d \"/Library/Application Support/Avid/Audio/Plug-Ins\" ]; then\n AAX2=\"/Library/Application Support/Avid/Audio/Plug-Ins/$PRODUCT_NAME.aaxplugin\"\n\n if [ -d \"$AAX2\" ]; then\n rm -r \"$AAX2\"\n fi\n\n cp -r \"$original\" \"$AAX2\"\n fi\nfi\n"; }; 27A65CD0B053616E226D4547 = {isa = PBXNativeTarget; buildConfigurationList = 92D1022F6276146FC92B4442; buildPhases = ( 0D832C784AB07BFDE57BCB92, D95827C1509280C88845BCB4, diff --git a/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj b/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj index f4f422e4bc..38345d2423 100644 --- a/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj +++ b/extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj @@ -31,9 +31,9 @@ Optimization="0" BufferSecurityCheck="" DebugInformationFormat="4" - AdditionalIncludeDirectories="..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4" + AdditionalIncludeDirectories="..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;c:\SDKs\VST3 SDK" PreprocessorDefinitions="WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2005_78A5003=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000" - RuntimeLibrary="1" + RuntimeLibrary="3" RuntimeTypeInfo="true" UsePrecompiledHeader="0" PrecompiledHeaderFile="$(IntDir)\JuceDemoPlugin.pch" @@ -54,7 +54,8 @@ ProgramDatabaseFile="$(IntDir)\JuceDemoPlugin.pdb" SubSystem="2" GenerateManifest="true" - TargetMachine="1"/> + TargetMachine="1" + AdditionalOptions="/FORCE:multiple"/> @@ -63,7 +64,9 @@ OutputFile="$(IntDir)\JuceDemoPlugin.bsc"/> - + + TargetMachine="1" + AdditionalOptions="/FORCE:multiple"/> @@ -121,7 +125,9 @@ OutputFile="$(IntDir)\JuceDemoPlugin.bsc"/> - + @@ -853,6 +859,9 @@ + + + @@ -975,6 +984,8 @@ + + @@ -4417,6 +4428,7 @@ CallingConvention="2"/> + diff --git a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj index 71ee390584..568171bdc7 100644 --- a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj +++ b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj @@ -31,9 +31,9 @@ Optimization="0" BufferSecurityCheck="" DebugInformationFormat="4" - AdditionalIncludeDirectories="..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4" + AdditionalIncludeDirectories="..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;c:\SDKs\VST3 SDK" PreprocessorDefinitions="WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2008_78A5006=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000" - RuntimeLibrary="1" + RuntimeLibrary="3" RuntimeTypeInfo="true" UsePrecompiledHeader="0" PrecompiledHeaderFile="$(IntDir)\JuceDemoPlugin.pch" @@ -54,7 +54,8 @@ ProgramDatabaseFile="$(IntDir)\JuceDemoPlugin.pdb" SubSystem="2" GenerateManifest="true" - TargetMachine="1"/> + TargetMachine="1" + AdditionalOptions="/FORCE:multiple"/> @@ -63,7 +64,9 @@ OutputFile="$(IntDir)\JuceDemoPlugin.bsc"/> - + + TargetMachine="1" + AdditionalOptions="/FORCE:multiple"/> @@ -121,7 +125,9 @@ OutputFile="$(IntDir)\JuceDemoPlugin.bsc"/> - + @@ -853,6 +859,9 @@ + + + @@ -975,6 +984,8 @@ + + @@ -4417,6 +4428,7 @@ CallingConvention="2"/> + diff --git a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj index bebf21f335..6bd18e4a9d 100644 --- a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj +++ b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj @@ -55,9 +55,9 @@ Disabled EditAndContinue - ..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2008_78A5006=1;%(PreprocessorDefinitions) - MultiThreadedDebug + ..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;c:\SDKs\VST3 SDK;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;DEBUG;_DEBUG;JUCER_VS2008_78A5006=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + MultiThreadedDebugDLL true @@ -79,11 +79,16 @@ $(IntDir)JuceDemoPlugin.pdb Windows MachineX86 + /FORCE:multiple %(AdditionalOptions) true $(IntDir)JuceDemoPlugin.bsc + + Post-build + copy /Y $(OutDir)$(TargetFileName) $(OutDir)$(TargetName).vst3 + @@ -99,9 +104,9 @@ MinSpace OnlyExplicitInline true - ..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;%(AdditionalIncludeDirectories) - WIN32;_WINDOWS;NDEBUG;JUCER_VS2008_78A5006=1;%(PreprocessorDefinitions) - MultiThreaded + ..\..\JuceLibraryCode;..\..\..\..\modules;c:\SDKs\vstsdk2.4;c:\SDKs\VST3 SDK;%(AdditionalIncludeDirectories) + WIN32;_WINDOWS;NDEBUG;JUCER_VS2008_78A5006=1;JUCE_APP_VERSION=1.0.0;JUCE_APP_VERSION_HEX=0x10000;%(PreprocessorDefinitions) + MultiThreadedDLL true @@ -125,11 +130,16 @@ true true MachineX86 + /FORCE:multiple %(AdditionalOptions) true $(IntDir)JuceDemoPlugin.bsc + + Post-build + copy /Y $(OutDir)$(TargetFileName) $(OutDir)$(TargetName).vst3 + @@ -554,6 +564,10 @@ true true + + true + true + true true @@ -570,6 +584,10 @@ true true + + true + true + true true @@ -1346,10 +1364,6 @@ true true - - true - true - true true @@ -1370,10 +1384,6 @@ true true - - true - true - true true @@ -1446,6 +1456,14 @@ true true + + true + true + + + true + true + true true @@ -1462,6 +1480,10 @@ true true + + true + true + true true @@ -1539,6 +1561,7 @@ StdCall StdCall + @@ -1619,6 +1642,8 @@ + + @@ -1700,11 +1725,13 @@ + + @@ -1920,14 +1947,12 @@ - - @@ -1943,6 +1968,8 @@ + + @@ -1951,6 +1978,7 @@ + @@ -1982,6 +2010,7 @@ + Document diff --git a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj.filters b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj.filters index 7d2ab9b571..54419e0482 100644 --- a/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj.filters +++ b/extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcxproj.filters @@ -2,289 +2,292 @@ - {c8ec114a-546e-478b-85a0-28d1cec7b292} + {7302d981-9ab7-4035-a012-46d3f149db11} - {1d847f59-3415-4d82-a907-62a217df4830} + {422625ef-ff96-4c0a-bce7-b6fae1d95c37} - {748fc495-c854-42ca-bb71-10488b6c2739} + {363867c4-7a8d-42ff-90e7-0a34aedda7c0} - {9b842c39-548e-4af1-997b-428269d11be3} + {c5b72dbc-1a19-4753-a2f1-e35339e73a1d} - {f6461547-cdae-4b04-93e7-647cd9e69724} + {08c7cd0a-f36a-4558-a475-265062f10106} - {cb2146cc-9552-4838-b217-1cbff736a30b} + {71557df6-366f-4ba4-aed7-ec51a8c19587} - {70b9a27a-8056-4449-bf4c-0ddca61a461a} + {85ff8c64-0324-41ba-90e8-9e2a25e7d579} - {fe8e436b-efc3-40f5-a797-f8ce5833513b} + {71f5cbfb-5aaa-4a05-b8e9-45f1c5146581} - {186797ce-c079-4cf2-be48-b4c5e04be512} + {b432c2e3-45bf-40cc-b67e-01f34bbb4e8a} - {945d2300-940c-4446-8186-48b8b6c368bd} + {f67cd35f-c87f-49f3-a6d5-241633679eec} - {ff5153b3-62f7-474f-99e3-869529dfa22a} + {a5d2d1a1-96ce-4cfe-a58d-bf7db51ba0c0} - {3757e944-7a49-4db3-b9e9-ce4ee4bb02d6} + {78484a6d-0bed-4ee2-a950-1820227a250c} - {00b3e647-0e46-4df3-9889-0a2225000d82} + {7550a13e-70ab-4d25-ba97-c9e0410de857} - {8ba035db-a2d8-4029-96cb-733202f011f2} + {1950d600-98ec-4b78-be29-11f26fa012eb} - {2c81cdf9-ec53-471a-a424-a176db367aac} + {3858a701-bd64-48b8-b1df-de1f0427ab5a} - {8f61744b-a5a2-494e-96fb-5ad281f16a1b} + {3e71ec37-9a1f-4995-a412-d0ceedf49678} - {7c91353d-1d19-414f-a05b-d43df94cd9c0} + {407b20ff-7fc6-4301-bba6-b5da6096ffb6} - {a36a35db-8033-4b05-8579-40a218d8386f} + {74672c28-9e98-4a1e-b314-386786965a99} - {fb78fa2d-d510-45e2-aadf-e1b23e545c9b} + {b34b045c-d4fa-4db7-8145-5682faaddb19} - {95c49ec3-4a05-45e5-9bcb-415b484855df} + {e51d9044-1828-4f90-9cbc-16b31600d4ea} - {a7bf5965-0732-4d74-baff-0adce162c5ae} + {b4ea8e28-87a5-40fa-b04d-19d3ae5037e9} - {d6140e83-5b90-4dfd-b71d-22ab8c246be6} + {ec1a62d4-df11-449f-9e4f-ca9436795dfe} + + + {995c1cea-60c0-499a-846b-0dddbfb9d7ea} - {413a9517-5492-41e8-b15a-edcf1c71ac4f} + {074316ac-366a-4516-9256-7189d40f3afb} - {534df12b-488f-48ba-8f75-d3fec3590eba} + {46371850-d113-430e-a3e6-1cdbfd375823} - {0a9bffb1-0942-4f22-bbea-b886c1caa362} + {ffcee8af-acaf-4a7c-a096-a27e831d0676} - {7583684d-e0f2-4e1d-8501-e310b6f40b25} + {2e3ff6dd-e8e8-4fb3-ad88-dbe376d18b9b} - {c661f65a-e899-493e-ba11-852e49e08863} + {a970de8b-dbd6-4fd0-b596-5c3ab5c22678} - {f0b4a99e-a537-4e86-8e70-fd26940ca0c7} + {235998ec-cdd0-4bca-9932-977eb780670f} - {18e4321b-7b27-429b-badf-636ec3865310} + {329c3d91-42fc-4ef1-b6e7-cbbe9dfbc458} - {9230c785-80fe-408e-98df-23d4f3fee808} + {852efaf6-047e-44d5-9b8d-afc084f05a64} - {87081e46-a9c8-4e75-be50-066f1b92a23e} + {3ee085ca-0f74-492f-aa07-a84e2bf09fdc} - {6469419b-6c5e-40b0-95d6-f4fccc72e1fc} + {982a88b6-6c7d-4d97-b60a-327a004bb51f} - {15fade10-55bf-4622-b49d-aa9038995587} + {92f3a62e-3c16-42b1-ac6b-126b35de440f} - {36f02c53-1f10-48e4-996b-66ddc716c2a1} + {73e8fef4-3549-42c1-9ff7-f07c6bf03db1} - {f664bc91-f02e-42cd-aedd-c2d81497f118} + {7c9c37bb-bb7c-4e93-a6aa-08d3038ad3d4} - {b3f63a0a-efa5-49e6-9d0c-5a313653d564} + {413df42f-350f-4982-9336-5c3b9f68d613} - {e7fdd172-05a1-4943-83f9-07a2dd985acd} + {cc9bd13b-c3e3-442a-a4bd-8f6f8a71a537} - {b346182a-ef3b-484e-9da7-e55d5df31dc0} + {1ae739c5-f8aa-475d-ad56-18f1579acb51} - {816f070d-7a9e-4a9a-bdd9-e0da32ee4c47} + {51390897-e740-4342-b31d-30b952012f6e} - {e86c02e2-c9fc-473d-9c7f-a7202cc615c6} + {d9ad508b-b11b-4a01-aec2-3e6e27ebeb1b} - {f739f01a-39c5-4113-8005-443e48a28f66} + {0ff24c75-86de-4d30-85a1-8b2214c2c77f} - {1087d3f2-35be-4685-90a1-bfffd05c7870} + {21d0a358-53e9-446f-8d4e-93c3db890b72} - {9ef4674a-d602-41ef-a495-568c835346ae} + {00c54af0-c50c-4f45-b0b5-10b22abb06a9} - {69973ac8-1475-4111-a22f-fe40d49a2566} + {36f9513d-9dd2-4113-912f-eb7ddb602801} - {f5d74f0b-c0a5-4a0d-9d13-dd7e572661b0} + {2f244932-f6bc-41c5-84fe-ac35e8379293} - {8b765bcb-b333-4862-bd4b-fb1ac45df162} + {8525f93f-b9cd-4fc6-9824-774a2812028d} - {091dc2d1-c9fe-4fce-93c6-b518e2a7dd2a} + {dd84af18-5ab3-4254-8b3a-0b2ad0097f81} - {1d5ca324-ac62-4ac1-b040-1fcbd3225392} + {e4ef84a9-4428-4d24-a735-3df23bc6c866} - {824fe6b8-41bc-45f9-9481-017b7fe8a712} + {650e4b49-a86d-4ad1-8981-668acc54c633} - {cd806fbc-2ee2-4b6b-b927-06e41e05ff41} + {df80a68b-8c9c-4bb2-af77-15640489f438} - {f7d2b4be-fd3e-4b68-b375-656808fc7dd7} + {703dd12e-aa27-4037-90c9-0f8f4e304a41} - {b84ababe-9483-4732-a94d-95b26d570d69} + {e4dfbe71-2f69-4f9c-acfe-bca26eb0624c} - {05a85658-4117-4bfd-8b0f-adc45e8512cc} + {237d1156-7b47-4325-be6f-71120b7878b4} - {14ff577c-8b51-4cfe-a471-567921f45013} + {05f70d36-9d60-4217-94bf-7b6aa7de8170} - {ecb57164-c374-490f-b13a-86f281062180} + {c7353cd9-bcab-487e-94b5-ca83af4d2e07} - {603984e5-6c34-428e-b87c-716aea526d3f} + {d4908d39-0a6e-41be-ae8a-c5f0b73fac1d} - {d99015e2-ef01-4619-abd6-f6cfe264db6f} + {383b1dee-beb6-4caa-8a06-a8cf1574026a} - {a3b221c0-0be9-4b4e-9e4d-c9aaa4a2b1f9} + {fb13f75e-3881-44fd-babe-fd49c6e86c1a} - {f5432c6f-16aa-436c-bf7c-c45669938416} + {25951b5e-7944-4147-adc7-5c11703707fd} - {35710809-ed20-4212-905d-6e1d3b6997e5} + {66db725a-ed61-4a3c-b031-ba673763b402} - {4f64c2bf-c0f1-41b5-a982-3fbc06d38cd5} + {78948a11-50bc-4d14-a707-712e4f9d8d43} - {e76cc498-5f3c-4d98-82fd-9591c3bc5186} + {b27abe90-6e98-430a-89b5-d739a7108f25} - {178423d9-e4d5-4260-a146-912380278b46} + {f4ed912e-eb27-4f1f-94fe-3f80cebf82f3} - {f60cc4d7-0551-4cfa-a913-63ebf48e1503} + {9263ed6b-5205-4984-96b4-c66796f7cb8e} - {a5780a03-5cf6-4885-91f7-16baf70a4133} + {81a517a3-c1b5-4091-90b2-a4af406a7cb4} - {d82e8d51-5205-4de5-a6dd-d59777009b2f} + {0a2ba031-5b4a-4f9a-86b9-dadb3bd72fa0} - {fc8d143c-9e5b-4fd0-9a31-b2938f981df2} + {1fc08374-c334-4a53-9f0d-b6621acb3178} - {748df48f-d556-46a8-a0d4-c859ab63b5b4} + {6d748cc0-308c-47f1-be18-32d261c021eb} - {13a1802b-fe8a-4651-b872-5955a7d65d72} + {d64b7982-3cd7-415b-be2a-e71b873b1278} - {2e99668b-a8bd-4903-b9b0-3079d40c3f65} + {1c6f28ff-6768-40a6-b0aa-abf369fda643} - {c6925c50-3259-48a4-af08-2edde182dd60} + {9382d72d-4126-4d5e-8fde-bf605f767f8d} - {82b26c26-9df2-4965-9a71-8cba8cf7c345} + {631d270a-3f38-4fd6-94e2-45cf755cb851} - {688e8b9c-2b21-42de-834f-279eefc61812} + {7f01f94a-57ab-4445-be95-f1253b07ab54} - {7ca372a6-5559-4c20-9dee-8039862b2a6e} + {ddb9099f-a554-4127-8e99-fefd00d2f8eb} - {98eed2aa-c3b6-4664-bd5d-e2ae1bd1008a} + {40bce866-18d0-48ea-8d42-190731d1a919} - {8697c35c-a3b2-4464-89c2-088ed2800c17} + {cc36d4f1-098c-4967-b98c-4be5e828d167} - {84972044-6fa3-4989-bbff-a21fffb9bfd3} + {b447706f-9d37-4cd0-b3fd-c9b5f032559e} - {e1408a6d-8b1f-43c3-b817-ee2274943bdd} + {ae95de4b-6b4b-49d9-8ba8-dac145f241b0} - {2de5d01d-682e-47dd-951d-637353503a06} + {77f081fb-ce12-4c76-bc9c-fd7aaf18b22c} - {f324b5ac-c687-49f2-b1f8-cf0b9a435ba4} + {b3d18887-99c6-4888-98c3-853bc84b4b1a} - {c2fc92b4-b923-4522-946a-dc59eb4b241c} + {175b08a2-d6d0-40f2-9d22-a3ae5c14265b} - {fcba6631-76e8-4dc7-8d3f-a95632e6bf5b} + {5ef21069-e050-4c2c-ada4-2af921a29ec3} - {fce0e1b2-a548-47c4-8d7b-f62c51b08ceb} + {cacf5d5c-2d85-40e4-b0fa-f53e6e980923} - {04322637-1369-4c70-ab33-55001a677821} + {19a7a661-7447-44aa-b7f0-3d1fb5d05ff3} - {829b022d-74d7-4d52-8945-b2b74f8838e4} + {93d32c6d-e45c-493c-b984-9ddccc5eb7f7} - {09bbe783-36a4-4f81-9aae-a1afb45b7e13} + {d5f4a407-bc6a-410f-88a1-892ddc68604d} - {9ebf82b9-f4be-433d-9141-00207403866d} + {f7ac64e0-258c-4638-a542-ad05e4e83ae6} - {b09cf7c9-f343-4d3f-a25b-6b05d8f9e0f7} + {72f2d0e6-3d2b-4f20-8aa6-66d33a35a824} - {f1d213f3-5efc-4ddb-84d8-c525858bbf9a} + {50537c22-b6cf-4150-b453-f2549cf1067e} - {0388013b-ce8d-4475-a65b-93c10daeb40c} + {9440aead-b412-49f8-b9e6-39d1526a9ddd} - {7f10bcc7-f275-43fc-b921-9a760dcf2c94} + {925ba4ce-7080-4e6d-87ee-fdaccc55623a} - {03c0ffdd-dca2-401c-bf9a-10a4d538053c} + {1c75b2be-25e2-4506-babc-54352f7b415a} - {097e63bd-50b9-4b39-9673-c4a37e25d9c9} + {f3d97e21-7f58-4796-a175-ea2e75a8e6c6} - {403b9e3d-5ed9-44e3-927b-35c54edc7205} + {e90783ca-5bf8-4508-bcb9-1642b0f9059d} - {341f351e-a3b7-4dfb-9695-f46f66490785} + {6929647b-619c-4070-a11e-47b37927828e} @@ -609,6 +612,9 @@ Juce Modules\juce_core\files + + Juce Modules\juce_core\files + Juce Modules\juce_core\files @@ -621,6 +627,9 @@ Juce Modules\juce_core\files + + Juce Modules\juce_core\files + Juce Modules\juce_core\network @@ -1203,9 +1212,6 @@ Juce Modules\juce_gui_basics\filebrowser - - Juce Modules\juce_gui_basics\filebrowser - Juce Modules\juce_gui_basics\filebrowser @@ -1221,9 +1227,6 @@ Juce Modules\juce_gui_basics\filebrowser - - Juce Modules\juce_gui_basics\filebrowser - Juce Modules\juce_gui_basics\commands @@ -1278,6 +1281,12 @@ Juce Modules\juce_gui_extra\code_editor + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + Juce Modules\juce_gui_extra\documents @@ -1290,6 +1299,9 @@ Juce Modules\juce_gui_extra\misc + + Juce Modules\juce_gui_extra\misc + Juce Modules\juce_gui_extra\misc @@ -1377,6 +1389,9 @@ Juce Library Code + + Juce Library Code + Juce Library Code @@ -1652,6 +1667,12 @@ Juce Modules\juce_audio_processors\format_types + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types @@ -1895,6 +1916,9 @@ Juce Modules\juce_core\files + + Juce Modules\juce_core\files + Juce Modules\juce_core\files @@ -1910,6 +1934,9 @@ Juce Modules\juce_core\files + + Juce Modules\juce_core\files + Juce Modules\juce_core\network @@ -2555,9 +2582,6 @@ Juce Modules\juce_gui_basics\filebrowser - - Juce Modules\juce_gui_basics\filebrowser - Juce Modules\juce_gui_basics\filebrowser @@ -2576,9 +2600,6 @@ Juce Modules\juce_gui_basics\filebrowser - - Juce Modules\juce_gui_basics\filebrowser - Juce Modules\juce_gui_basics\commands @@ -2624,6 +2645,12 @@ Juce Modules\juce_gui_extra\code_editor + + Juce Modules\juce_gui_extra\code_editor + + + Juce Modules\juce_gui_extra\code_editor + Juce Modules\juce_gui_extra\documents @@ -2648,6 +2675,9 @@ Juce Modules\juce_gui_extra\misc + + Juce Modules\juce_gui_extra\misc + Juce Modules\juce_gui_extra\misc @@ -2692,6 +2722,9 @@ Juce Modules\juce_audio_plugin_client\VST + + Juce Modules\juce_audio_plugin_client\VST3 + Juce Modules\juce_audio_plugin_client\AAX diff --git a/extras/audio plugin demo/JuceDemoPlugin.jucer b/extras/audio plugin demo/JuceDemoPlugin.jucer index 665025f332..9d76031ff6 100644 --- a/extras/audio plugin demo/JuceDemoPlugin.jucer +++ b/extras/audio plugin demo/JuceDemoPlugin.jucer @@ -11,7 +11,8 @@ bundleIdentifier="com.juce.JuceDemoPlugin" jucerVersion="3.1.0" companyName="Raw Material Software Ltd." aaxIdentifier="com.yourcompany.JuceDemoPlugin" buildAAX="0" pluginAAXCategory="AAX_ePlugInCategory_Dynamics" - includeBinaryInAppConfig="1"> + includeBinaryInAppConfig="1" buildVST3="1" pluginManufacturerWebsite="www.yourcompany.com" + pluginManufacturerEmail="support@yourcompany.com"> diff --git a/extras/audio plugin demo/JuceLibraryCode/AppConfig.h b/extras/audio plugin demo/JuceLibraryCode/AppConfig.h index 90e23cd3e6..59d69daaa4 100644 --- a/extras/audio plugin demo/JuceLibraryCode/AppConfig.h +++ b/extras/audio plugin demo/JuceLibraryCode/AppConfig.h @@ -180,7 +180,7 @@ #define JucePlugin_Build_VST 1 #endif #ifndef JucePlugin_Build_VST3 - #define JucePlugin_Build_VST3 0 + #define JucePlugin_Build_VST3 1 #endif #ifndef JucePlugin_Build_AU #define JucePlugin_Build_AU 1 @@ -200,6 +200,12 @@ #ifndef JucePlugin_Manufacturer #define JucePlugin_Manufacturer "Raw Material Software" #endif +#ifndef JucePlugin_ManufacturerWebsite + #define JucePlugin_ManufacturerWebsite "www.yourcompany.com" +#endif +#ifndef JucePlugin_ManufacturerEmail + #define JucePlugin_ManufacturerEmail "support@yourcompany.com" +#endif #ifndef JucePlugin_ManufacturerCode #define JucePlugin_ManufacturerCode 'RawM' #endif diff --git a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj index 13849948c9..9c4e49cfd7 100644 --- a/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj +++ b/extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj @@ -743,10 +743,12 @@ CA4911F2F0D942B431DC44F2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../../../modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; }; CAA1AEA2DA42ACE7AFBB7A17 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_opengl.h"; path = "../../../../modules/juce_opengl/juce_opengl.h"; sourceTree = "SOURCE_ROOT"; }; CACC511ABBAB7C46CF0101E9 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; + CAEA69EBB9B2A4C60A991E80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; CAEB53245A583D86E3C9C277 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SelectedItemSet.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_SelectedItemSet.h"; sourceTree = "SOURCE_ROOT"; }; CB9787ADAA0EB590B17CC142 = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_video/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; CBB8A03E4DB3D27D1A028AD2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PathStrokeType.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_PathStrokeType.cpp"; sourceTree = "SOURCE_ROOT"; }; CBC2829B45DFFAF01865FAAA = {isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_opengl/juce_module_info"; sourceTree = "SOURCE_ROOT"; }; + CBE270C197A66B22EEE54D9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; CBF04B0360867817B441AB30 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FloatVectorOperations.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_FloatVectorOperations.cpp"; sourceTree = "SOURCE_ROOT"; }; CBF6F0F3C2D85A2BCC427A34 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDataConverters.h"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.h"; sourceTree = "SOURCE_ROOT"; }; CC165F4EACB2CCBF1A2AE269 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadower.h"; path = "../../../../modules/juce_gui_basics/misc/juce_DropShadower.h"; sourceTree = "SOURCE_ROOT"; }; @@ -760,6 +762,7 @@ CF0F1D933CE2A89A9D05FF38 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourGradient.h"; path = "../../../../modules/juce_graphics/colour/juce_ColourGradient.h"; sourceTree = "SOURCE_ROOT"; }; CF27DFD59466D38E34428405 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Typeface.h"; path = "../../../../modules/juce_graphics/fonts/juce_Typeface.h"; sourceTree = "SOURCE_ROOT"; }; CF299925A6A365E288DC206E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_WebBrowserComponent.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_android_WebBrowserComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D06DA3FA113EAB0CCF8D7A64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../../../modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; D0A714338F6B7A47BA1F8F45 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_DirectWriteTypeface.cpp"; path = "../../../../modules/juce_graphics/native/juce_win32_DirectWriteTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; D104AE78E68E1C382F5F1A81 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuickTime.framework; path = System/Library/Frameworks/QuickTime.framework; sourceTree = SDKROOT; }; D313CF37B25D7FD313C4F336 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; @@ -776,18 +779,18 @@ D7433453EBB3700D2805FF42 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../../../modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; D795067D4EFB5A34BC383250 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; D79E29A54AE62E03A533F436 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; + D7C1255A555A016BA0D98228 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; D7D1FFD98DABD765479240E6 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; + D8101C0D25DF708FB2E446E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../../../modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; D8A3F086596562E081EB0F39 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; D8B7DCDFD32613B13AC54008 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; D8C28108DE7AD0208D790606 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; D8E9881F48E0A32121A9E84B = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel_V2.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel_V2.cpp"; sourceTree = "SOURCE_ROOT"; }; D92D579F2458F2426E5F828A = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../../../modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; - D950776EDF9260DB0278C132 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; D9857957A36A3081186D53FC = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../../../modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; DA9E577DC37123CEA41C4A71 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; DBD90FC88456B62308AD9AD0 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../../../modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; DC30BDE9C4EE1FD059D06902 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; - DCACD63912A2F68687ED06CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; DD53156BA824889FD7DF52D2 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; DD8E5D0C88FA2C287F824357 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; }; DE0C4CC1CE545BAD009786E4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; @@ -796,17 +799,16 @@ E68018DE199135B7F738FB17 = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; B2A7B6A8E3CCA7E2038E8EFF = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Plugin Host.app"; sourceTree = "BUILT_PRODUCTS_DIR"; }; C9EBFF5064D2B5EEE2C95FE1 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioPluginFormatManager.h"; path = "../../../../modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; - CAEA69EBB9B2A4C60A991E80 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MidiKeyboardComponent.cpp"; path = "../../../../modules/juce_audio_utils/gui/juce_MidiKeyboardComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; - CBE270C197A66B22EEE54D9C = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + CDFF2DDB7331FB561D1673EF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Common.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Common.h"; sourceTree = "SOURCE_ROOT"; }; CF67033CFC21C0060B538042 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; - D06DA3FA113EAB0CCF8D7A64 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../../../modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; D52F4E0C637B4685217CBEB4 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../../../modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; - D7C1255A555A016BA0D98228 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; - D8101C0D25DF708FB2E446E5 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_IPAddress.cpp"; path = "../../../../modules/juce_core/network/juce_IPAddress.cpp"; sourceTree = "SOURCE_ROOT"; }; D9207F324519739FC25FFBDE = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../../../modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; + D950776EDF9260DB0278C132 = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; + D99B064D47C6B0FDDBC66B02 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_VST3Headers.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_VST3Headers.h"; sourceTree = "SOURCE_ROOT"; }; DA918320EF4057DF54FF8909 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; DAF7C72A4348C33364BB654C = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; DB246262CA669F13ABDDB33E = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; + DCACD63912A2F68687ED06CF = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; DD68D7D44BC0B2CA5DCE8532 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; DD91A9EB61D40F941C814090 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BasicNativeHeaders.h"; path = "../../../../modules/juce_core/native/juce_BasicNativeHeaders.h"; sourceTree = "SOURCE_ROOT"; }; DDE8A5E6804C149ED936C551 = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TargetPlatform.h"; path = "../../../../modules/juce_core/system/juce_TargetPlatform.h"; sourceTree = "SOURCE_ROOT"; }; @@ -1108,6 +1110,8 @@ 397E6AC0BA27761D41FF7E5B, C2F0321856C5812A685B349D, 0CF846BB5ABA7ACA6ED15DAF, + CDFF2DDB7331FB561D1673EF, + D99B064D47C6B0FDDBC66B02, ACE3FF969AC408A50E9A6A4C, B1CA1F3AE7555C4FB4CE52D2, 10EE0138720A51EBAD46FFCC, @@ -2038,7 +2042,6 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT_ppc = macosx10.5; }; name = Debug; }; 20F59BC9E9ACBDF56007CE03 = {isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; CLANG_LINK_OBJC_RUNTIME = NO; COMBINE_HIDPI_IMAGES = YES; diff --git a/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj b/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj index c52b5a4112..2063439d2e 100644 --- a/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj +++ b/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj @@ -1306,6 +1306,8 @@ + + diff --git a/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj.filters b/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj.filters index ec5044f7ab..aae6822301 100644 --- a/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj.filters +++ b/extras/audio plugin host/Builds/VisualStudio2010/Plugin Host.vcxproj.filters @@ -1737,6 +1737,12 @@ Juce Modules\juce_audio_processors\format_types + + Juce Modules\juce_audio_processors\format_types + + + Juce Modules\juce_audio_processors\format_types + Juce Modules\juce_audio_processors\format_types diff --git a/extras/audio plugin host/Plugin Host.jucer b/extras/audio plugin host/Plugin Host.jucer index 874b0a5f1e..f9087067e1 100644 --- a/extras/audio plugin host/Plugin Host.jucer +++ b/extras/audio plugin host/Plugin Host.jucer @@ -19,7 +19,7 @@ + osxSDK="default" osxCompatibility="10.5 SDK" osxArchitecture="default"/> diff --git a/extras/windows dll/Builds/VisualStudio2008/juce_dll.vcproj b/extras/windows dll/Builds/VisualStudio2008/juce_dll.vcproj index baf4b9fd8e..d46deb81cb 100644 --- a/extras/windows dll/Builds/VisualStudio2008/juce_dll.vcproj +++ b/extras/windows dll/Builds/VisualStudio2008/juce_dll.vcproj @@ -908,6 +908,8 @@ + + diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp new file mode 100644 index 0000000000..78d73b2b36 --- /dev/null +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -0,0 +1,1521 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2013 - Raw Material Software Ltd. + + Permission is granted to use this software under the terms of either: + a) the GPL v2 (or any later version) + b) the Affero GPL v3 + + Details of these licenses can be found at: www.gnu.org/licenses + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.juce.com for more information. + + ============================================================================== +*/ + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" + +//============================================================================== +#if JucePlugin_Build_VST3 && (__APPLE_CPP__ || __APPLE_CC__ || _WIN32 || _WIN64) + +#include "../../juce_audio_processors/format_types/juce_VST3Headers.h" +#include "../utility/juce_CheckSettingMacros.h" +#include "../utility/juce_IncludeModuleHeaders.h" +#include "../../juce_audio_processors/format_types/juce_VST3Common.h" + +#undef Point +#undef Component + +using namespace Steinberg; + +//============================================================================== +class JuceLibraryRefCount +{ +public: + JuceLibraryRefCount() { if ((getCount()++) == 0) initialiseJuce_GUI(); } + ~JuceLibraryRefCount() { if ((--getCount()) == 0) shutdownJuce_GUI(); } + +private: + int& getCount() noexcept + { + static int count = 0; + return count; + } + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceLibraryRefCount) +}; + +//============================================================================== +namespace juce +{ + #if JUCE_MAC + extern void initialiseMac(); + extern void* attachComponentToWindowRef (Component*, void* parent, bool isNSView); + extern void detachComponentFromWindowRef (Component*, void* window, bool isNSView); + extern void setNativeHostWindowSize (void* window, Component*, int newWidth, int newHeight, bool isNSView); + #endif +} + +//============================================================================== +static const FUID componentFUID = FUID (0x1AA169A8, 0x4800FC31, JucePlugin_ManufacturerCode, JucePlugin_PluginCode); +static const FUID controllerFUID = FUID (0x2BB270B9, 0x0BA11ADE, JucePlugin_ManufacturerCode, JucePlugin_PluginCode); + +//============================================================================== +class JuceAudioProcessor : public FUnknown +{ +public: + JuceAudioProcessor (AudioProcessor* source) noexcept + : refCount (0), audioProcessor (source) {} + + virtual ~JuceAudioProcessor() {} + + AudioProcessor* get() const noexcept { return audioProcessor; } + + JUCE_DECLARE_VST3_COM_QUERY_METHODS + JUCE_DECLARE_VST3_COM_REF_METHODS + + static const FUID iid; + +private: + Atomic refCount; + ScopedPointer audioProcessor; + + JuceAudioProcessor() JUCE_DELETED_FUNCTION; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) +}; + +#if JUCE_MSVC + #pragma warning (push, 0) + #pragma warning (disable: 4310) +#elif JUCE_CLANG + #pragma clang diagnostic push + #pragma clang diagnostic ignored "-w" +#endif + +DECLARE_CLASS_IID (JuceAudioProcessor, 0x0101ABAB, 0xABCDEF01, 0x1234ABCD, 0x9182FAEB) +DEF_CLASS_IID (JuceAudioProcessor) + +#if JUCE_MSVC + #pragma warning (pop) +#elif JUCE_CLANG + #pragma clang diagnostic pop +#endif + +//============================================================================== +class JuceVST3EditController : public Vst::EditController, + public AudioProcessorListener +{ +public: + JuceVST3EditController() {} + + //============================================================================== + tresult PLUGIN_API initialize (FUnknown* context) override + { + if (hostContext != context) + { + if (hostContext != nullptr) + hostContext->release(); + + hostContext = context; + + if (hostContext != nullptr) + hostContext->addRef(); + } + + return kResultTrue; + } + + tresult PLUGIN_API terminate() override + { + if (AudioProcessor* const pluginInstance = getPluginInstance()) + pluginInstance->removeListener (this); + + audioProcessor = nullptr; + + return EditController::terminate(); + } + + //============================================================================== + struct Param : public Vst::Parameter + { + Param (AudioProcessor& p, int index) : owner (p), paramIndex (index) + { + info.id = (Vst::ParamID) index; + toString128 (info.title, p.getParameterName (index)); + toString128 (info.shortTitle, p.getParameterName (index, 8)); + toString128 (info.units, p.getParameterLabel (index)); + info.stepCount = (Steinberg::int32) p.getParameterNumSteps (index); + info.defaultNormalizedValue = p.getParameterDefaultValue (index); + info.unitId = Vst::kRootUnitId; + } + + virtual ~Param() {} + + bool setNormalized (Vst::ParamValue v) override + { + v = jlimit (0.0, 1.0, v); + + if (v != valueNormalized) + { + valueNormalized = v; + changed(); + owner.setParameter (paramIndex, (float) v); + return true; + } + + return false; + } + + void toString (Vst::ParamValue, Vst::String128 result) const override + { + toString128 (result, owner.getParameterText (paramIndex, 128)); + } + + Vst::ParamValue toPlain (Vst::ParamValue v) const override { return v; } + Vst::ParamValue toNormalized (Vst::ParamValue v) const override { return v; } + + private: + AudioProcessor& owner; + int paramIndex; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Param) + }; + + //============================================================================== + tresult PLUGIN_API connect (IConnectionPoint* other) override + { + if (other != nullptr) + { + audioProcessor.loadFrom (other); + jassert (audioProcessor != nullptr); + + if (AudioProcessor* const pluginInstance = getPluginInstance()) + { + pluginInstance->addListener (this); + + if (parameters.getParameterCount() <= 0) + for (int i = 0; i < pluginInstance->getNumParameters(); ++i) + parameters.addParameter (new Param (*pluginInstance, i)); + + audioProcessorChanged (pluginInstance); + return ComponentBase::connect (other); + } + + ComponentBase::connect (other); + } + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API disconnect (IConnectionPoint* other) override + { + return ComponentBase::disconnect (other); + } + + //============================================================================== + IPlugView* PLUGIN_API createView (const char* name) override + { + if (AudioProcessor* const pluginInstance = getPluginInstance()) + { + if (pluginInstance->hasEditor() && name != nullptr + && strcmp (name, Vst::ViewType::kEditor) == 0) + { + return new JuceVST3Editor (*this, *pluginInstance); + } + } + + return nullptr; + } + + //============================================================================== + void audioProcessorParameterChangeGestureBegin (AudioProcessor*, int index) override { beginEdit ((Steinberg::uint32) index); } + void audioProcessorParameterChanged (AudioProcessor*, int index, float newValue) override { performEdit ((Steinberg::uint32) index, (double) newValue); } + void audioProcessorParameterChangeGestureEnd (AudioProcessor*, int index) override { endEdit ((Steinberg::uint32) index); } + + void audioProcessorChanged (AudioProcessor*) override + { + if (componentHandler != nullptr) + componentHandler->restartComponent (Vst::kLatencyChanged & Vst::kParamValuesChanged); + } + + //============================================================================== + AudioProcessor* getPluginInstance() const noexcept + { + if (audioProcessor != nullptr) + return audioProcessor->get(); + + return nullptr; + } + +private: + //============================================================================== + ComSmartPtr audioProcessor; + const JuceLibraryRefCount juceCount; + + //============================================================================== + class JuceVST3Editor : public Vst::EditorView + { + public: + JuceVST3Editor (JuceVST3EditController& ec, AudioProcessor& p) + : Vst::EditorView (&ec, nullptr), + owner (&ec), pluginInstance (p) + { + #if JUCE_MAC + macHostWindow = nullptr; + isNSView = false; + #endif + + component = new ContentWrapperComponent (*this, p); + } + + //============================================================================== + tresult PLUGIN_API isPlatformTypeSupported (FIDString type) override + { + if (type != nullptr && pluginInstance.hasEditor()) + { + #if JUCE_WINDOWS + if (strcmp (type, kPlatformTypeHWND) == 0) + #else + if (strcmp (type, kPlatformTypeNSView) == 0 || strcmp (type, kPlatformTypeHIView) == 0) + #endif + return kResultTrue; + } + + return kResultFalse; + } + + tresult PLUGIN_API attached (void* parent, FIDString type) override + { + if (parent == nullptr || isPlatformTypeSupported (type) == kResultFalse) + return kResultFalse; + + #if JUCE_WINDOWS + component->addToDesktop (0, parent); + component->setOpaque (true); + component->setVisible (true); + #else + isNSView = (strcmp (type, kPlatformTypeNSView) == 0); + macHostWindow = juce::attachComponentToWindowRef (component, parent, isNSView); + #endif + + component->resizeHostWindow(); + systemWindow = parent; + attachedToParent(); + + return kResultTrue; + } + + tresult PLUGIN_API removed() override + { + if (component != nullptr) + { + #if JUCE_WINDOWS + component->removeFromDesktop(); + #else + if (macHostWindow != nullptr) + { + juce::detachComponentFromWindowRef (component, macHostWindow, isNSView); + macHostWindow = nullptr; + } + #endif + + component = nullptr; + } + + return CPluginView::removed(); + } + + tresult PLUGIN_API onSize (ViewRect* newSize) override + { + if (newSize != nullptr) + { + rect = *newSize; + + if (component != nullptr) + component->setSize (rect.getWidth(), rect.getHeight()); + + return kResultTrue; + } + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API getSize (ViewRect* size) override + { + if (size != nullptr && component != nullptr) + { + *size = ViewRect (0, 0, component->getWidth(), component->getHeight()); + return kResultTrue; + } + + return kResultFalse; + } + + tresult PLUGIN_API canResize() override + { + return kResultTrue; + } + + tresult PLUGIN_API checkSizeConstraint (ViewRect* rect) override + { + if (rect != nullptr && component != nullptr) + { + rect->right = rect->left + component->getWidth(); + rect->bottom = rect->top + component->getHeight(); + return kResultTrue; + } + + jassertfalse; + return kResultFalse; + } + + private: + //============================================================================== + class ContentWrapperComponent : public juce::Component + { + public: + ContentWrapperComponent (JuceVST3Editor& editor, AudioProcessor& plugin) + : owner (editor), + pluginEditor (plugin.createEditorIfNeeded()) + { + setOpaque (true); + setBroughtToFrontOnMouseClick (true); + + // if hasEditor() returns true then createEditorIfNeeded has to return a valid editor + jassert (pluginEditor != nullptr); + + if (pluginEditor != nullptr) + { + addAndMakeVisible (pluginEditor); + setBounds (pluginEditor->getLocalBounds()); + resizeHostWindow(); + } + } + + ~ContentWrapperComponent() + { + if (pluginEditor != nullptr) + { + PopupMenu::dismissAllActiveMenus(); + pluginEditor->getAudioProcessor()->editorBeingDeleted (pluginEditor); + } + } + + void paint (Graphics& g) override + { + g.fillAll (Colours::black); + } + + void childBoundsChanged (Component*) override + { + resizeHostWindow(); + } + + void resized() override + { + if (pluginEditor != nullptr) + pluginEditor->setBounds (getLocalBounds()); + } + + void resizeHostWindow() + { + if (pluginEditor != nullptr) + { + const int w = pluginEditor->getWidth(); + const int h = pluginEditor->getHeight(); + + #if JUCE_WINDOWS + setSize (w, h); + #else + if (owner.macHostWindow != nullptr) + juce::setNativeHostWindowSize (owner.macHostWindow, this, w, h, owner.isNSView); + #endif + + if (owner.plugFrame != nullptr) + { + ViewRect newSize (0, 0, w, h); + owner.plugFrame->resizeView (&owner, &newSize); + } + } + } + + private: + JuceVST3Editor& owner; + ScopedPointer pluginEditor; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ContentWrapperComponent) + }; + + //============================================================================== + ComSmartPtr owner; + AudioProcessor& pluginInstance; + + ScopedPointer component; + friend class ContentWrapperComponent; + + #if JUCE_MAC + void* macHostWindow; + bool isNSView; + #endif + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Editor) + }; + + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3EditController) +}; + +//============================================================================== +class JuceVST3Component : public Vst::IComponent, + public Vst::IAudioProcessor, + public Vst::IUnitInfo, + public Vst::IConnectionPoint, + public AudioPlayHead +{ +public: + JuceVST3Component() + : refCount (1), + audioInputs (Vst::kAudio, Vst::kInput), + audioOutputs (Vst::kAudio, Vst::kOutput), + eventInputs (Vst::kEvent, Vst::kInput), + eventOutputs (Vst::kEvent, Vst::kOutput) + { + pluginInstance = createPluginFilterOfType (AudioProcessor::wrapperType_VST3); + comPluginInstance = new JuceAudioProcessor (pluginInstance); + + zerostruct (processContext); + + processSetup.maxSamplesPerBlock = 1024; + processSetup.processMode = Vst::kRealtime; + processSetup.sampleRate = 44100.0; + processSetup.symbolicSampleSize = Vst::kSample32; + } + + ~JuceVST3Component() + { + if (pluginInstance != nullptr) + if (pluginInstance->getPlayHead() == this) + pluginInstance->setPlayHead (nullptr); + + audioInputs.removeAll(); + audioOutputs.removeAll(); + eventInputs.removeAll(); + eventOutputs.removeAll(); + } + + //============================================================================== + AudioProcessor& getPluginInstance() const noexcept { return *pluginInstance; } + + static PluginHostType& getHostType() + { + static PluginHostType hostType; + return hostType; + } + + //============================================================================== + JUCE_DECLARE_VST3_COM_REF_METHODS + + tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override + { + TEST_FOR_AND_RETURN_IF_VALID (Vst::IComponent) + TEST_FOR_AND_RETURN_IF_VALID (Vst::IAudioProcessor) + TEST_FOR_AND_RETURN_IF_VALID (Vst::IUnitInfo) + TEST_FOR_AND_RETURN_IF_VALID (Vst::IConnectionPoint) + + if (doUIDsMatch (iid, JuceAudioProcessor::iid)) + { + comPluginInstance->addRef(); + *obj = comPluginInstance; + return kResultOk; + } + + *obj = nullptr; + return kNoInterface; + } + + //============================================================================== + tresult PLUGIN_API initialize (FUnknown*) override + { + #if JucePlugin_MaxNumInputChannels > 0 + addAudioBusTo (audioInputs, TRANS("Audio Input"), + getArrangementForNumChannels (JucePlugin_MaxNumInputChannels)); + #endif + + #if JucePlugin_MaxNumOutputChannels > 0 + addAudioBusTo (audioOutputs, TRANS("Audio Output"), + getArrangementForNumChannels (JucePlugin_MaxNumOutputChannels)); + #endif + + #if JucePlugin_WantsMidiInput + addEventBusTo (eventInputs, TRANS("MIDI Input")); + #endif + + #if JucePlugin_ProducesMidiOutput + addEventBusTo (eventOutputs, TRANS("MIDI Output")); + #endif + + { + const ScopedLock sl (contextLock); + processContext.sampleRate = processSetup.sampleRate; + } + + preparePlugin (processSetup.sampleRate, (int) processSetup.maxSamplesPerBlock); + + return kResultTrue; + } + + tresult PLUGIN_API terminate() override + { + getPluginInstance().releaseResources(); + return kResultTrue; + } + + //============================================================================== + tresult PLUGIN_API connect (IConnectionPoint* other) override + { + if (other != nullptr && editController == nullptr) + { + editController.loadFrom (other); + juceVST3EditController = (JuceVST3EditController*) editController.get(); + jassert (juceVST3EditController != nullptr); + } + + return editController != nullptr ? kResultTrue : kResultFalse; + } + + tresult PLUGIN_API disconnect (IConnectionPoint*) override + { + juceVST3EditController = nullptr; + editController = nullptr; + return kResultTrue; + } + + tresult PLUGIN_API notify (Vst::IMessage*) override + { + return kNotImplemented; + } + + //============================================================================== + tresult PLUGIN_API getControllerClassId (TUID classID) override + { + controllerFUID.toTUID (classID); + return kResultTrue; + } + + Steinberg::int32 PLUGIN_API getBusCount (Vst::MediaType type, Vst::BusDirection dir) override + { + if (Vst::BusList* const busList = getBusListFor (type, dir)) + return busList->total(); + + return 0; + } + + tresult PLUGIN_API getBusInfo (Vst::MediaType type, Vst::BusDirection dir, + Steinberg::int32 index, Vst::BusInfo& info) override + { + if (Vst::BusList* const busList = getBusListFor (type, dir)) + { + if (Vst::Bus* const bus = (Vst::Bus*) busList->at (index)) + { + info.mediaType = type; + info.direction = dir; + + if (bus->getInfo (info)) + return kResultTrue; + } + } + + zerostruct (info); + return kResultFalse; + } + + tresult PLUGIN_API activateBus (Vst::MediaType type, Vst::BusDirection dir, + Steinberg::int32 index, TBool state) override + { + if (Vst::BusList* const busList = getBusListFor (type, dir)) + { + if (Vst::Bus* const bus = (Vst::Bus*) busList->at (index)) + { + bus->setActive (state); + return kResultTrue; + } + } + + jassertfalse; + return kResultFalse; + } + + tresult PLUGIN_API setActive (TBool state) override + { + if (state == kResultFalse) + { + getPluginInstance().releaseResources(); + } + else + { + double sampleRate = getPluginInstance().getSampleRate(); + int bufferSize = getPluginInstance().getBlockSize(); + + { + const ScopedLock sl (contextLock); + sampleRate = processSetup.sampleRate > 0.0 + ? processSetup.sampleRate + : sampleRate; + + bufferSize = processSetup.maxSamplesPerBlock > 0 + ? (int) processSetup.maxSamplesPerBlock + : bufferSize; + } + + preparePlugin (sampleRate, bufferSize); + } + + return kResultOk; + } + + tresult PLUGIN_API setIoMode (Vst::IoMode) override { return kNotImplemented; } + tresult PLUGIN_API getRoutingInfo (Vst::RoutingInfo&, Vst::RoutingInfo&) override { return kNotImplemented; } + + tresult PLUGIN_API setState (IBStream* state) override + { + if (state != nullptr) + { + // Reset to the beginning of the stream: + if (state->seek (0, IBStream::kIBSeekSet, nullptr) != kResultTrue) + return kResultFalse; + + Steinberg::int64 end = -1; + + if (end < 0) + { + FUnknownPtr s (state); + + if (s != nullptr) + s->getStreamSize (end); + } + + if (end < 0) + { + FUnknownPtr s (state); + + if (s != nullptr) + { + if (getHostType().isAdobeAudition()) + { + // Adobe Audition CS6 hack to avoid trying to use corrupted streams: + bool failed = true; + + if (const char* const data = s->getData()) + { + if (s->getSize() >= 5 && data[0] != 'V' && data[1] != 'C' + && data[2] != '2' && data[3] != '!' && data[4] != 'E') + { + failed = false; + } + } + else + { + jassertfalse; + } + + if (failed) + return kResultFalse; + } + + end = (Steinberg::int64) s->getSize(); + } + } + + if (end <= 0) + return kResultFalse; + + // Try reading the data, and setting the plugin state: + Steinberg::int32 numBytes = (Steinberg::int32) jmin ((Steinberg::int64) std::numeric_limits::max(), end); + + Array buff; + buff.ensureStorageAllocated ((int) numBytes); + void* buffer = buff.getRawDataPointer(); + + if (state->read (buffer, numBytes, &numBytes) == kResultTrue + && buffer != nullptr + && numBytes > 0) + { + pluginInstance->setStateInformation (buffer, (int) numBytes); + return kResultTrue; + } + + return kResultFalse; + } + + return kInvalidArgument; + } + + tresult PLUGIN_API getState (IBStream* state) override + { + if (state != nullptr) + { + MemoryBlock mem; + pluginInstance->getStateInformation (mem); + return state->write (mem.getData(), (Steinberg::int32) mem.getSize()); + } + + return kInvalidArgument; + } + + //============================================================================== + Steinberg::int32 PLUGIN_API getUnitCount() override + { + return 1; + } + + tresult PLUGIN_API getUnitInfo (Steinberg::int32 unitIndex, Vst::UnitInfo& info) override + { + if (unitIndex == 0) + { + info.id = Vst::kRootUnitId; + info.parentUnitId = Vst::kNoParentUnitId; + info.programListId = Vst::kNoProgramListId; + + toString128 (info.name, TRANS("Root Unit")); + + return kResultTrue; + } + + zerostruct (info); + return kResultFalse; + } + + Steinberg::int32 PLUGIN_API getProgramListCount() override + { + if (getPluginInstance().getNumPrograms() > 0) + return 1; + + return 0; + } + + tresult PLUGIN_API getProgramListInfo (Steinberg::int32 listIndex, Vst::ProgramListInfo& info) override + { + if (listIndex == 0) + { + info.id = paramPreset; + info.programCount = (Steinberg::int32) getPluginInstance().getNumPrograms(); + + toString128 (info.name, TRANS("Factory Presets")); + + return kResultTrue; + } + + jassertfalse; + zerostruct (info); + return kResultFalse; + } + + tresult PLUGIN_API getProgramName (Vst::ProgramListID listId, Steinberg::int32 programIndex, Vst::String128 name) override + { + if (listId == paramPreset + && isPositiveAndBelow ((int) programIndex, getPluginInstance().getNumPrograms())) + { + toString128 (name, getPluginInstance().getProgramName ((int) programIndex)); + return kResultTrue; + } + + jassertfalse; + toString128 (name, juce::String()); + return kResultFalse; + } + + tresult PLUGIN_API getProgramInfo (Vst::ProgramListID, Steinberg::int32, Vst::CString, Vst::String128) override { return kNotImplemented; } + tresult PLUGIN_API hasProgramPitchNames (Vst::ProgramListID, Steinberg::int32) override { return kNotImplemented; } + tresult PLUGIN_API getProgramPitchName (Vst::ProgramListID, Steinberg::int32, Steinberg::int16, Vst::String128) override { return kNotImplemented; } + tresult PLUGIN_API selectUnit (Vst::UnitID) override { return kNotImplemented; } + tresult PLUGIN_API setUnitProgramData (Steinberg::int32, Steinberg::int32, IBStream*) override { return kNotImplemented; } + Vst::UnitID PLUGIN_API getSelectedUnit() override { return Vst::kRootUnitId; } + + tresult PLUGIN_API getUnitByBus (Vst::MediaType, Vst::BusDirection, + Steinberg::int32, Steinberg::int32, + Vst::UnitID& unitId) override + { + zerostruct (unitId); + return kNotImplemented; + } + + //============================================================================== + bool getCurrentPosition (CurrentPositionInfo& info) override + { + const ScopedLock sl (contextLock); + + info.timeInSamples = jmax ((juce::int64) 0, processContext.projectTimeSamples); + info.timeInSeconds = processContext.projectTimeMusic; + info.bpm = jmax (1.0, processContext.tempo); + info.timeSigNumerator = jmax (1, (int) processContext.timeSigNumerator); + info.timeSigDenominator = jmax (1, (int) processContext.timeSigDenominator); + info.ppqPositionOfLastBarStart = processContext.barPositionMusic; + info.ppqPosition = processContext.projectTimeMusic; + info.ppqLoopStart = processContext.cycleStartMusic; + info.ppqLoopEnd = processContext.cycleEndMusic; + info.isRecording = (processContext.state & Vst::ProcessContext::kRecording) != 0; + info.isPlaying = (processContext.state & Vst::ProcessContext::kPlaying) != 0; + info.isLooping = (processContext.state & Vst::ProcessContext::kCycleActive) != 0; + info.editOriginTime = 0.0; + info.frameRate = AudioPlayHead::fpsUnknown; + + if ((processContext.state & Vst::ProcessContext::kSmpteValid) != 0) + { + switch (processContext.frameRate.framesPerSecond) + { + case 24: info.frameRate = AudioPlayHead::fps24; break; + case 25: info.frameRate = AudioPlayHead::fps25; break; + case 29: info.frameRate = AudioPlayHead::fps30drop; break; + + case 30: + { + if ((processContext.frameRate.flags & Vst::FrameRate::kDropRate) != 0) + info.frameRate = AudioPlayHead::fps30drop; + else + info.frameRate = AudioPlayHead::fps30; + } + break; + + default: break; + } + } + + return true; + } + + //============================================================================== + static tresult setBusArrangementFor (Vst::BusList& list, + Vst::SpeakerArrangement* arrangement, + Steinberg::int32 numBusses) + { + if (arrangement != nullptr && numBusses == 1) //Should only be 1 bus per BusList + { + Steinberg::int32 counter = 0; + + FOREACH_CAST (IPtr, Vst::AudioBus, bus, list) + if (counter < numBusses) + bus->setArrangement (arrangement[counter]); + + counter++; + ENDFOR + + return kResultTrue; + } + + return kResultFalse; + } + + tresult PLUGIN_API setBusArrangements (Vst::SpeakerArrangement* inputs, Steinberg::int32 numIns, + Vst::SpeakerArrangement* outputs, Steinberg::int32 numOuts) override + { + #if JucePlugin_MaxNumInputChannels > 0 + if (setBusArrangementFor (audioInputs, inputs, numIns) != kResultTrue) + return kResultFalse; + #else + if (numIns != 0) + return kResultFalse; + #endif + + #if JucePlugin_MaxNumOutputChannels > 0 + if (setBusArrangementFor (audioOutputs, outputs, numOuts) != kResultTrue) + return kResultFalse; + #else + if (numOuts != 0) + return kResultFalse; + #endif + + return kResultTrue; + } + + tresult PLUGIN_API getBusArrangement (Vst::BusDirection dir, Steinberg::int32 index, Vst::SpeakerArrangement& arr) override + { + if (Vst::BusList* const busList = getBusListFor (Vst::kAudio, dir)) + { + if (Vst::AudioBus* const audioBus = FCast (busList->at (index))) + { + arr = audioBus->getArrangement(); + return kResultTrue; + } + } + + return kResultFalse; + } + + tresult PLUGIN_API canProcessSampleSize (Steinberg::int32 symbolicSampleSize) override + { + return symbolicSampleSize == Vst::kSample32 ? kResultTrue : kResultFalse; + } + + Steinberg::uint32 PLUGIN_API getLatencySamples() override + { + return (Steinberg::uint32) jmax (0, getPluginInstance().getLatencySamples()); + } + + tresult PLUGIN_API setupProcessing (Vst::ProcessSetup& newSetup) override + { + if (canProcessSampleSize (newSetup.symbolicSampleSize) != kResultTrue) + return kResultFalse; + + processSetup = newSetup; + processContext.sampleRate = processSetup.sampleRate; + + preparePlugin (processSetup.sampleRate, processSetup.maxSamplesPerBlock); + + return kResultTrue; + } + + tresult PLUGIN_API setProcessing (TBool state) override + { + if (state == kResultFalse) + getPluginInstance().reset(); + + return kResultTrue; + } + + Steinberg::uint32 PLUGIN_API getTailSamples() override + { + const double tailLengthSeconds = getPluginInstance().getTailLengthSeconds(); + + if (tailLengthSeconds <= 0.0 || processSetup.sampleRate > 0.0) + return Vst::kNoTail; + + return (Steinberg::uint32) roundToIntAccurate (tailLengthSeconds * processSetup.sampleRate); + } + + //============================================================================== + void processParameterChanges (Vst::IParameterChanges& paramChanges) + { + jassert (pluginInstance != nullptr); + + const Steinberg::int32 numParamsChanged = paramChanges.getParameterCount(); + + for (Steinberg::int32 i = 0; i < numParamsChanged; ++i) + { + if (Vst::IParamValueQueue* paramQueue = paramChanges.getParameterData (i)) + { + const Steinberg::int32 numPoints = paramQueue->getPointCount(); + + Steinberg::int32 offsetSamples; + double value = 0.0; + + if (paramQueue->getPoint (numPoints - 1, offsetSamples, value) == kResultTrue) + { + const int id = (int) paramQueue->getParameterId(); + jassert (isPositiveAndBelow (id, pluginInstance->getNumParameters())); + pluginInstance->setParameter (id, (float) value); + } + } + } + } + + tresult PLUGIN_API process (Vst::ProcessData& data) override + { + midiBuffer.clear(); + + { + const ScopedLock sl (contextLock); + + if (data.processContext != nullptr) + processContext = *data.processContext; + else + zerostruct (processContext); + } + + #if JucePlugin_WantsMidiInput + if (data.inputEvents != nullptr) + MidiEventList::toMidiBuffer (midiBuffer, *data.inputEvents); + #endif + + #if JUCE_DEBUG && ! JucePlugin_ProducesMidiOutput + const int numMidiEventsComingIn = midiBuffer.getNumEvents(); + #endif + + if (pluginInstance != nullptr + && data.inputs != nullptr + && data.outputs != nullptr + && processContext.sampleRate > 0.0) + { + const ScopedLock sl (pluginInstance->getCallbackLock()); + + pluginInstance->setNonRealtime (data.processMode == Vst::kOffline); + + if (Vst::IParameterChanges* const paramChanges = data.inputParameterChanges) + processParameterChanges (*paramChanges); + + const int numSamples = (int) data.numSamples; + const int numChannels = (int) data.inputs[0].numChannels; + + AudioSampleBuffer buffer (data.inputs[0].channelBuffers32, numChannels, numSamples); + int startBusOffset = 1; + + if (pluginInstance->isSuspended()) + startBusOffset = 0; + else + pluginInstance->processBlock (buffer, midiBuffer); + + // Copy the audio: + for (int i = 0; i < numChannels; ++i) + FloatVectorOperations::copy (data.outputs[0].channelBuffers32[i], buffer.getSampleData (i), numSamples); + + // Clear the other busses: + for (int i = startBusOffset; i < data.numOutputs; ++i) + for (int f = 0; f < data.outputs[i].numChannels; ++f) + FloatVectorOperations::clear (data.outputs[i].channelBuffers32[f], numSamples); + } + else + { + return kResultFalse; + } + + #if JucePlugin_ProducesMidiOutput + if (data.outputEvents != nullptr) + MidiEventList::toEventList (*data.outputEvents, midiBuffer); + #elif JUCE_DEBUG + /* This assertion is caused when you've added some events to the + midiMessages array in your processBlock() method, which usually means + that you're trying to send them somewhere. But in this case they're + getting thrown away. + + If your plugin does want to send MIDI messages, you'll need to set + the JucePlugin_ProducesMidiOutput macro to 1 in your + JucePluginCharacteristics.h file. + + If you don't want to produce any MIDI output, then you should clear the + midiMessages array at the end of your processBlock() method, to + indicate that you don't want any of the events to be passed through + to the output. + */ + jassert (midiBuffer.getNumEvents() <= numMidiEventsComingIn); + #endif + + return kResultTrue; + } + +private: + //============================================================================== + Atomic refCount; + + AudioProcessor* pluginInstance; + ComSmartPtr comPluginInstance; + ComSmartPtr editController; + JuceVST3EditController* juceVST3EditController; + + /** + Since VST3 does not provide a way of knowing the buffer size and sample rate at any point, + this object needs to be copied on every call to process() to be up-to-date... + */ + CriticalSection contextLock; //Not sure how necessary this is... + Vst::ProcessContext processContext; + Vst::ProcessSetup processSetup; + + Vst::BusList audioInputs, audioOutputs, eventInputs, eventOutputs; + MidiBuffer midiBuffer; + + const JuceLibraryRefCount juceCount; + + //============================================================================== + void addBusTo (Vst::BusList& busList, Vst::Bus* newBus) + { + busList.append (IPtr (newBus, false)); + } + + void addAudioBusTo (Vst::BusList& busList, const juce::String& name, Vst::SpeakerArrangement arr) + { + addBusTo (busList, new Vst::AudioBus (toString (name), Vst::kMain, Vst::BusInfo::kDefaultActive, arr)); + } + + void addEventBusTo (Vst::BusList& busList, const juce::String& name) + { + addBusTo (busList, new Vst::EventBus (toString (name), 16, Vst::kMain, Vst::BusInfo::kDefaultActive)); + } + + Vst::BusList* getBusListFor (Vst::MediaType type, Vst::BusDirection dir) + { + if (type == Vst::kAudio) + return dir == Vst::kInput ? &audioInputs : &audioOutputs; + + if (type == Vst::kEvent) + return dir == Vst::kInput ? &eventInputs : &eventOutputs; + + return nullptr; + } + + //============================================================================== + enum InternalParameters + { + paramPreset = 'prst' + }; + + void preparePlugin (double sampleRate, int bufferSize) + { + getPluginInstance().setPlayConfigDetails (JucePlugin_MaxNumInputChannels, + JucePlugin_MaxNumOutputChannels, + sampleRate, bufferSize); + + getPluginInstance().prepareToPlay (sampleRate, bufferSize); + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceVST3Component) +}; + +//============================================================================== +bool initModule() +{ + #if JUCE_MAC + initialiseMac(); + #endif + + return true; +} + +bool shutdownModule() +{ + return true; +} + +#undef JUCE_EXPORTED_FUNCTION + +#if JUCE_WINDOWS + extern "C" __declspec (dllexport) bool InitDll() { return initModule(); } + extern "C" __declspec (dllexport) bool ExitDll() { return shutdownModule(); } + #define JUCE_EXPORTED_FUNCTION + +#else + #define JUCE_EXPORTED_FUNCTION extern "C" __attribute__ ((visibility ("default"))) + + CFBundleRef globalBundleInstance = nullptr; + uint32 numBundleRefs = 0; + juce::Array bundleRefs; + + enum { MaxPathLength = 2048 }; + char modulePath[MaxPathLength] = { 0 }; + void* moduleHandle = nullptr; + + JUCE_EXPORTED_FUNCTION bool bundleEntry (CFBundleRef ref) + { + if (ref != nullptr) + { + ++numBundleRefs; + CFRetain (ref); + + bundleRefs.add (ref); + + if (moduleHandle == nullptr) + { + globalBundleInstance = ref; + moduleHandle = ref; + + CFURLRef tempURL = CFBundleCopyBundleURL (ref); + CFURLGetFileSystemRepresentation (tempURL, true, (UInt8*) modulePath, MaxPathLength); + CFRelease (tempURL); + } + } + + return initModule(); + } + + JUCE_EXPORTED_FUNCTION bool bundleExit() + { + if (shutdownModule()) + { + if (--numBundleRefs == 0) + { + for (size_t i = 0; i < bundleRefs.size(); ++i) + CFRelease (bundleRefs.getUnchecked (i)); + + bundleRefs.clear(); + } + + return true; + } + + return false; + } +#endif + +//============================================================================== +/** This typedef represents VST3's createInstance() function signature */ +typedef FUnknown* (*CreateFunction) (void*); + +static FUnknown* createComponentInstance (void*) +{ + return (Vst::IAudioProcessor*) new JuceVST3Component(); +} + +static FUnknown* createControllerInstance (void*) +{ + return (Vst::IEditController*) new JuceVST3EditController(); +} + +//============================================================================== +class JucePluginFactory; +JucePluginFactory* globalFactory = nullptr; + +//============================================================================== +class JucePluginFactory : public IPluginFactory3 +{ +public: + JucePluginFactory() + : refCount (1), factoryInfo (JucePlugin_Manufacturer, "", "", Vst::kDefaultFactoryFlags) + { + } + + virtual ~JucePluginFactory() + { + if (globalFactory == this) + globalFactory = nullptr; + } + + //============================================================================== + bool registerClass (const PClassInfo2& info, CreateFunction createFunction) + { + if (createFunction == nullptr) + { + jassertfalse; + return false; + } + + ClassEntry* entry = classes.add (new ClassEntry (info, createFunction)); + entry->infoW.fromAscii (info); + + return true; + } + + bool isClassRegistered (const FUID& cid) const + { + for (int i = 0; i < classes.size(); ++i) + if (classes.getUnchecked (i)->infoW.cid == cid) + return true; + + return false; + } + + //============================================================================== + JUCE_DECLARE_VST3_COM_REF_METHODS + + tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override + { + TEST_FOR_AND_RETURN_IF_VALID (IPluginFactory3) + TEST_FOR_AND_RETURN_IF_VALID (IPluginFactory2) + TEST_FOR_AND_RETURN_IF_VALID (IPluginFactory) + TEST_FOR_AND_RETURN_IF_VALID (FUnknown) + + jassertfalse; // Something new? + *obj = nullptr; + return kNotImplemented; + } + + //============================================================================== + Steinberg::int32 PLUGIN_API countClasses() override + { + return (Steinberg::int32) classes.size(); + } + + tresult PLUGIN_API getFactoryInfo (PFactoryInfo* info) override + { + if (info == nullptr) + return kInvalidArgument; + + std::memcpy (info, &factoryInfo, sizeof (PFactoryInfo)); + return kResultOk; + } + + tresult PLUGIN_API getClassInfo (Steinberg::int32 index, PClassInfo* info) override + { + return getPClassInfo (index, info); + } + + tresult PLUGIN_API getClassInfo2 (Steinberg::int32 index, PClassInfo2* info) override + { + return getPClassInfo (index, info); + } + + tresult PLUGIN_API getClassInfoUnicode (Steinberg::int32 index, PClassInfoW* info) override + { + if (info != nullptr) + { + if (ClassEntry* entry = classes[(int) index]) + { + std::memcpy (info, &entry->infoW, sizeof (PClassInfoW)); + return kResultOk; + } + } + + return kInvalidArgument; + } + + tresult PLUGIN_API createInstance (FIDString cid, FIDString iid, void** obj) override + { + for (int i = 0; i < classes.size(); ++i) + { + const ClassEntry& entry = *classes.getUnchecked (i); + + if (doUIDsMatch (entry.infoW.cid, cid)) + { + if (FUnknown* const instance = entry.createFunction (nullptr)) + { + const FReleaser releaser (instance); + + if (instance->queryInterface (iid, obj) == kResultOk) + return kResultOk; + } + + break; + } + } + + *obj = nullptr; + return kNoInterface; + } + + tresult PLUGIN_API setHostContext (FUnknown* context) override + { + host.loadFrom (context); + + if (host != nullptr) + { + Vst::String128 name; + host->getName (name); + + return kResultTrue; + } + + return kNotImplemented; + } + +private: + //============================================================================== + const JuceLibraryRefCount juceCount; + Atomic refCount; + const PFactoryInfo factoryInfo; + ComSmartPtr host; + + //============================================================================== + struct ClassEntry + { + ClassEntry() noexcept : createFunction (nullptr), isUnicode (false) {} + + ClassEntry (const PClassInfo2& info, CreateFunction fn) noexcept + : info2 (info), createFunction (fn), isUnicode (false) {} + + PClassInfo2 info2; + PClassInfoW infoW; + CreateFunction createFunction; + bool isUnicode; + + private: + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ClassEntry) + }; + + OwnedArray classes; + + //============================================================================== + template + tresult PLUGIN_API getPClassInfo (Steinberg::int32 index, PClassInfoType* info) + { + if (info != nullptr) + { + zerostruct (*info); + + if (ClassEntry* entry = classes[(int) index]) + { + if (entry->isUnicode) + return kResultFalse; + + std::memcpy (info, &entry->info2, sizeof (PClassInfoType)); + return kResultOk; + } + } + + jassertfalse; + return kInvalidArgument; + } + + //============================================================================== + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JucePluginFactory) +}; + +//============================================================================== +#ifndef JucePlugin_Vst3ComponentFlags + #if JucePlugin_IsSynth + #define JucePlugin_Vst3ComponentFlags Vst::kSimpleModeSupported + #else + #define JucePlugin_Vst3ComponentFlags 0 + #endif +#endif + +#ifndef JucePlugin_Vst3Category + #if JucePlugin_IsSynth + #define JucePlugin_Vst3Category Vst::PlugType::kInstrument + #else + #define JucePlugin_Vst3Category Vst::PlugType::kFx + #endif +#endif + +//============================================================================== +// The VST3 plugin entry point. +JUCE_EXPORTED_FUNCTION IPluginFactory* PLUGIN_API GetPluginFactory() +{ + #if JUCE_WINDOWS + // Cunning trick to force this function to be exported. Life's too short to + // faff around creating .def files for this kind of thing. + #pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__) + #endif + + if (globalFactory == nullptr) + { + globalFactory = new JucePluginFactory(); + + TUID componentTUID; + componentFUID.toTUID (componentTUID); + + static const PClassInfo2 componentClass (componentTUID, + PClassInfo::kManyInstances, + kVstAudioEffectClass, + JucePlugin_Name, + JucePlugin_Vst3ComponentFlags, + JucePlugin_Vst3Category, + JucePlugin_Manufacturer, + JucePlugin_VersionString, + kVstVersionString); + + globalFactory->registerClass (componentClass, createComponentInstance); + + TUID controllerTUID; + controllerFUID.toTUID (controllerTUID); + + static const PClassInfo2 controllerClass (controllerTUID, + PClassInfo::kManyInstances, + kVstComponentControllerClass, + JucePlugin_Name, + JucePlugin_Vst3ComponentFlags, + JucePlugin_Vst3Category, + JucePlugin_Manufacturer, + JucePlugin_VersionString, + kVstVersionString); + + globalFactory->registerClass (controllerClass, createControllerInstance); + } + else + { + globalFactory->addRef(); + } + + return dynamic_cast (globalFactory); +} + +#endif //JucePlugin_Build_VST3 diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm new file mode 100644 index 0000000000..457465f564 --- /dev/null +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.mm @@ -0,0 +1,272 @@ +/* + ============================================================================== + + This file is part of the JUCE library - "Jules' Utility Class Extensions" + Copyright 2004-11 by Raw Material Software Ltd. + + ------------------------------------------------------------------------------ + + JUCE can be redistributed and/or modified under the terms of the GNU General + Public License (Version 2), as published by the Free Software Foundation. + A copy of the license is included in the JUCE distribution, or can be found + online at www.gnu.org/licenses. + + JUCE is distributed in the hope that it will be useful, but WITHOUT ANY + WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + A PARTICULAR PURPOSE. See the GNU General Public License for more details. + + ------------------------------------------------------------------------------ + + To release a closed-source product which uses JUCE, commercial licenses are + available: visit www.rawmaterialsoftware.com/juce for more information. + + ============================================================================== + */ + + +// Your project must contain an AppConfig.h file with your project-specific settings in it, +// and your header search path must make it accessible to the module's files. +#include "AppConfig.h" +#include "../utility/juce_CheckSettingMacros.h" + +#if JucePlugin_Build_VST3 + +#define JUCE_MAC_WINDOW_VISIBITY_BODGE 1 + +#include "../utility/juce_IncludeSystemHeaders.h" +#include "../utility/juce_IncludeModuleHeaders.h" +#include "../utility/juce_FakeMouseMoveGenerator.h" +#include "../utility/juce_CarbonVisibility.h" + +#undef Component +#undef Point + +//============================================================================== +namespace juce +{ + static void initialiseMac() + { + #if ! JUCE_64BIT + NSApplicationLoad(); + #endif + } + + #if ! JUCE_64BIT + static void updateComponentPos (Component* const comp) + { + DBG ("updateComponentPos()"); + + HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) + comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); + + HIRect r; + HIViewGetFrame (dummyView, &r); + HIViewRef root; + HIViewFindByID (HIViewGetRoot (HIViewGetWindow (dummyView)), kHIViewWindowContentID, &root); + HIViewConvertRect (&r, HIViewGetSuperview (dummyView), root); + + Rect windowPos; + GetWindowBounds (HIViewGetWindow (dummyView), kWindowContentRgn, &windowPos); + + comp->setTopLeftPosition ((int) (windowPos.left + r.origin.x), + (int) (windowPos.top + r.origin.y)); + } + + static pascal OSStatus viewBoundsChangedEvent (EventHandlerCallRef, EventRef, void* user) + { + updateComponentPos ((Component*) user); + return noErr; + } + #endif + + static void* attachComponentToWindowRef (Component* comp, void* windowRef, bool isHIView) + { + DBG ("attachComponentToWindowRef()"); + + JUCE_AUTORELEASEPOOL + { + #if JUCE_64BIT + NSView* parentView = (NSView*) windowRef; + + #if JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (0, parentView); + #else + comp->addToDesktop (ComponentPeer::windowIgnoresKeyPresses, parentView); + #endif + + // (this workaround is because Wavelab provides a zero-size parent view..) + if ([parentView frame].size.height == 0) + [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint]; + + comp->setVisible (true); + comp->toFront (false); + + [[parentView window] setAcceptsMouseMovedEvents: YES]; + return parentView; + + #else + //treat NSView like 64bit + if (! isHIView) + { + NSView* parentView = (NSView*) windowRef; + + #if JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (0, parentView); + #else + comp->addToDesktop (ComponentPeer::windowIgnoresKeyPresses, parentView); + #endif + + // (this workaround is because Wavelab provides a zero-size parent view..) + if ([parentView frame].size.height == 0) + [((NSView*) comp->getWindowHandle()) setFrameOrigin: NSZeroPoint]; + + comp->setVisible (true); + comp->toFront (false); + + [[parentView window] setAcceptsMouseMovedEvents: YES]; + return parentView; + } + + NSWindow* hostWindow = [[NSWindow alloc] initWithWindowRef: windowRef]; + [hostWindow retain]; + [hostWindow setCanHide: YES]; + [hostWindow setReleasedWhenClosed: YES]; + + HIViewRef parentView = nullptr; + + WindowAttributes attributes; + GetWindowAttributes ((WindowRef) windowRef, &attributes); + + if ((attributes & kWindowCompositingAttribute) != 0) + { + HIViewRef root = HIViewGetRoot ((WindowRef) windowRef); + HIViewFindByID (root, kHIViewWindowContentID, &parentView); + + if (parentView == nullptr) + parentView = root; + } + else + { + GetRootControl ((WindowRef) windowRef, (ControlRef*) &parentView); + + if (parentView == nullptr) + CreateRootControl ((WindowRef) windowRef, (ControlRef*) &parentView); + } + + // It seems that the only way to successfully position our overlaid window is by putting a dummy + // HIView into the host's carbon window, and then catching events to see when it gets repositioned + HIViewRef dummyView = 0; + HIImageViewCreate (0, &dummyView); + HIRect r = { {0, 0}, { (float) comp->getWidth(), (float) comp->getHeight()} }; + HIViewSetFrame (dummyView, &r); + HIViewAddSubview (parentView, dummyView); + comp->getProperties().set ("dummyViewRef", String::toHexString ((pointer_sized_int) (void*) dummyView)); + + EventHandlerRef ref; + const EventTypeSpec kControlBoundsChangedEvent = { kEventClassControl, kEventControlBoundsChanged }; + InstallEventHandler (GetControlEventTarget (dummyView), NewEventHandlerUPP (viewBoundsChangedEvent), 1, &kControlBoundsChangedEvent, (void*) comp, &ref); + comp->getProperties().set ("boundsEventRef", String::toHexString ((pointer_sized_int) (void*) ref)); + + updateComponentPos (comp); + + #if ! JucePlugin_EditorRequiresKeyboardFocus + comp->addToDesktop (ComponentPeer::windowIsTemporary | ComponentPeer::windowIgnoresKeyPresses); + #else + comp->addToDesktop (ComponentPeer::windowIsTemporary); + #endif + + comp->setVisible (true); + comp->toFront (false); + + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + [pluginWindow setExcludedFromWindowsMenu: YES]; + [pluginWindow setCanHide: YES]; + + [hostWindow addChildWindow: pluginWindow + ordered: NSWindowAbove]; + [hostWindow orderFront: nil]; + [pluginWindow orderFront: nil]; + + attachWindowHidingHooks (comp, (WindowRef) windowRef, hostWindow); + + return hostWindow; + #endif + + } + } + + static void detachComponentFromWindowRef (Component* comp, void* nsWindow, bool isHIView) + { + #if JUCE_64BIT + comp->removeFromDesktop(); + #else + //treat NSView like 64bit + if (! isHIView) + { + comp->removeFromDesktop(); + } + else + { + JUCE_AUTORELEASEPOOL + { + EventHandlerRef ref = (EventHandlerRef) (void*) (pointer_sized_int) + comp->getProperties() ["boundsEventRef"].toString().getHexValue64(); + RemoveEventHandler (ref); + + removeWindowHidingHooks (comp); + + HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) + comp->getProperties() ["dummyViewRef"].toString().getHexValue64(); + + if (HIViewIsValid (dummyView)) + CFRelease (dummyView); + + NSWindow* hostWindow = (NSWindow*) nsWindow; + NSView* pluginView = (NSView*) comp->getWindowHandle(); + NSWindow* pluginWindow = [pluginView window]; + + [hostWindow removeChildWindow: pluginWindow]; + comp->removeFromDesktop(); + + [hostWindow release]; + } + + // The event loop needs to be run between closing the window and deleting the plugin, + // presumably to let the cocoa objects get tidied up. Leaving out this line causes crashes + // in Live and Reaper when you delete the plugin with its window open. + // (Doing it this way rather than using a single longer timout means that we can guarantee + // how many messages will be dispatched, which seems to be vital in Reaper) + for (int i = 20; --i >= 0;) + MessageManager::getInstance()->runDispatchLoopUntil (1); + } + #endif + } + + static void setNativeHostWindowSize (void* nsWindow, Component* component, int newWidth, int newHeight, bool isHIView) + { + JUCE_AUTORELEASEPOOL + { + #if JUCE_64BIT + component->setSize (newWidth, newHeight); + #else + if (! isHIView) + { //Treat NSView like 64bit: + component->setSize (newWidth, newHeight); + } + else if (HIViewRef dummyView = (HIViewRef) (void*) (pointer_sized_int) + component->getProperties() ["dummyViewRef"].toString().getHexValue64()) + { + HIRect frameRect; + HIViewGetFrame (dummyView, &frameRect); + frameRect.size.width = newWidth; + frameRect.size.height = newHeight; + HIViewSetFrame (dummyView, &frameRect); + } + #endif + } + } +} // (juce namespace) + + +#endif diff --git a/modules/juce_audio_plugin_client/juce_module_info b/modules/juce_audio_plugin_client/juce_module_info index 6d33f9a575..7df78b2696 100644 --- a/modules/juce_audio_plugin_client/juce_module_info +++ b/modules/juce_audio_plugin_client/juce_module_info @@ -2,7 +2,7 @@ "id": "juce_audio_plugin_client", "name": "JUCE audio plugin wrapper classes", "version": "3.0.2", - "description": "Classes for building VST, RTAS and AU plugins.", + "description": "Classes for building VST, VST3, RTAS, AAX and AU plugins.", "website": "http://www.juce.com/juce", "license": "GPL/Commercial", @@ -14,6 +14,8 @@ "compile": [ { "file": "VST/juce_VST_Wrapper.cpp" }, { "file": "VST/juce_VST_Wrapper.mm", "target": "xcode" }, + { "file": "VST3/juce_VST3_Wrapper.cpp" }, + { "file": "VST3/juce_VST3_Wrapper.mm", "target": "xcode" }, { "file": "RTAS/juce_RTAS_DigiCode1.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, { "file": "RTAS/juce_RTAS_DigiCode2.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, { "file": "RTAS/juce_RTAS_DigiCode3.cpp", "warnings": "disabled", "stdcall": "1", "target": "xcode, msvc" }, @@ -36,6 +38,7 @@ "RTAS/*.mm", "RTAS/*.h", "VST/*", + "VST3/*", "AAX/*", "utility/*" ] diff --git a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h index 747465568c..b3f51b55af 100644 --- a/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h +++ b/modules/juce_audio_plugin_client/utility/juce_CheckSettingMacros.h @@ -25,7 +25,8 @@ // The following checks should cause a compile error if you've forgotten to // define all your plugin settings properly.. -#if ! (JucePlugin_Build_VST || JucePlugin_Build_AU || JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ +#if ! (JucePlugin_Build_VST || JucePlugin_Build_VST3 \ + || JucePlugin_Build_AU || JucePlugin_Build_RTAS || JucePlugin_Build_AAX \ || JucePlugin_Build_Standalone || JucePlugin_Build_LV2) #error "You need to enable at least one plugin format!" #endif @@ -75,11 +76,16 @@ #endif //============================================================================== -#if _WIN64 || (__LP64__ && (defined(__APPLE_CPP__) || defined(__APPLE_CC__))) +#if _WIN64 || (__LP64__ && (defined (__APPLE_CPP__) || defined (__APPLE_CC__))) #undef JucePlugin_Build_RTAS #define JucePlugin_Build_RTAS 0 #endif +#if ! (defined (_MSC_VER) || defined (__APPLE_CPP__) || defined (__APPLE_CC__)) + #undef JucePlugin_Build_VST3 + #define JucePlugin_Build_VST3 0 +#endif + //============================================================================== #if JucePlugin_Build_RTAS && _MSC_VER && ! defined (JucePlugin_WinBag_path) #error "You need to define the JucePlugin_WinBag_path value!" diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h index 0c2f4fb29f..df978c4587 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -59,7 +59,7 @@ static juce::String toString (const Steinberg::char16* string) noexcept { re static juce::String toString (const Steinberg::UString128& string) noexcept { return toString (static_cast (string)); } static juce::String toString (const Steinberg::UString256& string) noexcept { return toString (static_cast (string)); } -static void toString (Steinberg::Vst::String128 result, const juce::String& source) +static void toString128 (Steinberg::Vst::String128 result, const juce::String& source) { Steinberg::UString (result, 128).fromAscii (source.toUTF8()); } diff --git a/modules/juce_audio_processors/format_types/juce_VST3Headers.h b/modules/juce_audio_processors/format_types/juce_VST3Headers.h index be15382381..3694789ad4 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Headers.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Headers.h @@ -159,7 +159,6 @@ namespace Steinberg #undef OBJ_METHODS #undef QUERY_INTERFACE #undef LICENCE_UID -#undef DEF_CLASS_IID #undef BEGIN_FACTORY #undef DEF_CLASS #undef DEF_CLASS1