diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 44c25e29d2..d3d4bbe3a7 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -2338,23 +2338,37 @@ public: JUCE_DECLARE_VST3_COM_REF_METHODS JUCE_DECLARE_VST3_COM_QUERY_METHODS - Steinberg::int32 PLUGIN_API getParameterCount() override { return numQueuesUsed; } - Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override { return isPositiveAndBelow (static_cast (index), numQueuesUsed.load()) ? queues[(int) index] : nullptr; } + Steinberg::int32 PLUGIN_API getParameterCount() override + { + const ScopedLock sl (queuesLock); + return numQueuesUsed; + } + + Vst::IParamValueQueue* PLUGIN_API getParameterData (Steinberg::int32 index) override + { + const ScopedLock sl (queuesLock); + return isPositiveAndBelow (static_cast (index), numQueuesUsed) ? queues[(int) index] : nullptr; + } Vst::IParamValueQueue* PLUGIN_API addParameterData (const Vst::ParamID& id, Steinberg::int32& index) override { - for (int i = numQueuesUsed.load(); --i >= 0;) + const ScopedLock sl (queuesLock); + + for (int i = numQueuesUsed; --i >= 0;) { - if (queues.getUnchecked (i)->getParameterId() == id) + if (auto* q = queues.getUnchecked (i)) { - index = (Steinberg::int32) i; - return queues.getUnchecked (i); + if (q->getParameterId() == id) + { + index = (Steinberg::int32) i; + return q; + } } } index = numQueuesUsed++; - ParamValueQueue* valueQueue = (index < queues.size() ? queues[index] - : queues.add (new ParamValueQueue())); + auto* valueQueue = (index < queues.size() ? queues[index] + : queues.add (new ParamValueQueue())); valueQueue->clear(); valueQueue->setParamID (id); @@ -2364,6 +2378,7 @@ public: void clearAllQueues() noexcept { + const ScopedLock sl (queuesLock); numQueuesUsed = 0; } @@ -2388,6 +2403,8 @@ public: Steinberg::int32& sampleOffset, Steinberg::Vst::ParamValue& value) override { + const ScopedLock sl (points.getLock()); + if (isPositiveAndBelow ((int) index, points.size())) { auto e = points.getUnchecked ((int) index); @@ -2429,8 +2446,10 @@ public: }; Atomic refCount; - OwnedArray queues; - std::atomic numQueuesUsed { 0 }; + + OwnedArray queues; + int numQueuesUsed = 0; + CriticalSection queuesLock; JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ParamValueQueueList) };