#include "LinearInterpolationCircularBuffer.h" template LinearInterpolationCircularBuffer::LinearInterpolationCircularBuffer() { buffer.reset(new std::vector); } template LinearInterpolationCircularBuffer::~LinearInterpolationCircularBuffer() { buffer->clear(); buffer.reset(nullptr); } template void LinearInterpolationCircularBuffer::prepare(int sampleRate) { this->sampleRate = sampleRate; } template void LinearInterpolationCircularBuffer::clear() { buffer->clear(); } template void LinearInterpolationCircularBuffer::setSize(int newBufferSize) { clear(); buffer->resize(newBufferSize); this->bufferSize = newBufferSize; writePointer = 0; readPointer = 0; } template int LinearInterpolationCircularBuffer::getNumSamples() { return buffer->size(); } template void LinearInterpolationCircularBuffer::setDelayInSamples(SampleType delayInSamples) { delay = limitWithinRange(SampleType(0), SampleType(bufferSize - 1), delayInSamples); delayInt = static_cast (std::floor (delay)); delayFrac = delay - (SampleType) delayInt; } template void LinearInterpolationCircularBuffer::setDelayInMs(SampleType delayInMs) { setDelayInSamples((delayInMs / 1000) * sampleRate); } template SampleType LinearInterpolationCircularBuffer::processSample(SampleType input) { pushSample(input); return popSample(); } template void LinearInterpolationCircularBuffer::process(SampleType* channelData, int startSample, int endSample) { for(int sample = startSample; sample < endSample; ++sample) channelData[sample] = processSample(channelData[sample]); } template void LinearInterpolationCircularBuffer::pushSample(SampleType sample) { (*buffer)[writePointer] = sample; writePointer = (writePointer + bufferSize - 1) % bufferSize; } template SampleType LinearInterpolationCircularBuffer::popSample() { SampleType returnValue = interpolateSample(); readPointer = (readPointer + bufferSize - 1) % bufferSize; return returnValue; } template SampleType LinearInterpolationCircularBuffer::interpolateSample() { auto index1 = readPointer + delayInt; auto index2 = index1 + 1; if(index2 >= bufferSize) { index1 %= bufferSize; index2 %= bufferSize; } SampleType value1 = (*buffer)[index1]; SampleType value2 = (*buffer)[index2]; return value1 + delayFrac * (value2 - value1); } template int LinearInterpolationCircularBuffer::getReadPointerIndex() { return readPointer; } template int LinearInterpolationCircularBuffer::getWritePointerIndex() { return writePointer; } template SampleType LinearInterpolationCircularBuffer::limitWithinRange(SampleType lowerLimit, SampleType upperLimit, SampleType value) { return value < lowerLimit ? lowerLimit : (upperLimit < value ? upperLimit : value); } template class LinearInterpolationCircularBuffer; template class LinearInterpolationCircularBuffer;