From e0a7fb1dbc7d4d07dce947a43686901dcfa1798a Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Mon, 1 Feb 2021 22:51:24 +0100 Subject: [PATCH] Thread-safety at VST level --- vst/CMakeLists.txt | 3 ++- vst/SfizzVstProcessor.cpp | 15 ++++++++++----- vst/SfizzVstProcessor.h | 4 ++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/vst/CMakeLists.txt b/vst/CMakeLists.txt index 02afabef..a2c07724 100644 --- a/vst/CMakeLists.txt +++ b/vst/CMakeLists.txt @@ -58,8 +58,9 @@ if(WIN32) target_sources(${VSTPLUGIN_PRJ_NAME} PRIVATE vst3.def) endif() target_link_libraries(${VSTPLUGIN_PRJ_NAME} - PRIVATE ${PROJECT_NAME}::${PROJECT_NAME} + PRIVATE sfizz::sfizz PRIVATE sfizz::editor + PRIVATE sfizz::spin_mutex PRIVATE sfizz::pugixml sfizz::filesystem) target_include_directories(${VSTPLUGIN_PRJ_NAME} PRIVATE "${CMAKE_CURRENT_BINARY_DIR}") diff --git a/vst/SfizzVstProcessor.cpp b/vst/SfizzVstProcessor.cpp index c77365da..6a22e52f 100644 --- a/vst/SfizzVstProcessor.cpp +++ b/vst/SfizzVstProcessor.cpp @@ -138,7 +138,7 @@ tresult PLUGIN_API SfizzVstProcessor::setState(IBStream* stream) } // - std::lock_guard lock(_processMutex); + std::lock_guard lock(_processMutex); _state = s; syncStateToSynth(); @@ -148,7 +148,7 @@ tresult PLUGIN_API SfizzVstProcessor::setState(IBStream* stream) tresult PLUGIN_API SfizzVstProcessor::getState(IBStream* stream) { - std::lock_guard lock(_processMutex); + std::lock_guard lock(_processMutex); return _state.store(stream); } @@ -224,7 +224,7 @@ tresult PLUGIN_API SfizzVstProcessor::process(Vst::ProcessData& data) for (unsigned c = 0; c < numChannels; ++c) outputs[c] = data.outputs[0].channelBuffers32[c]; - std::unique_lock lock(_processMutex, std::try_to_lock); + std::unique_lock lock(_processMutex, std::try_to_lock); if (!lock.owns_lock()) { for (unsigned c = 0; c < numChannels; ++c) @@ -515,7 +515,7 @@ tresult PLUGIN_API SfizzVstProcessor::notify(Vst::IMessage* message) if (result != kResultTrue) return result; - std::unique_lock lock(_processMutex); + std::unique_lock lock(_processMutex); _state.sfzFile.assign(static_cast(data), size); loadSfzFileOrDefault(*_synth, _state.sfzFile); lock.unlock(); @@ -533,7 +533,7 @@ tresult PLUGIN_API SfizzVstProcessor::notify(Vst::IMessage* message) if (result != kResultTrue) return result; - std::unique_lock lock(_processMutex); + std::unique_lock lock(_processMutex); _state.scalaFile.assign(static_cast(data), size); _synth->loadScalaFile(_state.scalaFile); lock.unlock(); @@ -601,23 +601,28 @@ void SfizzVstProcessor::doBackgroundWork() if (!std::strcmp(id, "SetNumVoices")) { int32 value = *msg->payload(); + std::lock_guard lock(_processMutex); _synth->setNumVoices(value); } else if (!std::strcmp(id, "SetOversampling")) { int32 value = *msg->payload(); + std::lock_guard lock(_processMutex); _synth->setOversamplingFactor(1 << value); } else if (!std::strcmp(id, "SetPreloadSize")) { int32 value = *msg->payload(); + std::lock_guard lock(_processMutex); _synth->setPreloadSize(value); } else if (!std::strcmp(id, "CheckShouldReload")) { if (_synth->shouldReloadFile()) { fprintf(stderr, "[Sfizz] sfz file has changed, reloading\n"); + std::lock_guard lock(_processMutex); loadSfzFileOrDefault(*_synth, _state.sfzFile); } else if (_synth->shouldReloadScala()) { fprintf(stderr, "[Sfizz] scala file has changed, reloading\n"); + std::lock_guard lock(_processMutex); _synth->loadScalaFile(_state.scalaFile); } } diff --git a/vst/SfizzVstProcessor.h b/vst/SfizzVstProcessor.h index bbbf7490..e8408169 100644 --- a/vst/SfizzVstProcessor.h +++ b/vst/SfizzVstProcessor.h @@ -10,8 +10,8 @@ #include "ring_buffer/ring_buffer.h" #include "public.sdk/source/vst/vstaudioeffect.h" #include +#include #include -#include #include #include @@ -65,7 +65,7 @@ private: Ring_Buffer _fifoToWorker; RTSemaphore _semaToWorker; Ring_Buffer _fifoMessageFromUi; - std::mutex _processMutex; + SpinMutex _processMutex; // file modification periodic checker uint32 _fileChangeCounter = 0;