Browse Source

AAX: Fixed an issue where AAX plug-ins would report a confusing error if their AudioProcessor's getStateInformation returned an empty MemoryBlock

tags/2021-05-28
hogliux 8 years ago
parent
commit
6f879cd8cd
1 changed files with 15 additions and 26 deletions
  1. +15
    -26
      modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp

+ 15
- 26
modules/juce_audio_plugin_client/AAX/juce_AAX_Wrapper.cpp View File

@@ -613,29 +613,18 @@ namespace AAXClasses
return AAX_SUCCESS; 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 AAX_Result GetChunkSize (AAX_CTypeID chunkID, uint32_t* oSize) const override
{ {
if (chunkID != juceChunkType) if (chunkID != juceChunkType)
return AAX_CEffectParameters::GetChunkSize (chunkID, oSize); 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; return AAX_SUCCESS;
} }
@@ -644,14 +633,15 @@ namespace AAXClasses
if (chunkID != juceChunkType) if (chunkID != juceChunkType)
return AAX_CEffectParameters::GetChunk (chunkID, oChunk); 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 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; return AAX_SUCCESS;
} }
@@ -1622,11 +1612,10 @@ namespace AAXClasses
Array<int> aaxMeters; Array<int> aaxMeters;
struct ChunkMemoryBlock : public ReferenceCountedObject
struct ChunkMemoryBlock
{ {
juce::MemoryBlock data; juce::MemoryBlock data;
typedef ReferenceCountedObjectPtr<ChunkMemoryBlock> Ptr;
bool isValid;
}; };
// temporary filter data is generated in GetChunkSize // temporary filter data is generated in GetChunkSize
@@ -1635,7 +1624,7 @@ namespace AAXClasses
// However, as GetChunkSize and GetChunk can be called // However, as GetChunkSize and GetChunk can be called
// on different threads, we store it in thread dependant storage // on different threads, we store it in thread dependant storage
// in a hash map with the thread id as a key. // in a hash map with the thread id as a key.
mutable HashMap<Thread::ThreadID, ChunkMemoryBlock::Ptr> perThreadFilterData;
mutable ThreadLocalValue<ChunkMemoryBlock> perThreadFilterData;
CriticalSection perThreadDataLock; CriticalSection perThreadDataLock;
JUCE_DECLARE_NON_COPYABLE (JuceAAX_Processor) JUCE_DECLARE_NON_COPYABLE (JuceAAX_Processor)


Loading…
Cancel
Save