void cSystem_onMessage(HvBase *_c, void *o, int letIn, const HvMessage *const m, void (*sendMessage)(HvBase *, int, const HvMessage *const)) { HvMessage *n = HV_MESSAGE_ON_STACK(1); if (msg_compareSymbol(m, 0, "samplerate")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getSampleRate(_c)); } else if (msg_compareSymbol(m, 0, "numInputChannels")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getNumInputChannels(_c)); } else if (msg_compareSymbol(m, 0, "numOutputChannels")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) ctx_getNumOutputChannels(_c)); } else if (msg_compareSymbol(m, 0, "currentTime")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) msg_getTimestamp(m)); } else if (msg_compareSymbol(m, 0, "table")) { // NOTE(mhroth): no need to check message format for symbols as table lookup will fail otherwise HvTable *table = ctx_getTableForHash(_c, msg_getHash(m,1)); if (table != NULL) { if (msg_compareSymbol(m, 2, "length")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getLength(table)); } else if (msg_compareSymbol(m, 2, "size")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getSize(table)); } else if (msg_compareSymbol(m, 2, "head")) { msg_initWithFloat(n, msg_getTimestamp(m), (float) hTable_getHead(table)); } else return; } else return; } else return; sendMessage(_c, 0, n); }
void cPrint_onMessage(HvBase *_c, const HvMessage *const m, const char *name) { if (Base(_c)->printHook != NULL) { char *s = msg_toString(m); Base(_c)->printHook(((double) msg_getTimestamp(m))/ctx_getSampleRate(_c), name, s, ctx_getUserData(_c)); hv_free(s); } }
void hv_scheduleMessageForReceiver(HvBase *c, const char *receiverName, double delayMs, HvMessage *m) { hv_assert(delayMs >= 0.0); msg_setTimestamp(m, c->blockStartTimestamp + (hv_uint32_t) (delayMs*ctx_getSampleRate(c)/1000.0)); ctx_scheduleMessageForReceiver(c, receiverName, m); }
void hv_vscheduleMessageForReceiver(HvBase *c, const char *receiverName, const double delayMs, const char *format, ...) { va_list ap; va_start(ap, format); const int numElem = (int) hv_strlen(format); HvMessage *m = HV_MESSAGE_ON_STACK(numElem); msg_init(m, numElem, c->blockStartTimestamp + (hv_uint32_t) (hv_max_d(0.0, delayMs)*ctx_getSampleRate(c)/1000.0)); for (int i = 0; i < numElem; i++) { switch (format[i]) { case 'b': msg_setBang(m,i); break; case 'f': msg_setFloat(m, i, (float) va_arg(ap, double)); break; case 's': msg_setSymbol(m, i, (char *) va_arg(ap, char *)); break; default: break; } } ctx_scheduleMessageForReceiver(c, receiverName, m); va_end(ap); }
double hv_getSampleRate(HvBase *c) { return ctx_getSampleRate(c); }