From a2aac07c9edaa96940ac4d1dd02a9bec21499e47 Mon Sep 17 00:00:00 2001 From: Bent Bisballe Nyeng Date: Wed, 5 Mar 2025 18:18:49 +0100 Subject: Block loading while free-wheeling. Fix rendering in Reaper. --- src/audiofile.cc | 6 +++--- src/audiofile.h | 3 ++- src/drumgizmo.cc | 7 +++++++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/audiofile.cc b/src/audiofile.cc index 6fcdcb5..1228044 100644 --- a/src/audiofile.cc +++ b/src/audiofile.cc @@ -64,7 +64,7 @@ void AudioFile::unload() // Make sure we don't unload the object while loading it... const std::lock_guard guard(mutex); - is_loaded = false; + is_loaded.store(false); preloadedsize = 0; size = 0; @@ -168,12 +168,12 @@ void AudioFile::load(const LogFunction& logger, std::size_t sample_limit) this->data = data; this->size = size; this->preloadedsize = preloadedsize; - is_loaded = true; + is_loaded.store(true); } bool AudioFile::isLoaded() const { - return is_loaded; + return is_loaded.load(); } main_state_t AudioFile::mainState() const diff --git a/src/audiofile.h b/src/audiofile.h index 9fdd8c5..cff4f3b 100644 --- a/src/audiofile.h +++ b/src/audiofile.h @@ -31,6 +31,7 @@ #include #include #include +#include #include "audio.h" #include "channel.h" @@ -73,6 +74,6 @@ private: friend class InstrumentParserTest; void* magic{}; - volatile bool is_loaded{false}; + std::atomic is_loaded{false}; InstrumentChannel* instrument_channel{}; }; diff --git a/src/drumgizmo.cc b/src/drumgizmo.cc index 85624ca..093b0bf 100644 --- a/src/drumgizmo.cc +++ b/src/drumgizmo.cc @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include "audiotypes.h" #include @@ -361,6 +363,11 @@ void DrumGizmo::getSamples(int ch, int pos, sample_t* s, size_t sz) AudioFile& af = *sample_event.file; + while(freewheel && !af.isLoaded()) + { + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + if(!af.isLoaded() || !af.isValid() || (s == nullptr)) { // This event cannot be played - schedule for deletion and continue. -- cgit v1.2.3