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