void olistenumerate_doFullPacket(t_olistenumerate *x, long len, char *ptr) { if (!x->address) { return; } critical_enter(x->lock); char* address_name = x->address->s_name; critical_exit(x->lock); t_osc_msg_ar_s *matches = osc_bundle_s_lookupAddress(len, ptr, address_name, 1); char delegate[len]; long dlen = len; memcpy(delegate, ptr, len); if (matches) { // right outlet: osc_bundle_s_removeMessage(address_name, &dlen, delegate, 1); int message_count = 0; osc_bundle_s_getMsgCount(dlen, delegate, &message_count); if (message_count > 0) { omax_util_outletOSC(x->outlets[0], dlen, delegate); OSC_MEM_INVALIDATE(delegate); } // left outlet: for (int i = 0; i < osc_array_getLen(matches); ++i) { t_osc_message_s* message_match = (t_osc_message_s*)osc_array_get(matches, i); t_osc_message_u* unserialized_msg = osc_message_s_deserialize(message_match); int array_length = osc_message_u_getArgCount(unserialized_msg); if (array_length > 0) { for (int j = 0; j < array_length; ++j) { t_osc_atom_u* iter_atom = osc_message_u_getArg(unserialized_msg, j); t_osc_atom_u* atom_copy = osc_atom_u_copy(iter_atom); if (atom_copy) { t_osc_bundle_u* unserialized_result = NULL; //char type = osc_atom_u_getTypetag(atom_copy); unserialized_result = osc_bundle_u_alloc(); t_osc_message_u* value = osc_message_u_allocWithAddress("/value"); osc_message_u_appendAtom(value, atom_copy); osc_bundle_u_addMsg(unserialized_result, value); t_osc_message_u* address = osc_message_u_allocWithString("/address", address_name); t_osc_message_u* index = osc_message_u_allocWithAddress("/index"); osc_message_u_appendInt32(index, j); t_osc_message_u* length = osc_message_u_allocWithAddress("/length"); osc_message_u_appendInt32(length, array_length); osc_bundle_u_addMsg(unserialized_result, address); osc_bundle_u_addMsg(unserialized_result, index); osc_bundle_u_addMsg(unserialized_result, length); t_osc_bndl_s *bs = osc_bundle_u_serialize(unserialized_result); osc_bundle_u_free(unserialized_result); // frees value, count, length and atom_copy unserialized_result = NULL; atom_copy = NULL; if (bs) { omax_util_outletOSC(x->outlets[1], osc_bundle_s_getLen(bs), osc_bundle_s_getPtr(bs)); osc_bundle_s_deepFree(bs); bs = NULL; } } } if (unserialized_msg) { osc_message_u_free(unserialized_msg); unserialized_msg = NULL; } } else { olistenumerate_noMatchesOrData(x); } } } else { // no matches // right outlet: omax_util_outletOSC(x->outlets[0], dlen, delegate); } if (matches) { osc_array_free(matches); } }
void osc_bundle_array_u_free(t_osc_bundle_array_u *ar) { osc_array_free((t_osc_array *)ar); }
void osc_message_array_s_free(t_osc_message_array_s *ar) { osc_array_free((t_osc_array *)ar); }