Fix logic around inplace processing audio buffer copy

Signed-off-by: falkTX <falktx@falktx.com>
This commit is contained in:
falkTX 2022-01-30 15:53:34 +00:00
parent 8276f86680
commit de63835867
No known key found for this signature in database
GPG key ID: CDBAA37ABC74FBA0

View file

@ -388,7 +388,13 @@ class CardinalPlugin : public CardinalBasePlugin
{ {
SharedResourcePointer<Initializer> fInitializer; SharedResourcePointer<Initializer> fInitializer;
#if DISTRHO_PLUGIN_NUM_INPUTS != 0
/* If host audio ins == outs we can get issues for inplace processing.
* So allocate a float array that will serve as safe copy for those cases.
*/
float** fAudioBufferCopy; float** fAudioBufferCopy;
#endif
std::string fAutosavePath; std::string fAutosavePath;
uint64_t fPreviousFrame; uint64_t fPreviousFrame;
String fWindowSize; String fWindowSize;
@ -402,7 +408,9 @@ public:
CardinalPlugin() CardinalPlugin()
: CardinalBasePlugin(kModuleParameters + kWindowParameterCount, 0, kCardinalStateCount), : CardinalBasePlugin(kModuleParameters + kWindowParameterCount, 0, kCardinalStateCount),
fInitializer(this), fInitializer(this),
#if DISTRHO_PLUGIN_NUM_INPUTS != 0
fAudioBufferCopy(nullptr), fAudioBufferCopy(nullptr),
#endif
fPreviousFrame(0) fPreviousFrame(0)
{ {
#ifndef HEADLESS #ifndef HEADLESS
@ -802,7 +810,7 @@ protected:
#if DISTRHO_PLUGIN_NUM_INPUTS != 0 #if DISTRHO_PLUGIN_NUM_INPUTS != 0
const uint32_t bufferSize = getBufferSize(); const uint32_t bufferSize = getBufferSize();
fAudioBufferCopy = new float*[DISTRHO_PLUGIN_NUM_INPUTS]; fAudioBufferCopy = new float*[DISTRHO_PLUGIN_NUM_INPUTS];
for (int i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) for (int i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
fAudioBufferCopy[i] = new float[bufferSize]; fAudioBufferCopy[i] = new float[bufferSize];
#endif #endif
@ -811,13 +819,15 @@ protected:
void deactivate() override void deactivate() override
{ {
#if DISTRHO_PLUGIN_NUM_INPUTS != 0
if (fAudioBufferCopy != nullptr) if (fAudioBufferCopy != nullptr)
{ {
for (int i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) for (int i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
delete[] fAudioBufferCopy[i]; delete[] fAudioBufferCopy[i];
delete[] fAudioBufferCopy; delete[] fAudioBufferCopy;
fAudioBufferCopy = nullptr; fAudioBufferCopy = nullptr;
} }
#endif
} }
void run(const float** const inputs, float** const outputs, const uint32_t frames, void run(const float** const inputs, float** const outputs, const uint32_t frames,
@ -865,10 +875,13 @@ protected:
// inline processing, use a safe copy // inline processing, use a safe copy
else else
{ {
for (int i=0; i<DISTRHO_PLUGIN_NUM_OUTPUTS; ++i) #if DISTRHO_PLUGIN_NUM_INPUTS != 0
for (int i=0; i<DISTRHO_PLUGIN_NUM_INPUTS; ++i)
std::memcpy(fAudioBufferCopy[i], inputs[i], sizeof(float)*frames); std::memcpy(fAudioBufferCopy[i], inputs[i], sizeof(float)*frames);
context->dataIns = fAudioBufferCopy; context->dataIns = fAudioBufferCopy;
#else
context->dataIns = nullptr;
#endif
context->dataOuts = outputs; context->dataOuts = outputs;
} }