#include "ArrayArithmetic.h"
#include "DspDelayRead.h"
#include "DspDelayWrite.h"
#include "PdGraph.h"
message::Object *DspDelayRead::new_object(pd::Message *init_message, PdGraph *graph) {
return new DspDelayRead(init_message, graph);
}
DspDelayRead::DspDelayRead(pd::Message *init_message, PdGraph *graph) : DelayReceiver(1, 0, 0, 1, graph) {
if (init_message->is_symbol(0) && init_message->is_float(1)) {
name = utils::copy_string(init_message->get_symbol(0));
delayInSamples = utils::millisecondsToSamples(init_message->get_float(1), graph->get_sample_rate());
} else {
graph->print_err("delread~ must be initialised in the format [delread~ name delay].");
delayInSamples = 0.0f;
}
process_function = &processSignal;
}
DspDelayRead::~DspDelayRead() {
}
void DspDelayRead::onInletConnectionUpdate(unsigned int inlet_index) {
}
void DspDelayRead::process_message(int inlet_index, pd::Message *message) {
if (inlet_index == 0 && message->is_float(0)) {
delayInSamples = utils::millisecondsToSamples(message->get_float(0), graph->get_sample_rate());
}
}
void DspDelayRead::processSignal(DspObject *dspObject, int fromIndex, int toIndex) {
DspDelayRead *d = reinterpret_cast<DspDelayRead *>(dspObject);
int headIndex = 0;
int bufferLength = 0;
float *buffer = d->delayline->getBuffer(&headIndex, &bufferLength);
int delayIndex = headIndex - toIndex - ((int) d->delayInSamples);
if (delayIndex < 0) {
delayIndex += bufferLength;
}
if (delayIndex > bufferLength - toIndex) {
int samplesInBuffer = bufferLength - delayIndex; memcpy(d->dspBufferAtOutlet[0], buffer + delayIndex, samplesInBuffer * sizeof(float));
memcpy(d->dspBufferAtOutlet[0] + samplesInBuffer, buffer, (toIndex - samplesInBuffer) * sizeof(float));
} else {
memcpy(d->dspBufferAtOutlet[0], buffer + delayIndex, toIndex*sizeof(float));
}
}