From 6f879cd8cde933320e267e38c6958360fc3e78fb Mon Sep 17 00:00:00 2001 From: hogliux Date: Thu, 29 Jun 2017 18:03:59 +0100 Subject: [PATCH] AAX: Fixed an issue where AAX plug-ins would report a confusing error if their AudioProcessor's getStateInformation returned an empty MemoryBlock --- .../AAX/juce_AAX_Wrapper.cpp | 41 +++++++------------ 1 file changed, 15 insertions(+), 26 deletions(-) diff --git a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp index 000a069979..d9aa13da9e 100644 --- a/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp +++ b/modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp @@ -613,29 +613,18 @@ namespace AAXClasses return AAX_SUCCESS; } - juce::MemoryBlock& getTemporaryChunkMemory() const - { - ScopedLock sl (perThreadDataLock); - const Thread::ThreadID currentThread = Thread::getCurrentThreadId(); - - if (ChunkMemoryBlock::Ptr m = perThreadFilterData [currentThread]) - return m->data; - - ChunkMemoryBlock::Ptr m (new ChunkMemoryBlock()); - perThreadFilterData.set (currentThread, m); - return m->data; - } - AAX_Result GetChunkSize (AAX_CTypeID chunkID, uint32_t* oSize) const override { if (chunkID != juceChunkType) return AAX_CEffectParameters::GetChunkSize (chunkID, oSize); - juce::MemoryBlock& tempFilterData = getTemporaryChunkMemory(); - tempFilterData.reset(); - pluginInstance->getStateInformation (tempFilterData); + auto& chunkMemoryBlock = perThreadFilterData.get(); + + chunkMemoryBlock.data.reset(); + pluginInstance->getStateInformation (chunkMemoryBlock.data); + chunkMemoryBlock.isValid = true; - *oSize = (uint32_t) tempFilterData.getSize(); + *oSize = (uint32_t) chunkMemoryBlock.data.getSize(); return AAX_SUCCESS; } @@ -644,14 +633,15 @@ namespace AAXClasses if (chunkID != juceChunkType) return AAX_CEffectParameters::GetChunk (chunkID, oChunk); - juce::MemoryBlock& tempFilterData = getTemporaryChunkMemory(); - if (tempFilterData.getSize() == 0) + auto& chunkMemoryBlock = perThreadFilterData.get(); + + if (! chunkMemoryBlock.isValid) return 20700; // AAX_ERROR_PLUGIN_API_INVALID_THREAD - oChunk->fSize = (int32_t) tempFilterData.getSize(); - tempFilterData.copyTo (oChunk->fData, 0, tempFilterData.getSize()); - tempFilterData.reset(); + oChunk->fSize = (int32_t) chunkMemoryBlock.data.getSize(); + chunkMemoryBlock.data.copyTo (oChunk->fData, 0, chunkMemoryBlock.data.getSize()); + chunkMemoryBlock.isValid = false; return AAX_SUCCESS; } @@ -1622,11 +1612,10 @@ namespace AAXClasses Array aaxMeters; - struct ChunkMemoryBlock : public ReferenceCountedObject + struct ChunkMemoryBlock { juce::MemoryBlock data; - - typedef ReferenceCountedObjectPtr Ptr; + bool isValid; }; // temporary filter data is generated in GetChunkSize @@ -1635,7 +1624,7 @@ namespace AAXClasses // However, as GetChunkSize and GetChunk can be called // on different threads, we store it in thread dependant storage // in a hash map with the thread id as a key. - mutable HashMap perThreadFilterData; + mutable ThreadLocalValue perThreadFilterData; CriticalSection perThreadDataLock; JUCE_DECLARE_NON_COPYABLE (JuceAAX_Processor)