Browse Source

AU: Reset plug-in host callbacks in prepareToPlay() in case they were removed when uninitialising or resetting the audio unit

v6.1.6
ed 3 years ago
parent
commit
ada1b2d693
1 changed files with 58 additions and 43 deletions
  1. +58
    -43
      modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm

+ 58
- 43
modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm View File

@@ -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;


Loading…
Cancel
Save