From 06a01c9497fba4460190cc2cba2ccc556ef14d7e Mon Sep 17 00:00:00 2001 From: jules Date: Fri, 27 Sep 2013 23:02:21 +0100 Subject: [PATCH] Changed AudioPluginFormat::createInstanceFromDescription() to take sample rate + block size parameters. This allows it to pass them to the plugin earlier in its construction, as some plugins seem to be flaky if this doesn't happen. --- .../format/juce_AudioPluginFormat.h | 4 ++- .../format/juce_AudioPluginFormatManager.cpp | 26 ++++---------- .../format/juce_AudioPluginFormatManager.h | 2 ++ .../format_types/juce_AudioUnitPluginFormat.h | 2 +- .../juce_AudioUnitPluginFormat.mm | 15 ++++---- .../format_types/juce_VSTPluginFormat.cpp | 34 +++++++++++-------- .../format_types/juce_VSTPluginFormat.h | 4 +-- 7 files changed, 43 insertions(+), 44 deletions(-) diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormat.h b/modules/juce_audio_processors/format/juce_AudioPluginFormat.h index d28c20a61f..6336b5bda2 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormat.h +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormat.h @@ -60,7 +60,9 @@ public: /** Tries to recreate a type from a previously generated PluginDescription. @see PluginDescription::createInstance */ - virtual AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc) = 0; + virtual AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, + double initialSampleRate, + int initialBufferSize) = 0; /** Should do a quick check to see if this file or directory might be a plugin of this format. diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp index 7535a721db..10ae2ca5bd 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.cpp @@ -74,28 +74,16 @@ void AudioPluginFormatManager::addFormat (AudioPluginFormat* const format) formats.add (format); } -AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const PluginDescription& description, - String& errorMessage) const +AudioPluginInstance* AudioPluginFormatManager::createPluginInstance (const PluginDescription& description, double rate, + int blockSize, String& errorMessage) const { - AudioPluginInstance* result = nullptr; - for (int i = 0; i < formats.size(); ++i) - { - result = formats.getUnchecked(i)->createInstanceFromDescription (description); + if (AudioPluginInstance* result = formats.getUnchecked(i)->createInstanceFromDescription (description, rate, blockSize)) + return result; - if (result != nullptr) - break; - } - - if (result == nullptr) - { - if (! doesPluginStillExist (description)) - errorMessage = TRANS ("This plug-in file no longer exists"); - else - errorMessage = TRANS ("This plug-in failed to load correctly"); - } - - return result; + errorMessage = doesPluginStillExist (description) ? TRANS ("This plug-in failed to load correctly") + : TRANS ("This plug-in file no longer exists"); + return nullptr; } bool AudioPluginFormatManager::doesPluginStillExist (const PluginDescription& description) const diff --git a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h index 7d491cf61b..7e502b39ef 100644 --- a/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h +++ b/modules/juce_audio_processors/format/juce_AudioPluginFormatManager.h @@ -77,6 +77,8 @@ public: errorMessage string. */ AudioPluginInstance* createPluginInstance (const PluginDescription& description, + double initialSampleRate, + int initialBufferSize, String& errorMessage) const; /** Checks that the file or component for this plugin actually still exists. diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h index 24e37bea6f..ef6d59a158 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h @@ -38,7 +38,7 @@ public: //============================================================================== String getName() const override { return "AudioUnit"; } void findAllTypesForFile (OwnedArray &, const String& fileOrIdentifier) override; - AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc) override; + AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc, double, int) override; bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; bool pluginNeedsRescanning (const PluginDescription&) override; diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index d951b2295a..234c0f5afe 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -331,14 +331,15 @@ public: } } - void initialise() + void initialise (double rate, int blockSize) { refreshParameterList(); updateNumChannels(); producesMidiMessages = canProduceMidiOutput(); setPluginCallbacks(); setPlayConfigDetails (numInputBusChannels * numInputBusses, - numOutputBusChannels * numOutputBusses, 0, 0); + numOutputBusChannels * numOutputBusses, + rate, blockSize); setLatencySamples (0); } @@ -1611,9 +1612,9 @@ void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray & try { - ScopedPointer createdInstance (createInstanceFromDescription (desc)); + ScopedPointer createdInstance (createInstanceFromDescription (desc, 44100.0, 512)); - if (AudioUnitPluginInstance* const auInstance = dynamic_cast (createdInstance.get())) + if (AudioUnitPluginInstance* auInstance = dynamic_cast (createdInstance.get())) results.add (new PluginDescription (auInstance->getPluginDescription())); } catch (...) @@ -1622,15 +1623,15 @@ void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray & } } -AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc) +AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc, double rate, int blockSize) { if (fileMightContainThisPluginType (desc.fileOrIdentifier)) { - ScopedPointer result (new AudioUnitPluginInstance (desc.fileOrIdentifier)); + ScopedPointer result (new AudioUnitPluginInstance (desc.fileOrIdentifier)); if (result->audioUnit != nullptr) { - result->initialise(); + result->initialise (rate, blockSize); return result.release(); } } diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 3df581c2cf..ff8645877a 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -828,7 +828,7 @@ public: desc.isInstrument = (effect != nullptr && (effect->flags & effFlagsIsSynth) != 0); } - void initialise() + void initialise (double initialSampleRate, int initialBlockSize) { if (initialised || effect == nullptr) return; @@ -844,6 +844,9 @@ public: JUCE_VST_LOG ("Initialising VST: " + module->pluginName); initialised = true; + setPlayConfigDetails (effect->numInputs, effect->numOutputs, + initialSampleRate, initialBlockSize); + dispatch (effIdentify, 0, 0, 0, 0); if (getSampleRate() > 0) @@ -922,7 +925,7 @@ public: vstHostTime.samplePos = 0; vstHostTime.flags = kVstNanosValid | kVstAutomationWriting | kVstAutomationReading; - initialise(); + initialise (rate, samplesPerBlockExpected); if (initialised) { @@ -2611,16 +2614,20 @@ VSTPluginFormat::~VSTPluginFormat() {} static VSTPluginInstance* createAndUpdateDesc (VSTPluginFormat& format, PluginDescription& desc) { - if (VSTPluginInstance* instance = dynamic_cast (format.createInstanceFromDescription (desc))) + if (AudioPluginInstance* p = format.createInstanceFromDescription (desc, 44100.0, 512)) { - #if JUCE_MAC - if (instance->module->resFileId != 0) - UseResFile (instance->module->resFileId); - #endif + if (VSTPluginInstance* instance = dynamic_cast (p)) + { + #if JUCE_MAC + if (instance->module->resFileId != 0) + UseResFile (instance->module->resFileId); + #endif - instance->fillInPluginDescription (desc); + instance->fillInPluginDescription (desc); + return instance; + } - return instance; + jassertfalse; } return nullptr; @@ -2676,7 +2683,8 @@ void VSTPluginFormat::findAllTypesForFile (OwnedArray & resul } } -AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc) +AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc, + double sampleRate, int blockSize) { ScopedPointer result; @@ -2687,9 +2695,7 @@ AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const Plugi const File previousWorkingDirectory (File::getCurrentWorkingDirectory()); file.getParentDirectory().setAsCurrentWorkingDirectory(); - const ModuleHandle::Ptr module (ModuleHandle::findOrCreateModule (file)); - - if (module != nullptr) + if (ModuleHandle::Ptr module = ModuleHandle::findOrCreateModule (file)) { shellUIDToCreate = desc.uid; @@ -2698,7 +2704,7 @@ AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const Plugi if (result->effect != nullptr) { result->effect->resvd2 = (VstIntPtr) (pointer_sized_int) (VSTPluginInstance*) result; - result->initialise(); + result->initialise (sampleRate, blockSize); } else { diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h index 3103fb7738..0c38b806df 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.h @@ -86,8 +86,8 @@ public: //============================================================================== String getName() const override { return "VST"; } - void findAllTypesForFile (OwnedArray &, const String& fileOrIdentifier) override; - AudioPluginInstance* createInstanceFromDescription (const PluginDescription&) override; + void findAllTypesForFile (OwnedArray&, const String& fileOrIdentifier) override; + AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override; bool fileMightContainThisPluginType (const String& fileOrIdentifier) override; String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override; bool pluginNeedsRescanning (const PluginDescription&) override;