#include "ArrayArithmetic.h"
#include "DspTableRead.h"
#include "PdGraph.h"
message::Object *DspTableRead::new_object(pd::Message *init_message, PdGraph *graph) {
return new DspTableRead(init_message, graph);
}
DspTableRead::DspTableRead(pd::Message *init_message, PdGraph *graph) : DspObject(2, 1, 0, 1, graph) {
name = init_message->is_symbol(0) ? utils::copy_string(init_message->get_symbol(0)) : NULL;
table = NULL;
offset = 0.0f;
}
DspTableRead::~DspTableRead() {
free(name);
}
void DspTableRead::set_table(MessageTable *aTable) {
table = aTable;
}
void DspTableRead::process_message(int inlet_index, pd::Message *message) {
switch (inlet_index) {
case 0: {
if (message->is_symbol_str(0, "set") && message->is_symbol(1)) {
free(name);
name = utils::copy_string(message->get_symbol(1));
table = graph->get_table(name);
}
break;
}
case 1: {
if (message->is_float(0)) {
offset = message->get_float(0); }
break;
}
default: {
break;
}
}
}
void DspTableRead::processDspWithIndex(int fromIndex, int toIndex) {
if (table != NULL) { int bufferLength = 0;
float *buffer = table->getBuffer(&bufferLength);
#if __APPLE__
int duration = toIndex - fromIndex;
float *outBuff = dspBufferAtOutlet[0]+fromIndex;
vDSP_vsadd(dspBufferAtInlet[0]+fromIndex, 1, &offset, outBuff, 1, duration);
float min = 0;
float max = (float) (bufferLength-1);
vDSP_vclip(outBuff, 1, &min, &max, outBuff, 1, duration);
vDSP_vindex(buffer, outBuff, 1, outBuff, 1, duration);
#else
float *input_buffer = dspBufferAtInlet[0];
for (int i = fromIndex; i < toIndex; i++) {
int x = (int) (input_buffer[i] + offset);
if (x <= 0) {
dspBufferAtOutlet[0][i] = buffer[0];
} else if (x >= bufferLength) {
dspBufferAtOutlet[0][i] = buffer[bufferLength-1];
} else {
dspBufferAtOutlet[0][i] = buffer[x];
}
}
#endif
}
}