diff --git a/src/framework/vst/internal/vstaudioclient.cpp b/src/framework/vst/internal/vstaudioclient.cpp index 46c140cb7559..5f2f2c55a893 100644 --- a/src/framework/vst/internal/vstaudioclient.cpp +++ b/src/framework/vst/internal/vstaudioclient.cpp @@ -437,11 +437,13 @@ void VstAudioClient::updateProcessSetup() setup.sampleRate = m_outputSpec.sampleRate; if (processor->setupProcessing(setup) != Steinberg::kResultOk) { + m_isProcessingSetUp = false; return; } setUpProcessData(); flushBuffers(); + m_isProcessingSetUp = true; ensureActivity(); } @@ -551,6 +553,13 @@ void VstAudioClient::ensureActivity() return; } + //! NOTE: The plugin may finish loading after the track has already been + //! switched on (e.g. right before an export). Activating it before + //! setupProcessing() would let process() run without output buffers + if (!m_isProcessingSetUp) { + return; + } + IAudioProcessorPtr processor = pluginProcessor(); if (!processor) { return; diff --git a/src/framework/vst/internal/vstaudioclient.h b/src/framework/vst/internal/vstaudioclient.h index fddeba821c68..925d3a8e10f9 100644 --- a/src/framework/vst/internal/vstaudioclient.h +++ b/src/framework/vst/internal/vstaudioclient.h @@ -101,6 +101,7 @@ class VstAudioClient : public muse::Contextable bool m_needUnprepareProcessData = false; bool m_needUpdateState = false; + bool m_isProcessingSetUp = false; audioplugins::AudioPluginType m_type = audioplugins::AudioPluginType::Undefined; audio::OutputSpec m_outputSpec;