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:
parent
278c5d0cb5
commit
06a01c9497
7 changed files with 43 additions and 44 deletions
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue