diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index ec405b6722..ec0029ec09 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -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); - - for (auto* param : getParameters()) - { - if (auto* auParam = dynamic_cast (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; - - 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); - #endif + AudioUnitSetProperty (audioUnit, kAudioUnitProperty_HostCallbacks, + kAudioUnitScope_Global, 0, &info, sizeof (info)); } } #if JUCE_MAC + void disposeEventListener() + { + if (eventListenerRef != nullptr) + { + AUListenerDispose (eventListenerRef); + eventListenerRef = nullptr; + } + } + + void createEventListener() + { + if (audioUnit == nullptr) + return; + + disposeEventListener(); + + AUEventListenerCreate (eventListenerCallback, this, CFRunLoopGetMain(), + kCFRunLoopDefaultMode, 0, 0, &eventListenerRef); + + for (auto* param : getParameters()) + { + jassert (dynamic_cast (param) != nullptr); + + AudioUnitEvent event; + event.mArgument.mParameter.mAudioUnit = audioUnit; + event.mArgument.mParameter.mParameterID = static_cast (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); + } + void addPropertyChangeListener (AudioUnitPropertyID type) const { AudioUnitEvent event;