mirror of
https://github.com/cookiengineer/audacity
synced 2025-05-06 14:52:34 +02:00
Add RealtimeEffectBufferHelper
Signed-off-by: Emily Mabrey <emabrey@tenacityaudio.org>
This commit is contained in:
parent
d69160975d
commit
d4a560f6f3
@ -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;
|
||||
|
@ -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
|
||||
|
67
src/effects/RealtimeEffectBufferHelper.h
Normal file
67
src/effects/RealtimeEffectBufferHelper.h
Normal 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
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user