diff --git a/vst/SfizzVstProcessor.cpp b/vst/SfizzVstProcessor.cpp index 97795c41..daf141d1 100644 --- a/vst/SfizzVstProcessor.cpp +++ b/vst/SfizzVstProcessor.cpp @@ -117,6 +117,16 @@ tresult PLUGIN_API SfizzVstProcessor::setActive(TBool state) synth->setSampleRate(processSetup.sampleRate); synth->setSamplesPerBlock(processSetup.maxSamplesPerBlock); + _fileChangePeriod = static_cast(processSetup.sampleRate); + + if (!_msgCheckShouldReload) { + auto msg = IPtr::adopt(allocateMessage()); + if (!msg) + return kResultFalse; + msg->setMessageID("CheckShouldReload"); + _msgCheckShouldReload = msg; + } + _workRunning = true; _worker = std::thread([this]() { doBackgroundWork(); }); } else { @@ -169,6 +179,17 @@ tresult PLUGIN_API SfizzVstProcessor::process(Vst::ProcessData& data) synth.setVolume(_state.volume); synth.renderBlock(outputs, numFrames, numChannels); + + _fileChangeCounter += numFrames; + if (_fileChangeCounter > _fileChangePeriod) { + _fileChangeCounter %= _fileChangePeriod; + Vst::IMessage* msg = _msgCheckShouldReload.get(); + if (_fifoToWorker.push(msg)) { + msg->addRef(); + _semaToWorker.post(); + } + } + return kResultTrue; } @@ -380,6 +401,13 @@ void SfizzVstProcessor::doBackgroundWork() _synth->setPreloadSize(value); } } + else if (!std::strcmp(id, "CheckShouldReload")) { + if (_synth->shouldReloadFile()) { + fprintf(stderr, "[Sfizz] file has changed, reloading\n"); + std::lock_guard lock(_processMutex); + _synth->loadSfzFile(_state.sfzFile); + } + } msg->release(); } diff --git a/vst/SfizzVstProcessor.h b/vst/SfizzVstProcessor.h index 86811e75..a8ed43e1 100644 --- a/vst/SfizzVstProcessor.h +++ b/vst/SfizzVstProcessor.h @@ -55,6 +55,11 @@ private: RTSemaphore _semaToWorker; std::mutex _processMutex; + // file modification periodic checker + uint32 _fileChangeCounter = 0; + uint32 _fileChangePeriod = 0; + IPtr _msgCheckShouldReload; + // worker void doBackgroundWork(); void stopBackgroundWork();