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

Updated LADSPA and plugin host demo for latest changes.

This commit is contained in:
jules 2013-09-28 09:42:22 +01:00
parent 06a01c9497
commit 3e233c2f24
6 changed files with 70 additions and 99 deletions

View file

@ -41,14 +41,9 @@ FilterGraph::FilterGraph (AudioPluginFormatManager& formatManager_)
{
InternalPluginFormat internalFormat;
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::audioInputFilter),
0.5f, 0.1f);
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::midiInputFilter),
0.25f, 0.1f);
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::audioOutputFilter),
0.5f, 0.9f);
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::audioInputFilter), 0.5f, 0.1f);
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::midiInputFilter), 0.25f, 0.1f);
addFilter (internalFormat.getDescriptionFor (InternalPluginFormat::audioOutputFilter), 0.5f, 0.9f);
setChangedFlag (false);
}
@ -83,13 +78,11 @@ void FilterGraph::addFilter (const PluginDescription* desc, double x, double y)
{
if (desc != nullptr)
{
String errorMessage;
AudioPluginInstance* instance = formatManager.createPluginInstance (*desc, errorMessage);
AudioProcessorGraph::Node* node = nullptr;
if (instance != nullptr)
String errorMessage;
if (AudioPluginInstance* instance = formatManager.createPluginInstance (*desc, graph.getSampleRate(), graph.getBlockSize(), errorMessage))
node = graph.addNode (instance);
if (node != nullptr)
@ -307,7 +300,7 @@ void FilterGraph::createNodeFromXml (const XmlElement& xml)
String errorMessage;
AudioPluginInstance* instance = formatManager.createPluginInstance (pd, errorMessage);
AudioPluginInstance* instance = formatManager.createPluginInstance (pd, graph.getSampleRate(), graph.getBlockSize(), errorMessage);
if (instance == nullptr)
{

View file

@ -46,20 +46,17 @@ InternalPluginFormat::InternalPluginFormat()
}
}
AudioPluginInstance* InternalPluginFormat::createInstanceFromDescription (const PluginDescription& desc)
AudioPluginInstance* InternalPluginFormat::createInstanceFromDescription (const PluginDescription& desc,
double /*sampleRate*/, int /*blockSize*/)
{
if (desc.name == audioOutDesc.name)
{
return new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioOutputNode);
}
else if (desc.name == audioInDesc.name)
{
if (desc.name == audioInDesc.name)
return new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::audioInputNode);
}
else if (desc.name == midiInDesc.name)
{
if (desc.name == midiInDesc.name)
return new AudioProcessorGraph::AudioGraphIOProcessor (AudioProcessorGraph::AudioGraphIOProcessor::midiInputNode);
}
return 0;
}

View file

@ -54,16 +54,16 @@ public:
void getAllTypes (OwnedArray <PluginDescription>& results);
//==============================================================================
String getName() const { return "Internal"; }
bool fileMightContainThisPluginType (const String&) { return false; }
FileSearchPath getDefaultLocationsToSearch() { return FileSearchPath(); }
bool canScanForPlugins() const { return false; }
void findAllTypesForFile (OwnedArray <PluginDescription>&, const String&) {}
bool doesPluginStillExist (const PluginDescription&) { return true; }
String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) { return fileOrIdentifier; }
bool pluginNeedsRescanning (const PluginDescription&) { return false; }
StringArray searchPathsForPlugins (const FileSearchPath&, bool) { return StringArray(); }
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
String getName() const override { return "Internal"; }
bool fileMightContainThisPluginType (const String&) override { return false; }
FileSearchPath getDefaultLocationsToSearch() override { return FileSearchPath(); }
bool canScanForPlugins() const override { return false; }
void findAllTypesForFile (OwnedArray <PluginDescription>&, const String&) override {}
bool doesPluginStillExist (const PluginDescription&) override { return true; }
String getNameOfPluginFromIdentifier (const String& fileOrIdentifier) override { return fileOrIdentifier; }
bool pluginNeedsRescanning (const PluginDescription&) override { return false; }
StringArray searchPathsForPlugins (const FileSearchPath&, bool) override { return StringArray(); }
AudioPluginInstance* createInstanceFromDescription (const PluginDescription&, double, int) override;
private:
//==============================================================================

View file

@ -778,26 +778,18 @@ public:
void setCurrentProgramStateInformation (const void* data, int sizeInBytes) override
{
CFReadStreamRef stream = CFReadStreamCreateWithBytesNoCopy (kCFAllocatorDefault,
(const UInt8*) data,
sizeInBytes,
kCFAllocatorNull);
CFReadStreamRef stream = CFReadStreamCreateWithBytesNoCopy (kCFAllocatorDefault, (const UInt8*) data,
sizeInBytes, kCFAllocatorNull);
CFReadStreamOpen (stream);
CFPropertyListFormat format = kCFPropertyListBinaryFormat_v1_0;
CFPropertyListRef propertyList = CFPropertyListCreateFromStream (kCFAllocatorDefault,
stream,
0,
kCFPropertyListImmutable,
&format,
0);
CFPropertyListRef propertyList = CFPropertyListCreateFromStream (kCFAllocatorDefault, stream, 0,
kCFPropertyListImmutable, &format, 0);
CFRelease (stream);
if (propertyList != 0)
{
AudioUnitSetProperty (audioUnit,
kAudioUnitProperty_ClassInfo,
kAudioUnitScope_Global,
AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ClassInfo, kAudioUnitScope_Global,
0, &propertyList, sizeof (propertyList));
sendAllParametersChangedEvents();
@ -1005,11 +997,11 @@ private:
}
}
static void eventListenerCallback (void* userData, void*, const AudioUnitEvent* event,
static void eventListenerCallback (void* userRef, void*, const AudioUnitEvent* event,
UInt64, AudioUnitParameterValue value)
{
jassert (event != nullptr);
static_cast <AudioUnitPluginInstance*> (userData)->eventCallback (*event, value);
static_cast<AudioUnitPluginInstance*> (userRef)->eventCallback (*event, value);
}
//==============================================================================
@ -1054,9 +1046,7 @@ private:
for (UInt32 i = 0; i < pktlist->numPackets; ++i)
{
midiConcatenator.pushMidiData (packet->data, (int) packet->length,
time, (void*) nullptr, *this);
midiConcatenator.pushMidiData (packet->data, (int) packet->length, time, (void*) nullptr, *this);
packet = MIDIPacketNext (packet);
}
}
@ -1149,40 +1139,39 @@ private:
}
//==============================================================================
static OSStatus renderGetInputCallback (void* inRefCon, AudioUnitRenderActionFlags* ioActionFlags,
static OSStatus renderGetInputCallback (void* hostRef, AudioUnitRenderActionFlags* ioActionFlags,
const AudioTimeStamp* inTimeStamp, UInt32 inBusNumber,
UInt32 inNumberFrames, AudioBufferList* ioData)
{
return static_cast <AudioUnitPluginInstance*> (inRefCon)
return static_cast<AudioUnitPluginInstance*> (hostRef)
->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
}
static OSStatus renderMidiOutputCallback (void* userData, const AudioTimeStamp* timeStamp, UInt32 midiOutNum,
static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp* timeStamp, UInt32 midiOutNum,
const struct MIDIPacketList* pktlist)
{
return static_cast <AudioUnitPluginInstance*> (userData)->renderMidiOutput (pktlist);
return static_cast<AudioUnitPluginInstance*> (hostRef)->renderMidiOutput (pktlist);
}
static OSStatus getBeatAndTempoCallback (void* inHostUserData, Float64* outCurrentBeat, Float64* outCurrentTempo)
static OSStatus getBeatAndTempoCallback (void* hostRef, Float64* outCurrentBeat, Float64* outCurrentTempo)
{
return static_cast <AudioUnitPluginInstance*> (inHostUserData)
->getBeatAndTempo (outCurrentBeat, outCurrentTempo);
return static_cast<AudioUnitPluginInstance*> (hostRef)->getBeatAndTempo (outCurrentBeat, outCurrentTempo);
}
static OSStatus getMusicalTimeLocationCallback (void* inHostUserData, UInt32* outDeltaSampleOffsetToNextBeat,
static OSStatus getMusicalTimeLocationCallback (void* hostRef, UInt32* outDeltaSampleOffsetToNextBeat,
Float32* outTimeSig_Numerator, UInt32* outTimeSig_Denominator,
Float64* outCurrentMeasureDownBeat)
{
return static_cast <AudioUnitPluginInstance*> (inHostUserData)
return static_cast<AudioUnitPluginInstance*> (hostRef)
->getMusicalTimeLocation (outDeltaSampleOffsetToNextBeat, outTimeSig_Numerator,
outTimeSig_Denominator, outCurrentMeasureDownBeat);
}
static OSStatus getTransportStateCallback (void* inHostUserData, Boolean* outIsPlaying, Boolean* outTransportStateChanged,
static OSStatus getTransportStateCallback (void* hostRef, Boolean* outIsPlaying, Boolean* outTransportStateChanged,
Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling,
Float64* outCycleStartBeat, Float64* outCycleEndBeat)
{
return static_cast <AudioUnitPluginInstance*> (inHostUserData)
return static_cast<AudioUnitPluginInstance*> (hostRef)
->getTransportState (outIsPlaying, outTransportStateChanged, outCurrentSampleInTimeLine,
outIsCycling, outCycleStartBeat, outCycleEndBeat);
}
@ -1212,7 +1201,7 @@ private:
void updateNumChannels()
{
numInputBusses = getElementCount (kAudioUnitScope_Input);
numInputBusses = getElementCount (kAudioUnitScope_Input);
numOutputBusses = getElementCount (kAudioUnitScope_Output);
AUChannelInfo supportedChannels [128];
@ -1300,7 +1289,7 @@ class AudioUnitPluginWindowCocoa : public AudioProcessorEditor,
public Timer
{
public:
AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, const bool createGenericViewIfNeeded)
AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded)
: AudioProcessorEditor (&p),
plugin (p)
{
@ -1511,17 +1500,14 @@ private:
class InnerWrapperComponent : public CarbonViewWrapperComponent
{
public:
InnerWrapperComponent (AudioUnitPluginWindowCarbon& owner_)
: owner (owner_)
{
}
InnerWrapperComponent (AudioUnitPluginWindowCarbon& w) : owner (w) {}
~InnerWrapperComponent()
{
deleteWindow();
}
HIViewRef attachView (WindowRef windowRef, HIViewRef rootView)
HIViewRef attachView (WindowRef windowRef, HIViewRef rootView) override
{
JUCE_AU_LOG ("Opening AU GUI: " + owner.plugin.getName());
@ -1546,7 +1532,7 @@ private:
return pluginView;
}
void removeView (HIViewRef)
void removeView (HIViewRef) override
{
owner.closeViewComponent();
}
@ -1570,7 +1556,7 @@ AudioProcessorEditor* AudioUnitPluginInstance::createEditor()
{
ScopedPointer<AudioProcessorEditor> w (new AudioUnitPluginWindowCocoa (*this, false));
if (! static_cast <AudioUnitPluginWindowCocoa*> (w.get())->isValid())
if (! static_cast<AudioUnitPluginWindowCocoa*> (w.get())->isValid())
w = nullptr;
#if JUCE_SUPPORT_CARBON
@ -1578,7 +1564,7 @@ AudioProcessorEditor* AudioUnitPluginInstance::createEditor()
{
w = new AudioUnitPluginWindowCarbon (*this);
if (! static_cast <AudioUnitPluginWindowCarbon*> (w.get())->isValid())
if (! static_cast<AudioUnitPluginWindowCarbon*> (w.get())->isValid())
w = nullptr;
}
#endif
@ -1639,8 +1625,7 @@ AudioPluginInstance* AudioUnitPluginFormat::createInstanceFromDescription (const
return nullptr;
}
StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath& /*directoriesToSearch*/,
const bool /*recursive*/)
StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&, bool /*recursive*/)
{
StringArray result;
AudioComponent comp = nullptr;
@ -1663,9 +1648,7 @@ StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&
|| desc.componentType == kAudioUnitType_Generator
|| desc.componentType == kAudioUnitType_Panner)
{
const String s (AudioUnitFormatHelpers::createPluginIdentifier (desc));
DBG (s);
result.add (s);
result.add (AudioUnitFormatHelpers::createPluginIdentifier (desc));
}
}

View file

@ -167,8 +167,10 @@ public:
handle = nullptr;
}
void initialise()
void initialise (double initialSampleRate, int initialBlockSize)
{
setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize);
if (initialised || plugin == nullptr || handle == nullptr)
return;
@ -199,9 +201,7 @@ public:
for (int i = 0; i < parameters.size(); ++i)
plugin->connect_port (handle, parameters[i], &(parameterValues[i].scaled));
setPlayConfigDetails (inputs.size(), outputs.size(),
getSampleRate() > 0 ? getSampleRate() : 44100.0f,
getBlockSize() > 0 ? getBlockSize() : 512);
setPlayConfigDetails (inputs.size(), outputs.size(), initialSampleRate, initialBlockSize);
setCurrentProgram (0);
setLatencySamples (0);
@ -257,12 +257,9 @@ public:
//==============================================================================
void prepareToPlay (double newSampleRate, int samplesPerBlockExpected)
{
setPlayConfigDetails (inputs.size(), outputs.size(),
newSampleRate, samplesPerBlockExpected);
setLatencySamples (0);
initialise();
initialise (newSampleRate, samplesPerBlockExpected);
if (initialised)
{
@ -584,12 +581,12 @@ void LADSPAPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>& re
desc.fileOrIdentifier = fileOrIdentifier;
desc.uid = 0;
ScopedPointer<LADSPAPluginInstance> instance (dynamic_cast <LADSPAPluginInstance*> (createInstanceFromDescription (desc)));
ScopedPointer<LADSPAPluginInstance> instance (dynamic_cast<LADSPAPluginInstance*> (createInstanceFromDescription (desc, 44100.0, 512)));
if (instance == nullptr || ! instance->isValid())
return;
instance->initialise();
instance->initialise (44100.0, 512);
instance->fillInPluginDescription (desc);
@ -613,7 +610,8 @@ void LADSPAPluginFormat::findAllTypesForFile (OwnedArray <PluginDescription>& re
}
}
AudioPluginInstance* LADSPAPluginFormat::createInstanceFromDescription (const PluginDescription& desc)
AudioPluginInstance* LADSPAPluginFormat::createInstanceFromDescription (const PluginDescription& desc,
double sampleRate, int blockSize)
{
ScopedPointer<LADSPAPluginInstance> result;
@ -633,7 +631,7 @@ AudioPluginInstance* LADSPAPluginFormat::createInstanceFromDescription (const Pl
result = new LADSPAPluginInstance (module);
if (result->plugin != nullptr && result->isValid())
result->initialise();
result->initialise (sampleRate, blockSize);
else
result = nullptr;
}

View file

@ -36,16 +36,16 @@ public:
~LADSPAPluginFormat();
//==============================================================================
String getName() const { return "LADSPA"; }
void findAllTypesForFile (OwnedArray <PluginDescription>&, const String& fileOrIdentifier);
AudioPluginInstance* createInstanceFromDescription (const PluginDescription& desc);
bool fileMightContainThisPluginType (const String& fileOrIdentifier);
String getNameOfPluginFromIdentifier (const String& fileOrIdentifier);
bool pluginNeedsRescanning (const PluginDescription&);
StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive);
bool doesPluginStillExist (const PluginDescription&);
FileSearchPath getDefaultLocationsToSearch();
bool canScanForPlugins() const { return true; }
String getName() const override { return "LADSPA"; }
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;
StringArray searchPathsForPlugins (const FileSearchPath&, bool recursive) override;
bool doesPluginStillExist (const PluginDescription&) override;
FileSearchPath getDefaultLocationsToSearch() override;
bool canScanForPlugins() const override { return true; }
private:
void recursiveFileSearch (StringArray&, const File&, bool recursive);