#include "ArrayArithmetic.h"
#include "MessageTable.h"
#include "PdGraph.h"
#define DEFAULT_BUFFER_LENGTH 1024
message::Object *MessageTable::new_object(pd::Message *init_message, PdGraph *graph) {
return new MessageTable(init_message, graph);
}
MessageTable::MessageTable(pd::Message *init_message, PdGraph *graph) : RemoteMessageReceiver(0, 0, graph) {
if (init_message->is_symbol(0)) {
name = utils::copy_string(init_message->get_symbol(0));
bufferLength = init_message->is_float(1) ? (int) init_message->get_float(1) : DEFAULT_BUFFER_LENGTH;
buffer = (float *) calloc(bufferLength, sizeof(float));
} else {
name = NULL;
buffer = NULL;
bufferLength = 0;
graph->print_err("Object \"table\" must be initialised with a name.");
}
}
MessageTable::~MessageTable() {
free(name);
free(buffer);
}
float *MessageTable::getBuffer(int *bufferLength) {
*bufferLength = this->bufferLength;
return buffer;
}
float *MessageTable::resizeBuffer(int newBufferLength) {
if (newBufferLength > 0) {
buffer = (float *) realloc(buffer, newBufferLength * sizeof(float));
if (newBufferLength > bufferLength) {
memset(buffer+bufferLength, 0, (newBufferLength-bufferLength) * sizeof(float));
}
bufferLength = newBufferLength;
}
return buffer;
}
void MessageTable::process_message(int inlet_index, pd::Message *message) {
if (message->is_symbol_str(0, "read")) {
if (message->is_symbol_str(1)) {
}
} else if (message->is_symbol_str(0, "write")) {
} else if (message->is_symbol_str(0, "normalize")) {
#if __APPLE__
float sum = 0.0f;
vDSP_sve(buffer, 1, &sum, bufferLength);
if (sum != 0.0f) {
sum = fabsf(sum) / (message->is_float(1) ? message->get_float(1) : 1.0f);
vDSP_vsdiv(buffer, 1, &sum, buffer, 1, bufferLength);
}
#else
float sum = 0.0f;
for (int i = 0; i < bufferLength; i++) {
sum += buffer[i];
}
if (sum != 0.0f) {
sum = fabsf(sum) / (message->is_float(1) ? message->get_float(1) : 1.0f);
for (int i = 0; i < bufferLength; i++) {
buffer[i] /= sum;
}
}
#endif
} else if (message->is_symbol_str(0, "resize")) {
if (message->is_float(1)) {
int newBufferLength = (int) message->get_float(1);
resizeBuffer(newBufferLength);
}
}
}