From e7004e634c9ec6a75a89c8b3385113e2c01cdb03 Mon Sep 17 00:00:00 2001 From: reuk Date: Fri, 12 Jun 2020 13:12:19 +0100 Subject: [PATCH] APVTS: Make adding/removing listeners threadsafe --- .../juce_AudioProcessorValueTreeState.cpp | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp index 54f1569e5c..2ce4f604cf 100644 --- a/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp +++ b/modules/juce_audio_processors/utilities/juce_AudioProcessorValueTreeState.cpp @@ -186,8 +186,35 @@ private: parameter.setValueNotifyingHost (value); } + class LockedListeners + { + public: + template + void call (Fn&& fn) + { + const CriticalSection::ScopedLockType lock (mutex); + listeners.call (std::forward (fn)); + } + + void add (Listener* l) + { + const CriticalSection::ScopedLockType lock (mutex); + listeners.add (l); + } + + void remove (Listener* l) + { + const CriticalSection::ScopedLockType lock (mutex); + listeners.remove (l); + } + + private: + CriticalSection mutex; + ListenerList listeners; + }; + RangedAudioParameter& parameter; - ListenerList listeners; + LockedListeners listeners; std::atomic unnormalisedValue { 0.0f }; std::atomic needsUpdate { true }, listenersNeedCalling { true }; bool ignoreParameterChangedCallbacks { false };