diff --git a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm index a94e782853..1a6fdd9f6c 100644 --- a/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm +++ b/modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.mm @@ -340,50 +340,55 @@ public: jassert (AudioUnitFormatHelpers::insideCallback.get() == 0); #endif - #if JUCE_MAC - if (eventListenerRef != 0) - { - AUListenerDispose (eventListenerRef); - eventListenerRef = 0; - } - #endif - if (audioUnit != nullptr) { - if (prepared) - releaseResources(); - struct AUDeleter : public CallbackMessage { - AUDeleter (AudioComponentInstance& inInstance, WaitableEvent& inEvent) + AUDeleter (AudioUnitPluginInstance& inInstance, WaitableEvent& inEvent) : auInstance (inInstance), completionSignal (inEvent) {} void messageCallback() override { - AudioComponentInstanceDispose (auInstance); - auInstance = nullptr; + auInstance.cleanup(); completionSignal.signal(); } - AudioComponentInstance& auInstance; + AudioUnitPluginInstance& auInstance; WaitableEvent& completionSignal; }; if (MessageManager::getInstance()->isThisTheMessageThread()) { - AudioComponentInstanceDispose (audioUnit); - audioUnit = nullptr; + cleanup(); } else { WaitableEvent completionEvent; - (new AUDeleter (audioUnit, completionEvent))->post(); + (new AUDeleter (*this, completionEvent))->post(); completionEvent.wait(); } } } + // called from the destructer above + void cleanup() + { + #if JUCE_MAC + if (eventListenerRef != 0) + { + AUListenerDispose (eventListenerRef); + eventListenerRef = 0; + } + #endif + + if (prepared) + releaseResources(); + + AudioComponentInstanceDispose (audioUnit); + audioUnit = nullptr; + } + bool initialise (double rate, int blockSize) { updateNumChannels();