From d4a560f6f39d517cb830576c64171b713221fecb Mon Sep 17 00:00:00 2001 From: Emily Mabrey Date: Wed, 4 Aug 2021 19:13:16 -0400 Subject: [PATCH] Add `RealtimeEffectBufferHelper` Signed-off-by: Emily Mabrey --- src/AudioIOBufferHelper.h | 3 ++ src/CMakeLists.txt | 1 + src/effects/RealtimeEffectBufferHelper.h | 67 ++++++++++++++++++++++++ src/effects/RealtimeEffectManager.cpp | 39 +++----------- 4 files changed, 79 insertions(+), 31 deletions(-) create mode 100644 src/effects/RealtimeEffectBufferHelper.h diff --git a/src/AudioIOBufferHelper.h b/src/AudioIOBufferHelper.h index 4081ef2df..28fd75ec9 100644 --- a/src/AudioIOBufferHelper.h +++ b/src/AudioIOBufferHelper.h @@ -3,6 +3,7 @@ #include "AudioIO.h" #include "../libraries/lib-utility/MemoryX.h" +#include class AudioIOBufferHelper { @@ -23,7 +24,9 @@ class AudioIOBufferHelper this->chans = safenew WaveTrack * [numPlaybackChannels]; this->tempBufs = safenew float* [numPlaybackChannels]; + tempBufs[0] = safenew float[(size_t)numPlaybackChannels * framesPerBuffer]; + memset(tempBufs[0], 0, (size_t)numPlaybackChannels * (size_t)framesPerBuffer * sizeof(float)); for (unsigned int c = 1; c < numPlaybackChannels; c++) { tempBufs[c] = tempBufs[c - 1] + framesPerBuffer; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e3bf499de..d4580f31e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -481,6 +481,7 @@ list( APPEND SOURCES effects/Paulstretch.h effects/Phaser.cpp effects/Phaser.h + effects/RealtimeEffectBufferHelper.h effects/RealtimeEffectManager.cpp effects/RealtimeEffectManager.h effects/Repair.cpp diff --git a/src/effects/RealtimeEffectBufferHelper.h b/src/effects/RealtimeEffectBufferHelper.h new file mode 100644 index 000000000..ca1165f2e --- /dev/null +++ b/src/effects/RealtimeEffectBufferHelper.h @@ -0,0 +1,67 @@ +#ifndef REALTIME_EFFECT_BUFFER_HELPER_H +#define REALTIME_EFFECT_BUFFER_HELPER_H + +#include "../libraries/lib-utility/MemoryX.h" +#include + +class RealtimeEffectBufferHelper +{ + + private: + + unsigned int chans; + size_t numSamples; + + const static void deleteAllChannels(unsigned int chans, float** channeledBuf) { + delete[] channeledBuf[0]; + delete[] channeledBuf; + } + + public: + + // Allocate the in/out buffer arrays + float** ibuf; + float** obuf; + float* temp; + + RealtimeEffectBufferHelper(float** buffers, const unsigned int chans, const size_t numSamples) { + + this->chans = chans; + this->numSamples = numSamples; + + // Allocate the in/out buffer arrays + ibuf = safenew float* [chans]; + obuf = safenew float* [chans]; + temp = safenew float[numSamples]; + + const size_t memcpy_size = (size_t)numSamples * chans * sizeof(float); + + ibuf[0] = safenew float[(size_t)chans * numSamples]; + obuf[0] = safenew float[(size_t)chans * numSamples]; + + memset(ibuf[0], 0, memcpy_size); + memset(obuf[0], 0, memcpy_size); + + // Allocate new output buffers and copy buffer input into newly allocated input buffers + + for (unsigned int i = 1; i < chans; i++) { + ibuf[i] = ibuf[i - 1] + numSamples; + obuf[i] = obuf[i - 1] + numSamples; + } + + for (size_t j = 0; j < chans; j++) { + memcpy(ibuf[j], buffers[j], (size_t)numSamples * sizeof(float)); + } + } + + ~RealtimeEffectBufferHelper() { + + delete[] temp; + + deleteAllChannels(chans, obuf); + + deleteAllChannels(chans, ibuf); + } +}; + +#endif diff --git a/src/effects/RealtimeEffectManager.cpp b/src/effects/RealtimeEffectManager.cpp index e4e5c92cb..369b4e40b 100644 --- a/src/effects/RealtimeEffectManager.cpp +++ b/src/effects/RealtimeEffectManager.cpp @@ -16,6 +16,7 @@ #include #include +#include class RealtimeEffectState { @@ -307,21 +308,10 @@ void RealtimeEffectManager::RealtimeProcessStart() // size_t RealtimeEffectManager::RealtimeProcess(int group, unsigned chans, float **buffers, size_t numSamples) { - - // Allocate the in/out buffer arrays - auto ibuf = new float* [chans]; - auto obuf = new float* [chans]; - float* temp = safenew float[numSamples]; + std::unique_ptr bufHelper = std::make_unique(buffers, chans, numSamples); const size_t memcpy_size = numSamples * sizeof(float); - // Allocate new output buffers and copy buffer input into newly allocated input buffers - for (unsigned int i = 0; i < chans; i++) { - ibuf[i] = new float[numSamples]; - memcpy(ibuf[i], buffers[i], memcpy_size); - obuf[i] = new float[numSamples]; - } - // Protect ourselves from the main thread mRealtimeLock.Enter(); @@ -339,14 +329,14 @@ size_t RealtimeEffectManager::RealtimeProcess(int group, unsigned chans, float * size_t called = 0; for (auto& state : mStates) { if (state->IsRealtimeActive()) { - state->RealtimeProcess(group, chans, ibuf, obuf, numSamples); + state->RealtimeProcess(group, chans, bufHelper->ibuf, bufHelper->obuf, numSamples); called++; } for (size_t j = 0; j < chans; j++) { - memcpy(temp, ibuf[j], memcpy_size); - memcpy(ibuf[j], obuf[j], memcpy_size); - memcpy(obuf[j], temp, memcpy_size); + memcpy(bufHelper->temp, bufHelper->ibuf[j], memcpy_size); + memcpy(bufHelper->ibuf[j], bufHelper->obuf[j], memcpy_size); + memcpy(bufHelper->obuf[j], bufHelper->temp, memcpy_size); } } @@ -356,7 +346,7 @@ size_t RealtimeEffectManager::RealtimeProcess(int group, unsigned chans, float * // is odd. if (called & 1) { for (size_t i = 0; i < chans; i++) { - memcpy(buffers[i], ibuf[i], memcpy_size); + memcpy(buffers[i], bufHelper->ibuf[i], memcpy_size); } } @@ -366,21 +356,8 @@ size_t RealtimeEffectManager::RealtimeProcess(int group, unsigned chans, float * mRealtimeLock.Leave(); - delete[] temp; + bufHelper.reset(); - for (size_t i = 0; i < chans; i++) { - delete[] obuf[i]; - } - - delete[] obuf; - - for (size_t i = 0; i < chans; i++) { - delete[] ibuf[i]; - } - - delete[] ibuf; - - // // This is wrong...needs to handle tails // return numSamples;