From 17fe23c95f40bd4a479227cf0212b465bb297b90 Mon Sep 17 00:00:00 2001 From: reuk Date: Wed, 10 Jul 2024 11:40:32 +0100 Subject: [PATCH] SamplerPluginDemo: Add defensive checks in constructor to guard against missing sample resource --- examples/Plugins/SamplerPluginDemo.h | 41 ++++++++++++++-------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/examples/Plugins/SamplerPluginDemo.h b/examples/Plugins/SamplerPluginDemo.h index b6f5e02d98..7f6e170583 100644 --- a/examples/Plugins/SamplerPluginDemo.h +++ b/examples/Plugins/SamplerPluginDemo.h @@ -571,14 +571,14 @@ public: class MemoryAudioFormatReaderFactory final : public AudioFormatReaderFactory { public: - MemoryAudioFormatReaderFactory (const void* sampleDataIn, size_t dataSizeIn) - : sampleData (sampleDataIn), - dataSize (dataSizeIn) - {} + explicit MemoryAudioFormatReaderFactory (MemoryBlock mb) + : memoryBlock (std::make_shared (std::move (mb))) + { + } std::unique_ptr make (AudioFormatManager& manager) const override { - return makeAudioFormatReader (manager, sampleData, dataSize); + return makeAudioFormatReader (manager, memoryBlock->getData(), memoryBlock->getSize()); } std::unique_ptr clone() const override @@ -587,8 +587,7 @@ public: } private: - const void* sampleData; - size_t dataSize; + std::shared_ptr memoryBlock; }; //============================================================================== @@ -2115,25 +2114,28 @@ public: { if (auto inputStream = createAssetInputStream ("cello.wav")) { + MemoryBlock mb; inputStream->readIntoMemoryBlock (mb); - readerFactory.reset (new MemoryAudioFormatReaderFactory (mb.getData(), mb.getSize())); + readerFactory = std::make_unique (std::move (mb)); } - // Set up initial sample, which we load from a binary resource - AudioFormatManager manager; - manager.registerBasicFormats(); - auto reader = readerFactory->make (manager); - jassert (reader != nullptr); // Failed to load resource! + if (readerFactory != nullptr) + { + AudioFormatManager manager; + manager.registerBasicFormats(); - auto sound = samplerSound; - auto sample = std::unique_ptr (new Sample (*reader, 10.0)); - auto lengthInSeconds = sample->getLength() / sample->getSampleRate(); - sound->setLoopPointsInSeconds ({lengthInSeconds * 0.1, lengthInSeconds * 0.9 }); - sound->setSample (std::move (sample)); + if (auto reader = readerFactory->make (manager)) + { + auto sample = std::make_unique (*reader, 10.0); + auto lengthInSeconds = sample->getLength() / sample->getSampleRate(); + samplerSound->setLoopPointsInSeconds ({ lengthInSeconds * 0.1, lengthInSeconds * 0.9 }); + samplerSound->setSample (std::move (sample)); + } + } // Start with the max number of voices for (auto i = 0; i != maxVoices; ++i) - synthesiser.addVoice (new MPESamplerVoice (sound)); + synthesiser.addVoice (new MPESamplerVoice (samplerSound)); } void prepareToPlay (double sampleRate, int) override @@ -2590,7 +2592,6 @@ private: CommandFifo commands; - MemoryBlock mb; std::unique_ptr readerFactory; std::shared_ptr samplerSound = std::make_shared(); MPESynthesiser synthesiser;