static void _rtmidic_cb(double timestamp, size_t size, uint8_t* message, void **cb) { Data *dat = (Data *)((uint8_t *)cb - offsetof(Data, cb)); Tjost_Module *module = (Tjost_Module *)((uint8_t *)dat - offsetof(Tjost_Module, dat)); // TODO assert(size <= 4) uint8_t m [4] = {0x0}; m[1] = message[0]; m[2] = message[1]; m[3] = message[2]; const size_t len = 16; osc_data_t buf [len]; osc_data_t *ptr = buf; osc_data_t *end = ptr + len; ptr = osc_set_path(ptr, end, "/midi"); ptr = osc_set_fmt(ptr, end, "m"); ptr = osc_set_midi(ptr, end, m); if(ptr && osc_check_message(buf, len)) { if(tjost_pipe_produce(&dat->pipe, module, 0, len, buf)) fprintf(stderr, MOD_NAME": tjost_pipe_produce error\n"); } else fprintf(stderr, MOD_NAME": rx OSC message invalid\n"); }
// rt static void _message_cb(const char *path, const char *fmt, const LV2_Atom_Tuple *body, void *data) { prog_t *handle = data; osc_data_t *ptr = handle->osc_ptr; const osc_data_t *end = handle->osc_end; osc_data_t *itm = NULL; if(handle->bndl_cnt) ptr = osc_start_bundle_item(ptr, end, &itm); ptr = osc_set_path(ptr, end, path); ptr = osc_set_fmt(ptr, end, fmt); const LV2_Atom *itr = lv2_atom_tuple_begin(body); for(const char *type = fmt; *type && !lv2_atom_tuple_is_end(LV2_ATOM_BODY(body), body->atom.size, itr); type++, itr = lv2_atom_tuple_next(itr)) { switch(*type) { case 'i': { ptr = osc_set_int32(ptr, end, ((const LV2_Atom_Int *)itr)->body); break; } case 'f': { ptr = osc_set_float(ptr, end, ((const LV2_Atom_Float *)itr)->body); break; } case 's': case 'S': { ptr = osc_set_string(ptr, end, LV2_ATOM_BODY_CONST(itr)); break; } case 'b': { ptr = osc_set_blob(ptr, end, itr->size, LV2_ATOM_BODY(itr)); break; } case 'h': { ptr = osc_set_int64(ptr, end, ((const LV2_Atom_Long *)itr)->body); break; } case 'd': { ptr = osc_set_double(ptr, end, ((const LV2_Atom_Double *)itr)->body); break; } case 't': { ptr = osc_set_timetag(ptr, end, ((const LV2_Atom_Long *)itr)->body); break; } case 'T': case 'F': case 'N': case 'I': { break; } case 'c': { ptr = osc_set_char(ptr, end, ((const LV2_Atom_Int *)itr)->body); break; } case 'm': { const uint8_t *src = LV2_ATOM_BODY_CONST(itr); const uint8_t dst [4] = { 0x00, // port byte itr->size >= 1 ? src[0] : 0x00, itr->size >= 2 ? src[1] : 0x00, itr->size >= 3 ? src[2] : 0x00 }; ptr = osc_set_midi(ptr, end, dst); break; } } } if(handle->bndl_cnt) ptr = osc_end_bundle_item(ptr, end, itm); handle->osc_ptr = ptr; }