#include "MessageToggle.h"
message::Object *MessageToggle::new_object(pd::Message *init_message, PdGraph *graph) {
return new MessageToggle(init_message, graph);
}
MessageToggle::MessageToggle(pd::Message *initString, PdGraph *graph) : message::Object(1, 1, graph) {
isOn = false;
onOutput = 1.0f;
}
MessageToggle::~MessageToggle() {
}
const char *MessageToggle::get_object_label() {
return "toggle";
}
void MessageToggle::process_message(int inlet_index, pd::Message *message) {
switch (message->get_type(0)) {
case FLOAT: {
isOn = (message->get_float(0) != 0.0f);
if (isOn) onOutput = message->get_float(0);
pd::Message *outgoing_message = PD_MESSAGE_ON_STACK(1);
outgoing_message->from_timestamp_and_float(message->get_timestamp(), isOn ? onOutput : 0.0f);
send_message(0, outgoing_message);
break;
}
case BANG: {
isOn = !isOn;
pd::Message *outgoing_message = PD_MESSAGE_ON_STACK(1);
outgoing_message->from_timestamp_and_float(message->get_timestamp(), isOn ? onOutput : 0.0f);
send_message(0, outgoing_message);
break;
}
case SYMBOL: {
if (message->is_symbol_str(0, "set")) {
if (message->is_float(1)) {
isOn = (message->get_float(1) != 0.0f);
if (isOn) onOutput = message->get_float(1);
}
}
break;
}
default: break;
}
}