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:
parent
06a01c9497
commit
3e233c2f24
6 changed files with 70 additions and 99 deletions
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue