void cPack_onMessage(HvBase *_c, ControlPack *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { // ensure let index is less than number elements in internal msg int numElements = msg_getNumElements(o->msg); switch (letIn) { case 0: { // first inlet stores all values of input msg and triggers an output for (int i = hv_min_i(numElements, msg_getNumElements(m))-1; i >= 0; --i) { switch (msg_getType(m, i)) { case HV_MSG_FLOAT: msg_setFloat(o->msg, i, msg_getFloat(m, i)); break; case HV_MSG_SYMBOL: case HV_MSG_HASH: msg_setHash(o->msg, i, msg_getHash(m, i)); break; default: break; } } msg_setTimestamp(o->msg, msg_getTimestamp(m)); sendMessage(_c, 0, o->msg); break; } default: { // rest of inlets just store values switch (msg_getType(m, 0)) { case HV_MSG_FLOAT: msg_setFloat(o->msg, letIn, msg_getFloat(m, 0)); break; case HV_MSG_SYMBOL: case HV_MSG_HASH: msg_setHash(o->msg, letIn, msg_getHash(m, 0)); break; default: break; } break; } } }
void cVar_onMessage(HvBase *_c, ControlVar *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { case 0: { switch (msg_getType(m,0)) { case HV_MSG_BANG: { HvMessage *n = HV_MESSAGE_ON_STACK(1); if (o->e.type == HV_MSG_FLOAT) msg_initWithFloat(n, msg_getTimestamp(m), o->e.data.f); else if (o->e.type == HV_MSG_HASH) msg_initWithHash(n, msg_getTimestamp(m), o->e.data.h); else return; sendMessage(_c, 0, n); break; } case HV_MSG_FLOAT: { o->e.type = HV_MSG_FLOAT; o->e.data.f = msg_getFloat(m,0); sendMessage(_c, 0, m); break; } case HV_MSG_SYMBOL: case HV_MSG_HASH: { o->e.type = HV_MSG_HASH; o->e.data.h = msg_getHash(m,0); sendMessage(_c, 0, m); break; } default: return; } break; } case 1: { switch (msg_getType(m,0)) { case HV_MSG_FLOAT: { o->e.type = HV_MSG_FLOAT; o->e.data.f = msg_getFloat(m,0); break; } case HV_MSG_SYMBOL: case HV_MSG_HASH: { o->e.type = HV_MSG_HASH; o->e.data.h = msg_getHash(m,0); break; } default: break; } } default: return; } }
void sTabwrite_onMessage(HvBase *_c, SignalTabwrite *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { switch (letIn) { // inlet 0 is the signal inlet case 1: { switch (msg_getType(m,0)) { case BANG: o->head = 0; break; case FLOAT: { o->head = (msg_getFloat(m,0) >= 0.0f) ? (hv_uint32_t) msg_getFloat(m,0) : HV_TABWRITE_STOPPED; break; } case SYMBOL: { if (msg_compareSymbol(m, 0, "stop")) { o->head = HV_TABWRITE_STOPPED; } break; } default: break; } break; } case 2: { if (msg_isHashLike(m,0)) { o->table = ctx_getTableForHash(_c, msg_getHash(m,0)); } break; } default: break; } }