|
|
@@ -598,11 +598,7 @@ public: |
|
|
|
void cleanup()
|
|
|
|
{
|
|
|
|
#if JUCE_MAC
|
|
|
|
if (eventListenerRef != nullptr)
|
|
|
|
{
|
|
|
|
AUListenerDispose (eventListenerRef);
|
|
|
|
eventListenerRef = nullptr;
|
|
|
|
}
|
|
|
|
disposeEventListener();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (prepared)
|
|
|
@@ -618,7 +614,11 @@ public: |
|
|
|
setRateAndBufferSizeDetails (rate, blockSize);
|
|
|
|
setLatencySamples (0);
|
|
|
|
refreshParameterList();
|
|
|
|
createPluginCallbacks();
|
|
|
|
setPluginCallbacks();
|
|
|
|
|
|
|
|
#if JUCE_MAC
|
|
|
|
createEventListener();
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
@@ -1001,6 +1001,8 @@ public: |
|
|
|
if (! haveParameterList)
|
|
|
|
refreshParameterList();
|
|
|
|
|
|
|
|
setPluginCallbacks();
|
|
|
|
|
|
|
|
if (! syncBusLayouts (getBusesLayout(), true, ignore))
|
|
|
|
{
|
|
|
|
prepared = false;
|
|
|
@@ -1666,7 +1668,7 @@ private: |
|
|
|
bool lastProcessBlockCallWasBypass = false, auSupportsBypass = false;
|
|
|
|
bool haveParameterList = false;
|
|
|
|
|
|
|
|
void createPluginCallbacks()
|
|
|
|
void setPluginCallbacks()
|
|
|
|
{
|
|
|
|
if (audioUnit != nullptr)
|
|
|
|
{
|
|
|
@@ -1684,52 +1686,65 @@ private: |
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
{
|
|
|
|
HostCallbackInfo info;
|
|
|
|
zerostruct (info);
|
|
|
|
HostCallbackInfo info;
|
|
|
|
zerostruct (info);
|
|
|
|
|
|
|
|
info.hostUserData = this;
|
|
|
|
info.beatAndTempoProc = getBeatAndTempoCallback;
|
|
|
|
info.musicalTimeLocationProc = getMusicalTimeLocationCallback;
|
|
|
|
info.transportStateProc = getTransportStateCallback;
|
|
|
|
info.hostUserData = this;
|
|
|
|
info.beatAndTempoProc = getBeatAndTempoCallback;
|
|
|
|
info.musicalTimeLocationProc = getMusicalTimeLocationCallback;
|
|
|
|
info.transportStateProc = getTransportStateCallback;
|
|
|
|
|
|
|
|
AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks,
|
|
|
|
kAudioUnitScope_Global, 0, &info, sizeof (info));
|
|
|
|
}
|
|
|
|
#if JUCE_MAC
|
|
|
|
AUEventListenerCreate (eventListenerCallback, this, CFRunLoopGetMain(),
|
|
|
|
kCFRunLoopDefaultMode, 0, 0, &eventListenerRef);
|
|
|
|
AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks,
|
|
|
|
kAudioUnitScope_Global, 0, &info, sizeof (info));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (auto* param : getParameters())
|
|
|
|
{
|
|
|
|
if (auto* auParam = dynamic_cast<AUInstanceParameter*> (param))
|
|
|
|
{
|
|
|
|
AudioUnitEvent event;
|
|
|
|
event.mArgument.mParameter.mAudioUnit = audioUnit;
|
|
|
|
event.mArgument.mParameter.mParameterID = auParam->paramID;
|
|
|
|
event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
|
|
|
|
event.mArgument.mParameter.mElement = 0;
|
|
|
|
#if JUCE_MAC
|
|
|
|
void disposeEventListener()
|
|
|
|
{
|
|
|
|
if (eventListenerRef != nullptr)
|
|
|
|
{
|
|
|
|
AUListenerDispose (eventListenerRef);
|
|
|
|
eventListenerRef = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_ParameterValueChange;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
void createEventListener()
|
|
|
|
{
|
|
|
|
if (audioUnit == nullptr)
|
|
|
|
return;
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
disposeEventListener();
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_EndParameterChangeGesture;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
AUEventListenerCreate (eventListenerCallback, this, CFRunLoopGetMain(),
|
|
|
|
kCFRunLoopDefaultMode, 0, 0, &eventListenerRef);
|
|
|
|
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_PresentPreset);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_ParameterList);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_Latency);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_BypassEffect);
|
|
|
|
#endif
|
|
|
|
for (auto* param : getParameters())
|
|
|
|
{
|
|
|
|
jassert (dynamic_cast<AUInstanceParameter*> (param) != nullptr);
|
|
|
|
|
|
|
|
AudioUnitEvent event;
|
|
|
|
event.mArgument.mParameter.mAudioUnit = audioUnit;
|
|
|
|
event.mArgument.mParameter.mParameterID = static_cast<AUInstanceParameter*> (param)->paramID;
|
|
|
|
event.mArgument.mParameter.mScope = kAudioUnitScope_Global;
|
|
|
|
event.mArgument.mParameter.mElement = 0;
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_ParameterValueChange;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_BeginParameterChangeGesture;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
|
|
|
|
event.mEventType = kAudioUnitEvent_EndParameterChangeGesture;
|
|
|
|
AUEventListenerAddEventType (eventListenerRef, nullptr, &event);
|
|
|
|
}
|
|
|
|
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_PresentPreset);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_ParameterList);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_Latency);
|
|
|
|
addPropertyChangeListener (kAudioUnitProperty_BypassEffect);
|
|
|
|
}
|
|
|
|
|
|
|
|
#if JUCE_MAC
|
|
|
|
void addPropertyChangeListener (AudioUnitPropertyID type) const
|
|
|
|
{
|
|
|
|
AudioUnitEvent event;
|
|
|
|