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);
}
Пример #2
0
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);
  }
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
double hv_getSampleRate(HvBase *c) {
  return ctx_getSampleRate(c);
}