static void cart2del_damp_3d_free(t_cart2del_damp_3d *x) { clock_free(x->x_clock); }
static void poke_free(t_poke *x) { if (x->x_clock) clock_free(x->x_clock); arsic_free((t_arsic *)x); }
static void metro_free(t_metro *x) { clock_free(x->x_clock); }
static void forpp_ff(t_forpp *x) { clock_free(x->x_clock); clock_free(x->x_clock2); }
static void tabwrite_free(t_tabwrite *x) { clock_free(x->x_clock); }
void meter_free(t_meter *x) { ebox_free((t_ebox *)x); clock_free(x->f_clock); }
void h_free_callbacks() { clock_free(h_callback_clock); threadlib_fifo_destroy(h_callback_fifo); }
static void threshold_tilde_ff(t_threshold_tilde *x) { clock_free(x->x_clock); }
static void s2f_free(t_s2f *x){ if (x->x_clock) clock_free(x->x_clock); }
static void sigpack_free(t_sigpack*x) { clock_free(x->x_clock); }
static void env_tilde_ff(t_sigenv *x) /* cleanup on free */ { clock_free(x->x_clock); freebytes(x->x_buf, (x->x_npoints + x->x_allocforvs) * sizeof(*x->x_buf)); }
static void pvu_tilde_ff(t_pvu_tilde *x) { clock_free(x->x_clock); }
~PIMPL(void) { if(qClock) clock_free (qClock); qClock=NULL; if(dispatchClock) clock_free (dispatchClock); dispatchClock=NULL; if(infoOut)outlet_free(infoOut); infoOut=NULL; }
static void curve_free(t_curve *x) { if (x->x_segs != x->x_segini) freebytes(x->x_segs, x->x_size * sizeof(*x->x_segs)); if (x->x_clock) clock_free(x->x_clock); }
static void tabplay_tilde_free(t_tabplay_tilde *x) { clock_free(x->x_clock); }
static void threshold_ff(t_threshold *x) { clock_free(x->x_clock); }
static void qlist_free(t_qlist *x) { binbuf_free(x->x_binbuf); if (x->x_clock) clock_free(x->x_clock); }
// --------------------------------------------------- // Destroy the class // --------------------------------------------------- void time_post_destroy(t_time_post *x) { clock_unset(x->x_clock); clock_free(x->x_clock); }
// ********************************************************* // -(new)--------------------------------------------------- void *oscmulticast_new(t_symbol *s, int argc, t_atom *argv) { t_oscmulticast *x = NULL; int i, got_port = 0; char address[64]; #ifdef MAXMSP if ((x = object_alloc(oscmulticast_class))) { x->outlet3 = listout((t_object *)x); x->outlet2 = listout((t_object *)x); x->outlet1 = listout((t_object *)x); #else if (x = (t_oscmulticast *) pd_new(oscmulticast_class)) { x->outlet1 = outlet_new(&x->ob, gensym("list")); x->outlet2 = outlet_new(&x->ob, gensym("list")); x->outlet3 = outlet_new(&x->ob, gensym("list")); #endif x->group = NULL; x->iface = NULL; if (argc < 4) { post("oscmulticast: not enough arguments!\n"); return NULL; } for (i = 0; i < argc; i++) { if(strcmp(maxpd_atom_get_string(argv+i), "@group") == 0) { if ((argv+i+1)->a_type == A_SYM) { x->group = strdup(maxpd_atom_get_string(argv+i+1)); i++; } } else if (strcmp(maxpd_atom_get_string(argv+i), "@port") == 0) { if ((argv+i+1)->a_type == A_FLOAT) { snprintf(x->port, 10, "%i", (int)maxpd_atom_get_float(argv+i+1)); got_port = 1; i++; } #ifdef MAXMSP else if ((argv+i+1)->a_type == A_LONG) { snprintf(x->port, 10, "%i", (int)atom_getlong(argv+i+1)); got_port = 1; i++; } #endif } else if(strcmp(maxpd_atom_get_string(argv+i), "@interface") == 0) { if ((argv+i+1)->a_type == A_SYM) { x->iface = strdup(maxpd_atom_get_string(argv+i+1)); i++; } } } if (!x->group || !got_port) { post("oscmulticast: need to specify group and port!"); return NULL; } /* Open address */ snprintf(address, 64, "osc.udp://%s:%s", x->group, x->port); x->address = lo_address_new_from_url(address); if (!x->address) { post("oscmulticast: could not create lo_address."); return NULL; } /* Set TTL for packet to 1 -> local subnet */ lo_address_set_ttl(x->address, 1); /* Specify the interface to use for multicasting */ if (x->iface) { if (lo_address_set_iface(x->address, x->iface, 0)) { post("oscmulticast: could not create lo_address."); return NULL; } x->server = lo_server_new_multicast_iface(x->group, x->port, x->iface, 0, 0); } else { x->server = lo_server_new_multicast(x->group, x->port, 0); } if (!x->server) { post("oscmulticast: could not create lo_server"); lo_address_free(x->address); return NULL; } // Disable liblo message queueing lo_server_enable_queue(x->server, 0, 1); if (x->iface) post("oscmulticast: using interface %s", lo_address_get_iface(x->address)); else post("oscmulticast: using default interface"); lo_server_add_method(x->server, NULL, NULL, oscmulticast_handler, x); #ifdef MAXMSP x->clock = clock_new(x, (method)oscmulticast_poll); // Create the timing clock #else x->clock = clock_new(x, (t_method)oscmulticast_poll); #endif clock_delay(x->clock, INTERVAL); // Set clock to go off after delay } return (x); } // ********************************************************* // -(free)-------------------------------------------------- void oscmulticast_free(t_oscmulticast *x) { if (x->clock) { clock_unset(x->clock); // Remove clock routine from the scheduler clock_free(x->clock); // Frees memory used by clock } if (x->server) { lo_server_free(x->server); } if (x->address) { lo_address_free(x->address); } if (x->iface) { free(x->iface); } if (x->group) { free(x->group); } } // ********************************************************* // -(inlet/outlet assist - maxmsp only)--------------------- #ifdef MAXMSP void oscmulticast_assist(t_oscmulticast *x, void *b, long m, long a, char *s) { if (m == ASSIST_INLET) { // inlet sprintf(s, "OSC to be sent to multicast bus"); } else { // outlet sprintf(s, "OSC from multicast bus"); } } #endif // ********************************************************* // -(interface)--------------------------------------------- static void oscmulticast_interface(t_oscmulticast *x, t_symbol *s, int argc, t_atom *argv) { const char *iface = 0; if (argc < 1) return; if (argv->a_type != A_SYM) return; iface = maxpd_atom_get_string(argv); if (lo_address_set_iface(x->address, iface, 0)) { post("oscmulticast: could not create lo_address."); return; } if (x->server) lo_server_free(x->server); x->server = lo_server_new_multicast_iface(x->group, x->port, iface, 0, 0); if (!x->server) { post("oscmulticast: could not create lo_server"); return; } post("oscmulticast: using interface %s", lo_address_get_iface(x->address)); lo_server_add_method(x->server, NULL, NULL, oscmulticast_handler, x); } // ********************************************************* // -(anything)---------------------------------------------- void oscmulticast_anything(t_oscmulticast *x, t_symbol *s, int argc, t_atom *argv) { lo_message m = lo_message_new(); if (!m) { post("lo_message_new() error"); return; } int i; for (i=0; i<argc; i++) { switch ((argv + i)->a_type) { case A_FLOAT: lo_message_add_float(m, atom_getfloat(argv + i)); break; #ifdef MAXMSP case A_LONG: lo_message_add_int32(m, (int)atom_getlong(argv + i)); break; #endif case A_SYM: lo_message_add_string(m, maxpd_atom_get_string(argv + i)); break; } } //set timetag? lo_send_message(x->address, s->s_name, m); lo_message_free(m); }
void phasorshot_free(t_phasorshot *x) { clock_free(x->x_clock); }
static void timebang_free(t_timebang *x) { clock_free(x->x_clock); }
static void tab_cross_corr_free(t_tab_cross_corr *x) { clock_free(x->x_clock); }
static void delay_free(t_delay *x) { clock_free(x->x_clock); }
void breakpoints_free(t_breakpoints *x) { ebox_free((t_ebox *)x); clock_free(x->f_clock); }
static void rvu_tilde_ff(t_rvu_tilde *x) { clock_free(x->x_clock_metro); }
static void mstosamps_free(t_mstosamps *x) { if (x->x_clock) clock_free(x->x_clock); }
static void incdec_free(t_incdec *x) { clock_free(x->f_clock); ebox_free((t_ebox *)x); }
static void netdist_free(t_netdist *x) { netdist_clear(x); clock_free(x->x_clock); }
static void line_free(t_line *x) { clock_free(x->x_clock); }
static void *mtr_new(t_floatarg f) { t_mtr *x = 0; int ntracks = (int)f; t_mtrack **tracks; if (ntracks < 1) ntracks = 1; if (tracks = getbytes(ntracks * sizeof(*tracks))) { int i; t_mtrack **tpp; for (i = 0, tpp = tracks; i < ntracks; i++, tpp++) { if (!(*tpp = (t_mtrack *)pd_new(mtrack_class)) || !((*tpp)->tr_binbuf = binbuf_new()) || !((*tpp)->tr_clock = clock_new(*tpp, (t_method)mtrack_tick))) { if (*tpp) pd_free((t_pd *)*tpp); if ((*tpp)->tr_binbuf) binbuf_free((*tpp)->tr_binbuf); while (i--) { tpp--; binbuf_free((*tpp)->tr_binbuf); clock_free((*tpp)->tr_clock); pd_free((t_pd *)*tpp); } return (0); } } if (x = (t_mtr *)pd_new(mtr_class)) { int id; t_outlet *mainout = outlet_new((t_object *)x, &s_list); x->x_glist = canvas_getcurrent(); x->x_filehandle = hammerfile_new((t_pd *)x, 0, mtr_readhook, mtr_writehook, 0); if (ntracks > MTR_C74MAXTRACKS) fittermax_rangewarning(mtr_class, MTR_C74MAXTRACKS, "tracks"); x->x_ntracks = ntracks; x->x_tracks = tracks; for (id = 1; id <= ntracks; id++, tracks++) /* CHECKED 1-based */ { t_mtrack *tp = *tracks; inlet_new((t_object *)x, (t_pd *)tp, 0, 0); tp->tr_trackout = outlet_new((t_object *)x, &s_); tp->tr_mainout = mainout; tp->tr_owner = x; tp->tr_id = id; tp->tr_listed = 0; tp->tr_filehandle = /* LATER rethink */ hammerfile_new((t_pd *)tp, 0, mtrack_readhook, mtrack_writehook, 0); tp->tr_mode = MTR_STEPMODE; tp->tr_muted = 0; tp->tr_restarted = 0; tp->tr_atdelta = 0; tp->tr_ixnext = 0; tp->tr_tempo = 1.; tp->tr_clockdelay = 0.; tp->tr_prevtime = 0.; } } } return (x); }