From 2a5b9d973a90e09da1a8c011deba087199227ed5 Mon Sep 17 00:00:00 2001 From: Roland Rabien Date: Sat, 2 Sep 2023 04:26:17 -0700 Subject: [PATCH] Fixed crash loading wavetable when changing preset --- Changelist.txt | 1 + plugin/Source/PluginProcessor.cpp | 80 ++++++++++++++++++------------- plugin/Source/PluginProcessor.h | 3 ++ 3 files changed, 51 insertions(+), 33 deletions(-) diff --git a/Changelist.txt b/Changelist.txt index cba363c..ba8cbcc 100644 --- a/Changelist.txt +++ b/Changelist.txt @@ -3,6 +3,7 @@ - Fixed pan when unison enabled - Fixed preset overwrite dialog not showing - Added resizable UI +- Fixed crash loading wavetable when changing preset 0.0.2: diff --git a/plugin/Source/PluginProcessor.cpp b/plugin/Source/PluginProcessor.cpp index 2ee8d94..8bd7fc8 100644 --- a/plugin/Source/PluginProcessor.cpp +++ b/plugin/Source/PluginProcessor.cpp @@ -351,39 +351,6 @@ void WavetableAudioProcessor::ReverbParams::setup (WavetableAudioProcessor& p) mix = p.addExtParam ("rvbMix", "Mix", "", "", {0.0f, 1.0f, 0.0f, 1.0f}, 0.0f, 0.0f); } -static bool loadWaveTable (juce::OwnedArray& table, double sr, const juce::MemoryBlock& wav, const juce::String& format) -{ - auto is = new juce::MemoryInputStream (wav, false); - - if (format == "wav") - { - if (auto reader = std::unique_ptr (juce::WavAudioFormat().createReaderFor (is, true))) - { - if (auto sz = gin::getWavetableSize (wav); sz > 0) - { - juce::AudioSampleBuffer buf (1, int (reader->lengthInSamples)); - reader->read (&buf, 0, int (reader->lengthInSamples), 0, true, false); - - loadWavetables (table, sr, buf, reader->sampleRate, sz); - return true; - } - } - } - else if (format == "flac") - { - if (auto reader = std::unique_ptr (juce::FlacAudioFormat().createReaderFor (is, true))) - { - juce::AudioSampleBuffer buf (1, int (reader->lengthInSamples)); - reader->read (&buf, 0, int (reader->lengthInSamples), 0, true, false); - - loadWavetables (table, sr, buf, reader->sampleRate, 2048); - return true; - } - } - - return false; -} - void convertWavetables() { auto src = juce::File (__FILE__).getChildFile ("../../Resources/Wavetables"); @@ -688,6 +655,8 @@ void WavetableAudioProcessor::releaseResources() void WavetableAudioProcessor::processBlock (juce::AudioBuffer& buffer, juce::MidiBuffer& midi) { juce::ScopedNoDenormals noDenormals; + if (! dspLock.tryEnter()) + return; startBlock(); setMPE (globalParams.mpe->isOn()); @@ -729,6 +698,8 @@ void WavetableAudioProcessor::processBlock (juce::AudioBuffer& buffer, ju scopeFifo.write (buffer); endBlock (buffer.getNumSamples()); + + dspLock.exit(); } juce::Array WavetableAudioProcessor::getLiveFilterCutoff() @@ -911,6 +882,49 @@ void WavetableAudioProcessor::updateParams (int newBlockSize) outputGain.setGain (modMatrix.getValue (globalParams.level)); } +bool WavetableAudioProcessor::loadWaveTable (juce::OwnedArray& table, double sr, const juce::MemoryBlock& wav, const juce::String& format) +{ + auto is = new juce::MemoryInputStream (wav, false); + + if (format == "wav") + { + if (auto reader = std::unique_ptr (juce::WavAudioFormat().createReaderFor (is, true))) + { + if (auto sz = gin::getWavetableSize (wav); sz > 0) + { + juce::AudioSampleBuffer buf (1, int (reader->lengthInSamples)); + reader->read (&buf, 0, int (reader->lengthInSamples), 0, true, false); + + juce::OwnedArray t; + loadWavetables (t, sr, buf, reader->sampleRate, sz); + + juce::ScopedLock sl (dspLock); + std::swap (t, table); + + return true; + } + } + } + else if (format == "flac") + { + if (auto reader = std::unique_ptr (juce::FlacAudioFormat().createReaderFor (is, true))) + { + juce::AudioSampleBuffer buf (1, int (reader->lengthInSamples)); + reader->read (&buf, 0, int (reader->lengthInSamples), 0, true, false); + + juce::OwnedArray t; + loadWavetables (t, sr, buf, reader->sampleRate, 2048); + + juce::ScopedLock sl (dspLock); + std::swap (t, table); + + return true; + } + } + + return false; +} + void WavetableAudioProcessor::handleMidiEvent (const juce::MidiMessage& m) { MPESynthesiser::handleMidiEvent (m); diff --git a/plugin/Source/PluginProcessor.h b/plugin/Source/PluginProcessor.h index fae021f..526d6df 100644 --- a/plugin/Source/PluginProcessor.h +++ b/plugin/Source/PluginProcessor.h @@ -42,6 +42,7 @@ public: void loadUserWavetable (int osc, const juce::File f); void applyEffects (juce::AudioSampleBuffer& buffer); + bool loadWaveTable (juce::OwnedArray& table, double sr, const juce::MemoryBlock& wav, const juce::String& format); // Voice Params struct OSCParams @@ -274,6 +275,8 @@ public: }; CurTable curTables[Cfg::numOSCs]; + + juce::CriticalSection dspLock; //============================================================================== JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (WavetableAudioProcessor)