From 64fa95deefd0c21851de8d9500f04856bd323388 Mon Sep 17 00:00:00 2001 From: reuk Date: Mon, 3 Aug 2020 17:34:58 +0100 Subject: [PATCH] SamplerPlugin: Fix bug where cancelling load could cause a segfault --- examples/Plugins/SamplerPluginDemo.h | 34 ++++++++++++++++++---------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/examples/Plugins/SamplerPluginDemo.h b/examples/Plugins/SamplerPluginDemo.h index dc0181e6dc..05405d87a3 100644 --- a/examples/Plugins/SamplerPluginDemo.h +++ b/examples/Plugins/SamplerPluginDemo.h @@ -1811,14 +1811,18 @@ private: void sampleReaderChanged (std::shared_ptr value) override { - if (value == nullptr) - thumbnail.clear(); - else + if (value != nullptr) { - auto reader = value->make (dataModel.getAudioFormatManager()); - thumbnail.setReader (reader.release(), currentHashCode); - currentHashCode += 1; + if (auto reader = value->make (dataModel.getAudioFormatManager())) + { + thumbnail.setReader (reader.release(), currentHashCode); + currentHashCode += 1; + + return; + } } + + thumbnail.clear(); } void visibleRangeChanged (Range) override @@ -1926,10 +1930,15 @@ public: auto setReader = [this] (const FileChooser& fc) { - undoManager.beginNewTransaction(); - auto readerFactory = new FileAudioFormatReaderFactory (fc.getResult()); - dataModel.setSampleReader (std::unique_ptr (readerFactory), - &undoManager); + const auto result = fc.getResult(); + + if (result != File()) + { + undoManager.beginNewTransaction(); + auto readerFactory = new FileAudioFormatReaderFactory (result); + dataModel.setSampleReader (std::unique_ptr (readerFactory), + &undoManager); + } }; loadNewSampleButton.onClick = [this, setReader] @@ -2110,6 +2119,8 @@ public: AudioFormatManager manager; manager.registerBasicFormats(); auto reader = readerFactory->make (manager); + jassert (reader != nullptr); // Failed to load resource! + auto sound = samplerSound; auto sample = std::unique_ptr (new Sample (*reader, 10.0)); auto lengthInSeconds = sample->getLength() / sample->getSampleRate(); @@ -2240,9 +2251,8 @@ public: nullptr, move (newSamplerVoices))); } - else + else if (auto reader = fact->make (formatManager)) { - auto reader = fact->make (formatManager); commands.push (SetSampleCommand (move (fact), std::unique_ptr (new Sample (*reader, 10.0)), move (newSamplerVoices)));