|
|
@@ -341,12 +341,7 @@ public: |
|
|
|
|
|
|
|
|
if (auto* au = pluginInstance.audioUnit)
|
|
|
if (auto* au = pluginInstance.audioUnit)
|
|
|
{
|
|
|
{
|
|
|
AudioUnitGetParameter (au,
|
|
|
|
|
|
paramID,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
&value);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AudioUnitGetParameter (au, paramID, kAudioUnitScope_Global, 0, &value);
|
|
|
value = normaliseParamValue (value);
|
|
|
value = normaliseParamValue (value);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -359,12 +354,8 @@ public: |
|
|
|
|
|
|
|
|
if (auto* au = pluginInstance.audioUnit)
|
|
|
if (auto* au = pluginInstance.audioUnit)
|
|
|
{
|
|
|
{
|
|
|
AudioUnitSetParameter (au,
|
|
|
|
|
|
paramID,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
scaleParamValue (newValue),
|
|
|
|
|
|
0);
|
|
|
|
|
|
|
|
|
AudioUnitSetParameter (au, paramID, kAudioUnitScope_Global,
|
|
|
|
|
|
0, scaleParamValue (newValue), 0);
|
|
|
|
|
|
|
|
|
sendParameterChangeEvent();
|
|
|
sendParameterChangeEvent();
|
|
|
}
|
|
|
}
|
|
|
@@ -406,12 +397,12 @@ public: |
|
|
|
|
|
|
|
|
UInt32 propertySize = sizeof (stringValue);
|
|
|
UInt32 propertySize = sizeof (stringValue);
|
|
|
|
|
|
|
|
|
OSStatus err = AudioUnitGetProperty (au,
|
|
|
|
|
|
kAudioUnitProperty_ParameterStringFromValue,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
&stringValue,
|
|
|
|
|
|
&propertySize);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetProperty (au,
|
|
|
|
|
|
kAudioUnitProperty_ParameterStringFromValue,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
&stringValue,
|
|
|
|
|
|
&propertySize);
|
|
|
|
|
|
|
|
|
if (! err && stringValue.outString != nullptr)
|
|
|
if (! err && stringValue.outString != nullptr)
|
|
|
return String::fromCFString (stringValue.outString).substring (0, maximumLength);
|
|
|
return String::fromCFString (stringValue.outString).substring (0, maximumLength);
|
|
|
@@ -441,12 +432,12 @@ public: |
|
|
|
|
|
|
|
|
UInt32 propertySize = sizeof (valueString);
|
|
|
UInt32 propertySize = sizeof (valueString);
|
|
|
|
|
|
|
|
|
OSStatus err = AudioUnitGetProperty (au,
|
|
|
|
|
|
kAudioUnitProperty_ParameterValueFromString,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
&valueString,
|
|
|
|
|
|
&propertySize);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetProperty (au,
|
|
|
|
|
|
kAudioUnitProperty_ParameterValueFromString,
|
|
|
|
|
|
kAudioUnitScope_Global,
|
|
|
|
|
|
0,
|
|
|
|
|
|
&valueString,
|
|
|
|
|
|
&propertySize);
|
|
|
|
|
|
|
|
|
if (! err)
|
|
|
if (! err)
|
|
|
return normaliseParamValue (valueString.outValue);
|
|
|
return normaliseParamValue (valueString.outValue);
|
|
|
@@ -456,25 +447,10 @@ public: |
|
|
return Parameter::getValueForText (text);
|
|
|
return Parameter::getValueForText (text);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
bool isAutomatable() const override
|
|
|
|
|
|
{
|
|
|
|
|
|
return automatable;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool isDiscrete() const override
|
|
|
|
|
|
{
|
|
|
|
|
|
return discrete;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool isBoolean() const override
|
|
|
|
|
|
{
|
|
|
|
|
|
return isSwitch;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int getNumSteps() const override
|
|
|
|
|
|
{
|
|
|
|
|
|
return numSteps;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
bool isAutomatable() const override { return automatable; }
|
|
|
|
|
|
bool isDiscrete() const override { return discrete; }
|
|
|
|
|
|
bool isBoolean() const override { return isSwitch; }
|
|
|
|
|
|
int getNumSteps() const override { return numSteps; }
|
|
|
|
|
|
|
|
|
StringArray getAllValueStrings() const override
|
|
|
StringArray getAllValueStrings() const override
|
|
|
{
|
|
|
{
|
|
|
@@ -528,12 +504,6 @@ public: |
|
|
AudioUnitPluginInstance (AudioComponentInstance au)
|
|
|
AudioUnitPluginInstance (AudioComponentInstance au)
|
|
|
: AudioPluginInstance (getBusesProperties (au)),
|
|
|
: AudioPluginInstance (getBusesProperties (au)),
|
|
|
auComponent (AudioComponentInstanceGetComponent (au)),
|
|
|
auComponent (AudioComponentInstanceGetComponent (au)),
|
|
|
wantsMidiMessages (false),
|
|
|
|
|
|
producesMidiMessages (false),
|
|
|
|
|
|
wasPlaying (false),
|
|
|
|
|
|
prepared (false),
|
|
|
|
|
|
isAUv3 (false),
|
|
|
|
|
|
currentBuffer (nullptr),
|
|
|
|
|
|
audioUnit (au),
|
|
|
audioUnit (au),
|
|
|
#if JUCE_MAC
|
|
|
#if JUCE_MAC
|
|
|
eventListenerRef (0),
|
|
|
eventListenerRef (0),
|
|
|
@@ -735,7 +705,7 @@ public: |
|
|
if (getElementCount (scope) != n && isBusCountWritable (isInput))
|
|
|
if (getElementCount (scope) != n && isBusCountWritable (isInput))
|
|
|
{
|
|
|
{
|
|
|
OSStatus err;
|
|
|
OSStatus err;
|
|
|
UInt32 newCount = static_cast<UInt32> (n);
|
|
|
|
|
|
|
|
|
auto newCount = static_cast<UInt32> (n);
|
|
|
layoutHasChanged = true;
|
|
|
layoutHasChanged = true;
|
|
|
|
|
|
|
|
|
err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount));
|
|
|
err = AudioUnitSetProperty (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &newCount, sizeof (newCount));
|
|
|
@@ -755,7 +725,8 @@ public: |
|
|
{
|
|
|
{
|
|
|
AudioStreamBasicDescription stream;
|
|
|
AudioStreamBasicDescription stream;
|
|
|
UInt32 dataSize = sizeof (stream);
|
|
|
UInt32 dataSize = sizeof (stream);
|
|
|
OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_StreamFormat, scope, static_cast<UInt32> (i), &stream, &dataSize);
|
|
|
|
|
|
|
|
|
if (err != noErr || dataSize < sizeof (stream))
|
|
|
if (err != noErr || dataSize < sizeof (stream))
|
|
|
return false;
|
|
|
return false;
|
|
|
|
|
|
|
|
|
@@ -788,7 +759,7 @@ public: |
|
|
UInt32 dataSize = minDataSize;
|
|
|
UInt32 dataSize = minDataSize;
|
|
|
|
|
|
|
|
|
AudioChannelLayoutTag actualTag = kAudioChannelLayoutTag_Unknown;
|
|
|
AudioChannelLayoutTag actualTag = kAudioChannelLayoutTag_Unknown;
|
|
|
OSStatus err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetProperty (audioUnit, kAudioUnitProperty_AudioChannelLayout, scope, static_cast<UInt32> (i), &layout, &dataSize);
|
|
|
bool supportsLayouts = (err == noErr && dataSize >= minDataSize);
|
|
|
bool supportsLayouts = (err == noErr && dataSize >= minDataSize);
|
|
|
|
|
|
|
|
|
if (supportsLayouts)
|
|
|
if (supportsLayouts)
|
|
|
@@ -1484,7 +1455,10 @@ private: |
|
|
String pluginName, manufacturer, version;
|
|
|
String pluginName, manufacturer, version;
|
|
|
String fileOrIdentifier;
|
|
|
String fileOrIdentifier;
|
|
|
CriticalSection lock;
|
|
|
CriticalSection lock;
|
|
|
bool wantsMidiMessages, producesMidiMessages, wasPlaying, prepared, isAUv3, isMidiEffectPlugin, lastBypassValue = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool wantsMidiMessages = false, producesMidiMessages = false,
|
|
|
|
|
|
wasPlaying = false, prepared = false,
|
|
|
|
|
|
isAUv3 = false, isMidiEffectPlugin = false;
|
|
|
|
|
|
|
|
|
struct AUBuffer
|
|
|
struct AUBuffer
|
|
|
{
|
|
|
{
|
|
|
@@ -1521,7 +1495,7 @@ private: |
|
|
if (AudioUnitGetProperty (parent.audioUnit, kAudioUnitProperty_BypassEffect,
|
|
|
if (AudioUnitGetProperty (parent.audioUnit, kAudioUnitProperty_BypassEffect,
|
|
|
kAudioUnitScope_Global, 0, &value, &dataSize) == noErr
|
|
|
kAudioUnitScope_Global, 0, &value, &dataSize) == noErr
|
|
|
&& dataSize == sizeof (UInt32))
|
|
|
&& dataSize == sizeof (UInt32))
|
|
|
return (value != 0);
|
|
|
|
|
|
|
|
|
return value != 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
return false;
|
|
|
return false;
|
|
|
@@ -1599,7 +1573,7 @@ private: |
|
|
|
|
|
|
|
|
OwnedArray<AUBuffer> outputBufferList;
|
|
|
OwnedArray<AUBuffer> outputBufferList;
|
|
|
AudioTimeStamp timeStamp;
|
|
|
AudioTimeStamp timeStamp;
|
|
|
AudioBuffer<float>* currentBuffer;
|
|
|
|
|
|
|
|
|
AudioBuffer<float>* currentBuffer = nullptr;
|
|
|
Array<Array<AudioChannelSet>> supportedInLayouts, supportedOutLayouts;
|
|
|
Array<Array<AudioChannelSet>> supportedInLayouts, supportedOutLayouts;
|
|
|
|
|
|
|
|
|
int numChannelInfos;
|
|
|
int numChannelInfos;
|
|
|
@@ -1802,7 +1776,7 @@ private: |
|
|
{
|
|
|
{
|
|
|
if (pktlist != nullptr && pktlist->numPackets)
|
|
|
if (pktlist != nullptr && pktlist->numPackets)
|
|
|
{
|
|
|
{
|
|
|
const double time = Time::getMillisecondCounterHiRes() * 0.001;
|
|
|
|
|
|
|
|
|
auto time = Time::getMillisecondCounterHiRes() * 0.001;
|
|
|
const MIDIPacket* packet = &pktlist->packet[0];
|
|
|
const MIDIPacket* packet = &pktlist->packet[0];
|
|
|
|
|
|
|
|
|
for (UInt32 i = 0; i < pktlist->numPackets; ++i)
|
|
|
for (UInt32 i = 0; i < pktlist->numPackets; ++i)
|
|
|
@@ -1823,27 +1797,27 @@ private: |
|
|
|
|
|
|
|
|
OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const
|
|
|
OSStatus getBeatAndTempo (Float64* outCurrentBeat, Float64* outCurrentTempo) const
|
|
|
{
|
|
|
{
|
|
|
AudioPlayHead* const ph = getPlayHead();
|
|
|
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
|
|
|
|
|
|
|
|
|
if (ph != nullptr && ph->getCurrentPosition (result))
|
|
|
|
|
|
|
|
|
if (auto* ph = getPlayHead())
|
|
|
{
|
|
|
{
|
|
|
setIfNotNull (outCurrentBeat, result.ppqPosition);
|
|
|
|
|
|
setIfNotNull (outCurrentTempo, result.bpm);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
setIfNotNull (outCurrentBeat, 0);
|
|
|
|
|
|
setIfNotNull (outCurrentTempo, 120.0);
|
|
|
|
|
|
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
|
|
|
|
|
|
|
|
|
if (ph->getCurrentPosition (result))
|
|
|
|
|
|
{
|
|
|
|
|
|
setIfNotNull (outCurrentBeat, result.ppqPosition);
|
|
|
|
|
|
setIfNotNull (outCurrentTempo, result.bpm);
|
|
|
|
|
|
return noErr;
|
|
|
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
setIfNotNull (outCurrentBeat, 0);
|
|
|
|
|
|
setIfNotNull (outCurrentTempo, 120.0);
|
|
|
return noErr;
|
|
|
return noErr;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator,
|
|
|
OSStatus getMusicalTimeLocation (UInt32* outDeltaSampleOffsetToNextBeat, Float32* outTimeSig_Numerator,
|
|
|
UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const
|
|
|
UInt32* outTimeSig_Denominator, Float64* outCurrentMeasureDownBeat) const
|
|
|
{
|
|
|
{
|
|
|
if (AudioPlayHead* const ph = getPlayHead())
|
|
|
|
|
|
|
|
|
if (auto* ph = getPlayHead())
|
|
|
{
|
|
|
{
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
|
|
|
|
|
|
@@ -1868,7 +1842,7 @@ private: |
|
|
Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling,
|
|
|
Float64* outCurrentSampleInTimeLine, Boolean* outIsCycling,
|
|
|
Float64* outCycleStartBeat, Float64* outCycleEndBeat)
|
|
|
Float64* outCycleStartBeat, Float64* outCycleEndBeat)
|
|
|
{
|
|
|
{
|
|
|
if (AudioPlayHead* const ph = getPlayHead())
|
|
|
|
|
|
|
|
|
if (auto* ph = getPlayHead())
|
|
|
{
|
|
|
{
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
AudioPlayHead::CurrentPositionInfo result;
|
|
|
|
|
|
|
|
|
@@ -1905,7 +1879,7 @@ private: |
|
|
UInt32 inNumberFrames, AudioBufferList* ioData)
|
|
|
UInt32 inNumberFrames, AudioBufferList* ioData)
|
|
|
{
|
|
|
{
|
|
|
return static_cast<AudioUnitPluginInstance*> (hostRef)
|
|
|
return static_cast<AudioUnitPluginInstance*> (hostRef)
|
|
|
->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
|
|
|
|
|
|
|
|
|
->renderGetInput (ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, ioData);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/,
|
|
|
static OSStatus renderMidiOutputCallback (void* hostRef, const AudioTimeStamp*, UInt32 /*midiOutNum*/,
|
|
|
@@ -1948,13 +1922,14 @@ private: |
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|
UInt64 currentTime = mach_absolute_time();
|
|
|
UInt64 currentTime = mach_absolute_time();
|
|
|
static mach_timebase_info_data_t sTimebaseInfo = {0, 0};
|
|
|
|
|
|
|
|
|
static mach_timebase_info_data_t sTimebaseInfo = { 0, 0 };
|
|
|
|
|
|
|
|
|
if (sTimebaseInfo.denom == 0)
|
|
|
if (sTimebaseInfo.denom == 0)
|
|
|
mach_timebase_info (&sTimebaseInfo);
|
|
|
mach_timebase_info (&sTimebaseInfo);
|
|
|
|
|
|
|
|
|
double bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;
|
|
|
|
|
|
UInt64 bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom) / static_cast<double> (sTimebaseInfo.numer))));
|
|
|
|
|
|
|
|
|
auto bufferNanos = static_cast<double> (numSamples) * 1.0e9 / sampleRate;
|
|
|
|
|
|
auto bufferTicks = static_cast<UInt64> (std::ceil (bufferNanos * (static_cast<double> (sTimebaseInfo.denom)
|
|
|
|
|
|
/ static_cast<double> (sTimebaseInfo.numer))));
|
|
|
currentTime += bufferTicks;
|
|
|
currentTime += bufferTicks;
|
|
|
|
|
|
|
|
|
return currentTime;
|
|
|
return currentTime;
|
|
|
@@ -1964,10 +1939,9 @@ private: |
|
|
{
|
|
|
{
|
|
|
UInt32 countSize;
|
|
|
UInt32 countSize;
|
|
|
Boolean writable;
|
|
|
Boolean writable;
|
|
|
OSStatus err;
|
|
|
|
|
|
AudioUnitScope scope = (isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);
|
|
|
AudioUnitScope scope = (isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output);
|
|
|
|
|
|
|
|
|
err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetPropertyInfo (audioUnit, kAudioUnitProperty_ElementCount, scope, 0, &countSize, &writable);
|
|
|
|
|
|
|
|
|
return (err == noErr && writable != 0 && countSize == sizeof (UInt32));
|
|
|
return (err == noErr && writable != 0 && countSize == sizeof (UInt32));
|
|
|
}
|
|
|
}
|
|
|
@@ -1983,7 +1957,7 @@ private: |
|
|
UInt32 count;
|
|
|
UInt32 count;
|
|
|
UInt32 countSize = sizeof (count);
|
|
|
UInt32 countSize = sizeof (count);
|
|
|
|
|
|
|
|
|
OSStatus err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);
|
|
|
|
|
|
|
|
|
auto err = AudioUnitGetProperty (comp, kAudioUnitProperty_ElementCount, scope, 0, &count, &countSize);
|
|
|
jassert (err == noErr);
|
|
|
jassert (err == noErr);
|
|
|
ignoreUnused (err);
|
|
|
ignoreUnused (err);
|
|
|
|
|
|
|
|
|
@@ -2048,7 +2022,7 @@ private: |
|
|
{
|
|
|
{
|
|
|
const bool isInput = (dir == 0);
|
|
|
const bool isInput = (dir == 0);
|
|
|
const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;
|
|
|
const AudioUnitScope scope = isInput ? kAudioUnitScope_Input : kAudioUnitScope_Output;
|
|
|
const int n = getElementCount (scope);
|
|
|
|
|
|
|
|
|
auto n = getElementCount (scope);
|
|
|
|
|
|
|
|
|
for (int busIdx = 0; busIdx < n; ++busIdx)
|
|
|
for (int busIdx = 0; busIdx < n; ++busIdx)
|
|
|
{
|
|
|
{
|
|
|
@@ -2208,7 +2182,7 @@ class AudioUnitPluginWindowCocoa : public AudioProcessorEditor |
|
|
public:
|
|
|
public:
|
|
|
AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded)
|
|
|
AudioUnitPluginWindowCocoa (AudioUnitPluginInstance& p, bool createGenericViewIfNeeded)
|
|
|
: AudioProcessorEditor (&p),
|
|
|
: AudioProcessorEditor (&p),
|
|
|
plugin (p), waitingForViewCallback (false)
|
|
|
|
|
|
|
|
|
plugin (p)
|
|
|
{
|
|
|
{
|
|
|
addAndMakeVisible (wrapper);
|
|
|
addAndMakeVisible (wrapper);
|
|
|
|
|
|
|
|
|
@@ -2279,9 +2253,9 @@ private: |
|
|
ObjCBlock<ViewControllerCallbackBlock> viewControllerCallback;
|
|
|
ObjCBlock<ViewControllerCallbackBlock> viewControllerCallback;
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|
bool waitingForViewCallback;
|
|
|
|
|
|
|
|
|
bool waitingForViewCallback = false;
|
|
|
|
|
|
|
|
|
bool createView (const bool createGenericViewIfNeeded)
|
|
|
|
|
|
|
|
|
bool createView (bool createGenericViewIfNeeded)
|
|
|
{
|
|
|
{
|
|
|
JUCE_IOS_MAC_VIEW* pluginView = nil;
|
|
|
JUCE_IOS_MAC_VIEW* pluginView = nil;
|
|
|
UInt32 dataSize = 0;
|
|
|
UInt32 dataSize = 0;
|
|
|
@@ -2604,10 +2578,8 @@ void AudioUnitPluginFormat::findAllTypesForFile (OwnedArray<PluginDescription>& |
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,
|
|
|
void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc,
|
|
|
double rate,
|
|
|
|
|
|
int blockSize,
|
|
|
|
|
|
void* userData,
|
|
|
|
|
|
void (*callback) (void*, AudioPluginInstance*, const String&))
|
|
|
|
|
|
|
|
|
double rate, int blockSize,
|
|
|
|
|
|
void* userData, PluginCreationCallback callback)
|
|
|
{
|
|
|
{
|
|
|
using namespace AudioUnitFormatHelpers;
|
|
|
using namespace AudioUnitFormatHelpers;
|
|
|
|
|
|
|
|
|
@@ -2645,9 +2617,9 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc, |
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
|
|
|
AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer,
|
|
|
AUAsyncInitializationCallback (double inSampleRate, int inFramesPerBuffer,
|
|
|
void* inUserData, void (*inOriginalCallback) (void*, AudioPluginInstance*, const String&))
|
|
|
|
|
|
: sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),
|
|
|
|
|
|
passUserData (inUserData), originalCallback (inOriginalCallback)
|
|
|
|
|
|
|
|
|
void* inUserData, PluginCreationCallback inOriginalCallback)
|
|
|
|
|
|
: sampleRate (inSampleRate), framesPerBuffer (inFramesPerBuffer),
|
|
|
|
|
|
passUserData (inUserData), originalCallback (inOriginalCallback)
|
|
|
{
|
|
|
{
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion);
|
|
|
block = CreateObjCBlock (this, &AUAsyncInitializationCallback::completion);
|
|
|
@@ -2682,15 +2654,14 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc, |
|
|
double sampleRate;
|
|
|
double sampleRate;
|
|
|
int framesPerBuffer;
|
|
|
int framesPerBuffer;
|
|
|
void* passUserData;
|
|
|
void* passUserData;
|
|
|
void (*originalCallback) (void*, AudioPluginInstance*, const String&);
|
|
|
|
|
|
|
|
|
PluginCreationCallback originalCallback;
|
|
|
|
|
|
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
ObjCBlock<AUCompletionCallbackBlock> block;
|
|
|
ObjCBlock<AUCompletionCallbackBlock> block;
|
|
|
#endif
|
|
|
#endif
|
|
|
};
|
|
|
};
|
|
|
|
|
|
|
|
|
AUAsyncInitializationCallback* callbackBlock
|
|
|
|
|
|
= new AUAsyncInitializationCallback (rate, blockSize, userData, callback);
|
|
|
|
|
|
|
|
|
auto callbackBlock = new AUAsyncInitializationCallback (rate, blockSize, userData, callback);
|
|
|
|
|
|
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
#if JUCE_SUPPORTS_AUv3
|
|
|
//==============================================================================
|
|
|
//==============================================================================
|
|
|
@@ -2706,7 +2677,7 @@ void AudioUnitPluginFormat::createPluginInstance (const PluginDescription& desc, |
|
|
#endif // JUCE_SUPPORTS_AUv3
|
|
|
#endif // JUCE_SUPPORTS_AUv3
|
|
|
|
|
|
|
|
|
AudioComponentInstance audioUnit;
|
|
|
AudioComponentInstance audioUnit;
|
|
|
OSStatus err = AudioComponentInstanceNew(auComponent, &audioUnit);
|
|
|
|
|
|
|
|
|
auto err = AudioComponentInstanceNew(auComponent, &audioUnit);
|
|
|
callbackBlock->completion (err != noErr ? nullptr : audioUnit, err);
|
|
|
callbackBlock->completion (err != noErr ? nullptr : audioUnit, err);
|
|
|
}
|
|
|
}
|
|
|
else
|
|
|
else
|
|
|
@@ -2780,12 +2751,12 @@ StringArray AudioUnitPluginFormat::searchPathsForPlugins (const FileSearchPath&, |
|
|
bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)
|
|
|
bool AudioUnitPluginFormat::fileMightContainThisPluginType (const String& fileOrIdentifier)
|
|
|
{
|
|
|
{
|
|
|
AudioComponentDescription desc;
|
|
|
AudioComponentDescription desc;
|
|
|
|
|
|
|
|
|
String name, version, manufacturer;
|
|
|
String name, version, manufacturer;
|
|
|
|
|
|
|
|
|
if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer))
|
|
|
if (AudioUnitFormatHelpers::getComponentDescFromIdentifier (fileOrIdentifier, desc, name, version, manufacturer))
|
|
|
return AudioComponentFindNext (nullptr, &desc) != nullptr;
|
|
|
return AudioComponentFindNext (nullptr, &desc) != nullptr;
|
|
|
|
|
|
|
|
|
const File f (File::createFileWithoutCheckingPath (fileOrIdentifier));
|
|
|
|
|
|
|
|
|
auto f = File::createFileWithoutCheckingPath (fileOrIdentifier);
|
|
|
|
|
|
|
|
|
return (f.hasFileExtension (".component") || f.hasFileExtension (".appex"))
|
|
|
return (f.hasFileExtension (".component") || f.hasFileExtension (".appex"))
|
|
|
&& f.isDirectory();
|
|
|
&& f.isDirectory();
|
|
|
|