From 55a917ebe5abfef8e54b3cac2d81a262a51812ff Mon Sep 17 00:00:00 2001 From: hogliux Date: Mon, 23 Oct 2017 12:31:02 +0100 Subject: [PATCH] AU/AUv3: Ensured that prepareToPlay is called when an AU host enables/disables non-realtime mode --- .../AU/juce_AU_Wrapper.mm | 16 +++++++++++++++- .../AU/juce_AUv3_Wrapper.mm | 14 +++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm index 6bd763ffcf..69d7e4b305 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AU_Wrapper.mm @@ -610,10 +610,24 @@ public: } case kAudioUnitProperty_OfflineRender: + { + auto shouldBeRealtime = (*reinterpret_cast (inData) != 0); + if (juceFilter != nullptr) - juceFilter->setNonRealtime ((*(UInt32*) inData) != 0); + { + auto isCurrentlyRealtime = juceFilter->isNonRealtime(); + + if (isCurrentlyRealtime != shouldBeRealtime) + { + const ScopedLock sl (juceFilter->getCallbackLock()); + + juceFilter->setNonRealtime (shouldBeRealtime); + juceFilter->prepareToPlay (getSampleRate(), (int) GetMaxFramesPerSlice()); + } + } return noErr; + } default: break; } diff --git a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm index 5206585030..0d4afcff48 100644 --- a/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm +++ b/modules/juce_audio_plugin_client/AU/juce_AUv3_Wrapper.mm @@ -692,7 +692,19 @@ public: //============================================================================== AUInternalRenderBlock getInternalRenderBlock() override { return internalRenderBlock; } bool getRenderingOffline() override { return getAudioProcessor().isNonRealtime(); } - void setRenderingOffline (bool offline) override { getAudioProcessor().setNonRealtime (offline); } + void setRenderingOffline (bool offline) override + { + auto& processor = getAudioProcessor(); + auto isCurrentlyNonRealtime = processor.isNonRealtime(); + + if (isCurrentlyNonRealtime != offline) + { + ScopedLock callbackLock (processor.getCallbackLock()); + + processor.setNonRealtime (offline); + processor.prepareToPlay (processor.getSampleRate(), processor.getBlockSize()); + } + } //============================================================================== NSString* getContextName() const override { return juceStringToNS (contextName); }