Hi,
I am trying to follow the AudioProgrammer’s tutorials to create a delay effect.The only difference is that I don’t want to use it as a delay effect. It will be something like a freeze effect. So I don’t use many things actually. All I need is a fully functioning delay buffer. It should always store the last 2 seconds of my input signal. When I press a button to activate the freeze feature, it should cut the input and loop that 2 seconds buffer. I tried to use the same method that is being shown in these videos form part one to three
https://www.youtube.com/watch?v=IRFUYGkMV8w
But when I try to compile it and test it in reaper, I get a bad memory access error.
0x1003b78bf <+1391>: cvtss2sd (%rdi), %xmm0
reaper/mediaafx (15): EXC_BAD_ACCESS (code=1, address=0x0)
COULD YOU PLEASE HAVE A LOOK AT MY CODE AND HELP ME TO SOLVE THIS ISSUE ?
processor.h
AudioBuffer<float> mFreezeBuffer;
int mWritePos = 0;
int mSampleRate = 44100;
int mFreezeTime = 2000;
void fillFreezeBuffer (int channel,
const int bufferLenght,
const int freezeBufferLenght,
const float* bufferData,
const float* freezeBufferData);
void getFromFreezeBuffer (AudioBuffer<float>& buffer,
int channel, const int bufferLenght,
const int freezeBufferLenght,
const float* bufferData,
const float* freezeBufferData);
processor.cpp
void FreezeAudioProcessor::prepareToPlay ( double sampleRate, int samplesPerBlock)
{
mFreezeTime = 2000; //just for testing
mSampleRate = sampleRate;
// sample buffer for 2 second + 2 buffers safety
mFreezeBuffer.setSize (getTotalNumOutputChannels(),
2 * (samplesPerBlock + sampleRate));
mFreezeBuffer.clear();
}
void FreezeAudioProcessor::processBlock (AudioBuffer< float >& buffer, MidiBuffer& midiMessages)
{
ScopedNoDenormals noDenormals;
const int totalNumInputChannels = getTotalNumInputChannels();
const int totalNumOutputChannels = getTotalNumOutputChannels();
for ( int i = totalNumInputChannels; i < totalNumOutputChannels; ++i)
buffer.clear (i, 0, buffer.getNumSamples());
for (int channel = 0; channel<totalNumInputChannels; ++channel)
{
const float* bufferData = buffer.getReadPointer (channel);
const float* freezeBufferData = mFreezeBuffer.getReadPointer (channel);
// copy the data from main buffer
fillFreezeBuffer (channel,
bufferLength,
freezeBufferLength,
bufferData,
freezeBufferData);
// fill it back with freezebuffer
// when i uncomment getFromFreezeBuffer i get a bad access memory error.
getFromFreezeBuffer (buffer,
channel,
bufferLength,
freezeBufferLength,
bufferData,
freezeBufferData);
mWritePos += bufferLength;// to move to next 512 samples
mWritePos %= freezeBufferLength ;// to go back to the beginning
}
}
void FreezeAudioProcessor::fillFreezeBuffer (int channel,
const int bufferLength,
const int freezeBufferLenght,
const float* bufferData,
const float* freezeBufferData)
{
// if the freeze buffer still can store another 512 samples in it
if (freezeBufferLenght > bufferLength + mWritePos)
{
mFreezeBuffer.copyFrom (channel,
mWritePos,
bufferData,
bufferLength,
0.8f);
}
else // if the freeze buffer cannot store another 512 samples, fill the remaining samples of the freeze buffer and go back to first index of freeze buffer
{
const int bufferRemaining = freezeBufferLenght - mWritePos;
mFreezeBuffer.copyFrom (channel,
mWritePos,
bufferData,
bufferRemaining,
0.8f);
mFreezeBuffer.copyFrom (channel,
0,
bufferData/*+ bufferRemaining*/,
bufferLength - bufferRemaining,
0.8f);
}
}
void FreezeAudioProcessor::getFromFreezeBuffer (AudioBuffer<float>& buffer,
int channel,
const int bufferLength,
const int freezeBufferLength,
const float* bufferData,
const float* freezeBufferData)
{
const int readPos = static_cast<int> (freezeBufferLength + mWritePos - (mSampleRate * mFreezeTime / 1000) % freezeBufferLength);
if (freezeBufferLength > bufferLength + readPos)
{
buffer.copyFrom (channel, 0, freezeBufferData + readPos, bufferLength);
}
else
{
const int bufferRemaining = freezeBufferLength - readPos;
buffer.copyFrom (channel, 0, freezeBufferData + readPos, bufferRemaining);
buffer.copyFrom (channel, bufferRemaining, freezeBufferData, bufferLength - bufferRemaining);
}
}