diff --git a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp index 5c505e1f44..736ed5f22d 100644 --- a/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp +++ b/modules/juce_audio_processors/utilities/ARA/juce_ARADocumentController.cpp @@ -26,8 +26,31 @@ namespace juce { -class ARADocumentControllerSpecialisation::ARADocumentControllerImpl : public ARADocumentController, - private juce::Timer +class SimpleTimer final : private Timer +{ +public: + SimpleTimer (int frequencyHz, std::function callbackIn) + : callback (std::move (callbackIn)) + { + jassert (callback); + startTimerHz (frequencyHz); + } + + ~SimpleTimer() override + { + stopTimer(); + } + +private: + void timerCallback() override + { + callback(); + } + + std::function callback; +}; + +class ARADocumentControllerSpecialisation::ARADocumentControllerImpl : public ARADocumentController { public: ARADocumentControllerImpl (const ARA::PlugIn::PlugInEntry* entry, @@ -204,10 +227,6 @@ protected: void didUpdatePlaybackRegionProperties (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; void willDestroyPlaybackRegion (ARA::PlugIn::PlaybackRegion* playbackRegion) noexcept override; - //============================================================================== - // juce::Timer overrides - void timerCallback() override; - public: //============================================================================== /** @internal */ @@ -248,6 +267,9 @@ private: std::atomic internalAnalysisProgressIsSynced { true }; ScopedJuceInitialiser_GUI libraryInitialiser; int activeAudioSourcesCount = 0; + std::optional analysisTimer; + + void analysisTimerCallback(); //============================================================================== template @@ -363,10 +385,10 @@ void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::didEndEditi { notifyListeners (&ARADocument::Listener::didEndEditing, static_cast (getDocument())); - if (isTimerRunning() && (activeAudioSourcesCount == 0)) - stopTimer(); - else if (! isTimerRunning() && (activeAudioSourcesCount > 0)) - startTimerHz (20); + if (activeAudioSourcesCount == 0) + analysisTimer.reset(); + else if (! analysisTimer.has_value() && (activeAudioSourcesCount > 0)) + analysisTimer.emplace (20, [this] { analysisTimerCallback(); }); } void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::willNotifyModelUpdates() noexcept @@ -760,7 +782,7 @@ namespace ModelUpdateControllerProgressAdapter } } -void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::timerCallback() +void ARADocumentControllerSpecialisation::ARADocumentControllerImpl::analysisTimerCallback() { if (! internalAnalysisProgressIsSynced.exchange (true, std::memory_order_release)) for (auto& audioSource : getDocument()->getAudioSources())