1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

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.

This commit is contained in:
jules 2013-09-27 23:02:21 +01:00
parent 278c5d0cb5
commit 06a01c9497
7 changed files with 43 additions and 44 deletions

View file

@ -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.

View file

@ -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

View file

@ -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.

View file

@ -38,7 +38,7 @@ public:
//==============================================================================
String getName() const override { return "AudioUnit"; }
void findAllTypesForFile (OwnedArray <PluginDescription>&, 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;

View file

@ -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 <PluginDescription>&
try
{
ScopedPointer <AudioPluginInstance> createdInstance (createInstanceFromDescription (desc));
ScopedPointer<AudioPluginInstance> createdInstance (createInstanceFromDescription (desc, 44100.0, 512));
if (AudioUnitPluginInstance* const auInstance = dynamic_cast <AudioUnitPluginInstance*> (createdInstance.get()))
if (AudioUnitPluginInstance* auInstance = dynamic_cast<AudioUnitPluginInstance*> (createdInstance.get()))
results.add (new PluginDescription (auInstance->getPluginDescription()));
}
catch (...)
@ -1622,15 +1623,15 @@ void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>&
}
}
AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc)
AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const PluginDescription& desc, double rate, int blockSize)
{
if (fileMightContainThisPluginType (desc.fileOrIdentifier))
{
ScopedPointer <AudioUnitPluginInstance> result (new AudioUnitPluginInstance (desc.fileOrIdentifier));
ScopedPointer<AudioUnitPluginInstance> result (new AudioUnitPluginInstance (desc.fileOrIdentifier));
if (result->audioUnit != nullptr)
{
result->initialise();
result->initialise (rate, blockSize);
return result.release();
}
}

View file

@ -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 <VSTPluginInstance*> (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<VSTPluginInstance*> (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 <PluginDescription>& resul
}
}
AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc)
AudioPluginInstance* VSTPluginFormat::createInstanceFromDescription (const PluginDescription& desc,
double sampleRate, int blockSize)
{
ScopedPointer<VSTPluginInstance> 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
{

View file

@ -86,8 +86,8 @@ public:
//==============================================================================
String getName() const override { return "VST"; }
void findAllTypesForFile (OwnedArray <PluginDescription>&, const String& fileOrIdentifier) override;
AudioPluginInstance* createInstanceFromDescription (const PluginDescription&) override;
void findAllTypesForFile (OwnedArray<PluginDescription>&, 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;