diff --git a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp index 7da6f799d6..ceafe80374 100644 --- a/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/VST3/juce_VST3_Wrapper.cpp @@ -109,14 +109,6 @@ private: JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (JuceAudioProcessor) }; -#define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(CommonClassType, SourceClassType) \ - if (doUIDsMatch (iid, CommonClassType::iid)) \ - { \ - addRef(); \ - *obj = (CommonClassType*) static_cast (this); \ - return Steinberg::kResultOk; \ - } - //============================================================================== class JuceVST3EditController : public Vst::EditController, public Vst::IMidiMapping, @@ -137,15 +129,15 @@ public: tresult PLUGIN_API queryInterface (const TUID targetIID, void** obj) override { - TEST_FOR_AND_RETURN_IF_VALID (FObject) - TEST_FOR_AND_RETURN_IF_VALID (JuceVST3EditController) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IEditController) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IEditController2) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IConnectionPoint) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IMidiMapping) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (IPluginBase, Vst::IEditController) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (IDependent, Vst::IEditController) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (FUnknown, Vst::IEditController) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, FObject) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, JuceVST3EditController) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IEditController) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IEditController2) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IConnectionPoint) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IMidiMapping) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, IPluginBase, Vst::IEditController) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, IDependent, Vst::IEditController) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, FUnknown, Vst::IEditController) if (doUIDsMatch (targetIID, JuceAudioProcessor::iid)) { @@ -579,6 +571,8 @@ public: processSetup.processMode = Vst::kRealtime; processSetup.sampleRate = 44100.0; processSetup.symbolicSampleSize = Vst::kSample32; + + pluginInstance->setPlayHead (this); } ~JuceVST3Component() @@ -603,13 +597,13 @@ public: tresult PLUGIN_API queryInterface (const TUID targetIID, void** obj) override { - TEST_FOR_AND_RETURN_IF_VALID (IPluginBase) - TEST_FOR_AND_RETURN_IF_VALID (JuceVST3Component) - 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) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (FUnknown, Vst::IComponent) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginBase) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, JuceVST3Component) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IComponent) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IAudioProcessor) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IUnitInfo) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, Vst::IConnectionPoint) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (targetIID, FUnknown, Vst::IComponent) if (doUIDsMatch (targetIID, JuceAudioProcessor::iid)) { @@ -1086,6 +1080,9 @@ public: return kResultFalse; #endif + preparePlugin (getPluginInstance().getSampleRate(), + getPluginInstance().getBlockSize()); + return kResultTrue; } @@ -1194,15 +1191,6 @@ public: const int numInputChans = data.inputs != nullptr ? (int) data.inputs[0].numChannels : 0; const int numOutputChans = data.outputs != nullptr ? (int) data.outputs[0].numChannels : 0; - if (numInputChans != pluginInstance->getNumInputChannels() - || numOutputChans != pluginInstance->getNumOutputChannels()) - { - const double sampleRate = pluginInstance->getSampleRate(); - const int bufferSize = (int) data.numSamples; - pluginInstance->setPlayConfigDetails (numInputChans, numOutputChans, sampleRate, bufferSize); - pluginInstance->prepareToPlay (sampleRate, bufferSize); - } - int totalChans = 0; while (totalChans < numInputChans) @@ -1320,8 +1308,12 @@ private: void preparePlugin (double sampleRate, int bufferSize) { - getPluginInstance().setPlayConfigDetails (JucePlugin_MaxNumInputChannels, - JucePlugin_MaxNumOutputChannels, + Vst::BusInfo inputBusInfo, outputBusInfo; + audioInputs.first()->getInfo (inputBusInfo); + audioOutputs.first()->getInfo (outputBusInfo); + + getPluginInstance().setPlayConfigDetails (inputBusInfo.channelCount, + outputBusInfo.channelCount, sampleRate, bufferSize); getPluginInstance().prepareToPlay (sampleRate, bufferSize); @@ -1531,12 +1523,12 @@ public: //============================================================================== JUCE_DECLARE_VST3_COM_REF_METHODS - tresult PLUGIN_API queryInterface (const TUID iid, void** obj) override + tresult PLUGIN_API queryInterface (const TUID targetIID, 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) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory3) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory2) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, IPluginFactory) + TEST_FOR_AND_RETURN_IF_VALID (targetIID, FUnknown) jassertfalse; // Something new? *obj = nullptr; diff --git a/modules/juce_audio_processors/format_types/juce_VST3Common.h b/modules/juce_audio_processors/format_types/juce_VST3Common.h index d66a7598d7..c91411cc42 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3Common.h +++ b/modules/juce_audio_processors/format_types/juce_VST3Common.h @@ -43,16 +43,16 @@ static bool doUIDsMatch (const Steinberg::TUID a, const Steinberg::TUID b) noexc return std::memcmp (a, b, sizeof (Steinberg::TUID)) == 0; } -#define TEST_FOR_AND_RETURN_IF_VALID(ClassType) \ - if (doUIDsMatch (iid, ClassType::iid)) \ +#define TEST_FOR_AND_RETURN_IF_VALID(iidToTest, ClassType) \ + if (doUIDsMatch (iidToTest, ClassType::iid)) \ { \ addRef(); \ *obj = dynamic_cast (this); \ return Steinberg::kResultOk; \ } -#define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(CommonClassType, SourceClassType) \ - if (doUIDsMatch (iid, CommonClassType::iid)) \ +#define TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID(iidToTest, CommonClassType, SourceClassType) \ + if (doUIDsMatch (iidToTest, CommonClassType::iid)) \ { \ addRef(); \ *obj = (CommonClassType*) static_cast (this); \ diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 5f2d4f5610..4dfd4f8170 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -534,14 +534,14 @@ public: return kResultOk; } - TEST_FOR_AND_RETURN_IF_VALID (Vst::IComponentHandler) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IComponentHandler2) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IComponentHandler3) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IContextMenuTarget) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IHostApplication) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IParamValueQueue) - TEST_FOR_AND_RETURN_IF_VALID (Vst::IUnitHandler) - TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (FUnknown, Vst::IComponentHandler) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler2) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IComponentHandler3) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IContextMenuTarget) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IHostApplication) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IParamValueQueue) + TEST_FOR_AND_RETURN_IF_VALID (iid, Vst::IUnitHandler) + TEST_FOR_COMMON_BASE_AND_RETURN_IF_VALID (iid, FUnknown, Vst::IComponentHandler) *obj = nullptr; return kNotImplemented;