1
0
mirror of https://github.com/cookiengineer/audacity synced 2025-05-06 23:02:42 +02:00

Add RealtimeEffectBufferHelper

Signed-off-by: Emily Mabrey <emabrey@tenacityaudio.org>
This commit is contained in:
Emily Mabrey 2021-08-04 19:13:16 -04:00
parent d69160975d
commit d4a560f6f3
No known key found for this signature in database
GPG Key ID: 6F4EF47256A1B7DC
4 changed files with 79 additions and 31 deletions

View File

@ -3,6 +3,7 @@
#include "AudioIO.h"
#include "../libraries/lib-utility/MemoryX.h"
#include <string>
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;

View File

@ -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

View File

@ -0,0 +1,67 @@
#ifndef REALTIME_EFFECT_BUFFER_HELPER_H
#define REALTIME_EFFECT_BUFFER_HELPER_H
#include "../libraries/lib-utility/MemoryX.h"
#include <string>
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

View File

@ -16,6 +16,7 @@
#include <atomic>
#include <wx/time.h>
#include <effects/RealtimeEffectBufferHelper.h>
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<RealtimeEffectBufferHelper> bufHelper = std::make_unique<RealtimeEffectBufferHelper>(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;