VST3 Plugin wrapper

FYI I've just committed the first version of the VST3 (client) wrapper code.. Thanks to jrlanglois for doing most of the work on getting this implemented.

Feedback welcome! It's hot off the presses and hasn't had much testing, so any bug-spotting would be appreciated!

This is awesome.  Thanks for implementing this!

However I am getting a few compiler errors and perhaps I am missing something.

/Users/marc/plugin-development/JUCE_BUILDS/FL2Flanger/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:770:13: Reference to 'MemoryBlock' is ambiguous

/Users/marc/plugin-development/JUCE_BUILDS/FL2Flanger/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:771:50: Use of undeclared identifier 'mem'

/Users/marc/plugin-development/JUCE_BUILDS/FL2Flanger/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:772:34: Use of undeclared identifier 'mem'

/Users/marc/plugin-development/JUCE_BUILDS/FL2Flanger/JuceLibraryCode/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp:1201:5: Reference to 'uint32' is ambiguous

Ah, I hadn't tried building it with the old Carbon headers. Have fixed that now.

Thanks! It is compling now. I'm testing it with Cubase 7.5 where my plugin shows up in the browser, but fails to load (selecting it does nothing). My VST2 version is working and loading fine.

I've also tried creating a clean test plugin via the Introjucer ('hello world') and tried loading it in both Cubase 7.5 as well as the Steinberg's VST3PluginTestHost and the same thing. It shows up in the plugin list, but fails to load. 

Also the plugin shows up in the 'Other' category. Is there a way to set the category via the Introjucer (like with AAX and RTAS)? 


Does commenting out line 1080 in juce_VST3_Wrapper.cpp fix the problem? I recall the Steinberg Validator complaining that process() should just return kResultTrue...

Just tried it and still the same result (with the clean test plugin and VST3PluginTestHost). 

I have the same issue in Cubase 7.5

The plugin is listed and you can select it… but it doesn’t load…

In the Plugin Information List it has no I/O listed

I have

It also seems to be ignoring JucePlugin_IsSynth and is only listed as Instrument instead of Instrument|Synth

(JucePlugin_Vst3Category is not defined in AppConfig.h)


I added

#ifndef  JucePlugin_Vst3Category
 #define JucePlugin_Vst3Category           Vst::PlugType::kInstrumentSynth

to my AppConfig.h and the category now shows correctly in Cubase… but latency, side chain & I/O are still blank.

I have

#ifndef  JucePlugin_MaxNumInputChannels
 #define JucePlugin_MaxNumInputChannels    2
#ifndef  JucePlugin_MaxNumOutputChannels
 #define JucePlugin_MaxNumOutputChannels   32


The Windows x64 post build copy fails… I had to add quotes to the post build step:

Strangely enough the debug post copy worked fine without the quotes ??

1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: The command "copy /Y C:\Users\username\Documents\juce projects\PlugName\Builds\VisualStudio2012\x64\Debug\PlugName.dll C:\Users\ username\Documents\juce projects\PlugName\Builds\VisualStudio2012\x64\Debug\PlugName.vst3
1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.CppCommon.targets(134,5): error MSB3073: :VCEnd" exited with code 1.


Thanks - will add those quotes. Annoyingly I don't currently have a copy of Cubse 7 to try this, so any clues people can give would be appreciated.

Well I just built my plugin in VC2012 (x64) which has:

#ifndef  JucePlugin_WantsMidiInput
 #define JucePlugin_WantsMidiInput         1

and it builds fine (x64) and the JUCE Demo host scans and finds it fine… but when I add it to the graph, the host crashes at:

juce_OwnedArray.h line 157 in getUnchecked()

being called from

juce_AudioProcessorGraph.cpp line 226

being called from AudioProcessorGraph::processBlock()


You can use the VST3PluginTestHost included in the SDK… Same issue… the (Synth) plugin is listed but won’t load… I haven’t tested with the demo plugin yet.

The Test host is located in: VST3 SDK/bin/Mac OS X/VST3PluginTestHost.pkg.tar.bz2


I'm getting the same issue with the demo plugin and VST3PluginTestHost. Also, launching VST3PluginTestHost from the debugger doesn't report anything other than "JUCE v3.0.2". 


Haven't looked into this yet, but FYI there are nasty linkage problems if you attempt to run the debug plugin inside a debug version of the demo host. I wasted a couple of hours before I realised that the OS was incorrectly cross-linking some DLL symbols and that this was causing random internal problems. That was on OSX but similar things could probably happen on Windows too.

Hi Jules,

I haven’t noticed any issues when debugging on either platform with both being debug versions… but I did make this change a while ago to fix a problem in XCode which may be causing your problem…

void AudioFormatManager::registerBasicFormats()
    registerFormat (new WavAudioFormat(), true);
    registerFormat (new AiffAudioFormat(), false);

    registerFormat (new FlacAudioFormat(), false);

    registerFormat (new OggVorbisAudioFormat(), false);

    #if JUCE_MAC || JUCE_IOS
        #ifndef JUCE_DEBUG
            registerFormat (new CoreAudioFormat(), false);

    registerFormat (new MP3AudioFormat(), false);

    registerFormat (new WindowsMediaAudioFormat(), false);

See: http://www.juce.com/forum/topic/registerbasicformats-and-xcode-debugger



I was able to fix a handful of things to get the plugin working in the VST3PluginTestHost - sent such to Jules... Please test in Cubase again soon!

Thanks for the updates to the audio plugin stuff!

Just mentioning that JuceDemoPlugin doesn't compile at the moment for VS2008 (just pulled from github).

I get these errors about int64 ambiguity:

e:\juce\modules\juce_audio_plugin_client\vst3\juce_vst3_wrapper.cpp(310) : error C2872: 'int64' : ambiguous symbol could be 'c:\sdks\vst3 sdk\pluginterfaces\base\ftypes.h(79) : __int64 Steinberg::int64' or 'e:\juce\modules\juce_core\maths\juce_mathsfunctions.h(55) : juce::int64' e:\juce\modules\juce_audio_plugin_client\vst3\juce_vst3_wrapper.cpp(234) : error C2872: 'int64' : ambiguous symbol could be 'c:\sdks\vst3 sdk\pluginterfaces\base\ftypes.h(79) : __int64 Steinberg::int64' or 'e:\juce\modules\juce_core\maths\juce_mathsfunctions.h(55) : juce::int64' e:\juce\modules\juce_audio_plugin_client\vst3\juce_vst3_wrapper.cpp(661) : error C2872: 'int64' : ambiguous symbol could be 'c:\sdks\vst3 sdk\pluginterfaces\base\ftypes.h(79) : __int64 Steinberg::int64' or 'e:\juce\modules\juce_core\maths\juce_mathsfunctions.h(55) : juce::int64' 


Hi jules,

Thanks a lot for the work!

I just downloaded the latest 3.0.2 and built a new introjucer to create a vst3 plugin.

The generated hello world project can be built and loaded fine.

However, after I copied in the sources of my plugin into the project, I got link errors like:


Undefined symbols for architecture x86_64:

  "juce::initialiseMac()", referenced from:

      initModule() in juce_VST3_Wrapper-7EC2410FEE7297A.o

  "juce::setNativeHostWindowSize(void*, juce::Component*, int, int, bool)", referenced from:

      JuceVST3EditController::JuceVST3Editor::ContentWrapperComponent::resizeHostWindow() in juce_VST3_Wrapper-7EC2410FEE7297A.o

  "juce::attachComponentToWindowRef(juce::Component*, void*, bool)", referenced from:

      JuceVST3EditController::JuceVST3Editor::attached(void*, char const*) in juce_VST3_Wrapper-7EC2410FEE7297A.o

  "juce::detachComponentFromWindowRef(juce::Component*, void*, bool)", referenced from:

      JuceVST3EditController::JuceVST3Editor::removed() in juce_VST3_Wrapper-7EC2410FEE7297A.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

I am on 10.9 osx and xcode 5.0.2.


Any thoughts? Thanks.

No idea.. Those functions all seem to be declared and used correctly, and it works in the demo project.. Must be something you're doing in your code, but I can't think what, I'm afraid.