/*! This virtual function is called before the destructor. We do this because here we can still call virtual methods. */ void flext_base::Exit() { #if FLEXT_SYS == FLEXT_SYS_MAX // according to David Z. one should do that first... if(NeedDSP()) dsp_free(thisHdr()); #endif #if FLEXT_SYS == FLEXT_SYS_PD && !defined(FLEXT_NOATTREDIT) // attribute editor window may still be open -> close it gfxstub_deleteforkey(thisHdr()); #endif #ifdef FLEXT_THREADS StopThreads(); #endif // send remaining pending messages for this object QFlush(this); // delete message lists if(bindhead) delete bindhead; // ATTENTION: the object must free all memory associated to bindings itself if(methhead) delete methhead; if(attrhead) delete attrhead; if(attrdata) delete attrdata; #if FLEXT_SYS == FLEXT_SYS_PD || FLEXT_SYS == FLEXT_SYS_MAX if(outlets) delete[] outlets; if(inlets) { FLEXT_ASSERT(incnt > 1); for(int ix = 1; ix < incnt; ++ix) if(inlets[ix-1]) { // release proxy object #if FLEXT_SYS == FLEXT_SYS_PD pd_free(&inlets[ix-1]->obj.ob_pd); #elif FLEXT_SYS == FLEXT_SYS_MAX freeobject((object *)inlets[ix-1]); #endif } delete[] inlets; } #endif #if FLEXT_SYS == FLEXT_SYS_MAX if(indesc) { for(int i = 0; i < incnt; ++i) if(indesc[i]) delete[] indesc[i]; delete[] indesc; } if(outdesc) { for(int i = 0; i < outcnt; ++i) if(outdesc[i]) delete[] outdesc[i]; delete[] outdesc; } #endif flext_obj::Exit(); }
void gfxstub_new(t_pd *owner, void *key, const char *cmd) { char buf[4*MAXPDSTRING]; char namebuf[80]; char sprintfbuf[MAXPDSTRING]; char *afterpercent; t_int afterpercentlen; t_gfxstub *x; t_symbol *s; /* if any exists with matching key, burn it. */ for (x = gfxstub_list; x; x = x->x_next) if (x->x_key == key) gfxstub_deleteforkey(key); if (strlen(cmd) + 50 > 4*MAXPDSTRING) { bug("audio dialog too long"); bug("%s", cmd); return; } x = (t_gfxstub *)pd_new(gfxstub_class); sprintf(namebuf, ".gfxstub%lx", (t_int)x); s = gensym(namebuf); pd_bind(&x->x_pd, s); x->x_owner = owner; x->x_sym = s; x->x_key = key; x->x_next = gfxstub_list; gfxstub_list = x; /* only replace first %s so sprintf() doesn't crash */ afterpercent = strchr(cmd, '%') + 2; afterpercentlen = afterpercent - cmd; strncpy(sprintfbuf, cmd, afterpercentlen); sprintfbuf[afterpercentlen] = '\0'; sprintf(buf, sprintfbuf, s->s_name); strncat(buf, afterpercent, (4*MAXPDSTRING) - afterpercentlen); sys_gui(buf); }
/* start an audio settings dialog window */ void glob_audio_properties(t_pd *dummy, t_floatarg flongform) { char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)]; /* these are the devices you're using: */ int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV]; int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV]; int audioindev1, audioindev2, audioindev3, audioindev4, audioinchan1, audioinchan2, audioinchan3, audioinchan4, audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4, audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4; int rate, advance, callback, blocksize; /* these are all the devices on your system: */ char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE]; int nindevs = 0, noutdevs = 0, canmulti = 0, cancallback = 0, i; audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti, &cancallback, MAXNDEV, DEVDESCSIZE); sys_gui("global audio_indevlist; set audio_indevlist {}\n"); for (i = 0; i < nindevs; i++) sys_vgui("lappend audio_indevlist {%s}\n", indevlist + i * DEVDESCSIZE); sys_gui("global audio_outdevlist; set audio_outdevlist {}\n"); for (i = 0; i < noutdevs; i++) sys_vgui("lappend audio_outdevlist {%s}\n", outdevlist + i * DEVDESCSIZE); sys_get_audio_params(&naudioindev, audioindev, chindev, &naudiooutdev, audiooutdev, choutdev, &rate, &advance, &callback, &blocksize); /* post("naudioindev %d naudiooutdev %d longform %f", naudioindev, naudiooutdev, flongform); */ if (naudioindev > 1 || naudiooutdev > 1) flongform = 1; audioindev1 = (naudioindev > 0 && audioindev[0]>= 0 ? audioindev[0] : 0); audioindev2 = (naudioindev > 1 && audioindev[1]>= 0 ? audioindev[1] : 0); audioindev3 = (naudioindev > 2 && audioindev[2]>= 0 ? audioindev[2] : 0); audioindev4 = (naudioindev > 3 && audioindev[3]>= 0 ? audioindev[3] : 0); audioinchan1 = (naudioindev > 0 ? chindev[0] : 0); audioinchan2 = (naudioindev > 1 ? chindev[1] : 0); audioinchan3 = (naudioindev > 2 ? chindev[2] : 0); audioinchan4 = (naudioindev > 3 ? chindev[3] : 0); audiooutdev1 = (naudiooutdev > 0 && audiooutdev[0]>=0 ? audiooutdev[0] : 0); audiooutdev2 = (naudiooutdev > 1 && audiooutdev[1]>=0 ? audiooutdev[1] : 0); audiooutdev3 = (naudiooutdev > 2 && audiooutdev[2]>=0 ? audiooutdev[2] : 0); audiooutdev4 = (naudiooutdev > 3 && audiooutdev[3]>=0 ? audiooutdev[3] : 0); audiooutchan1 = (naudiooutdev > 0 ? choutdev[0] : 0); audiooutchan2 = (naudiooutdev > 1 ? choutdev[1] : 0); audiooutchan3 = (naudiooutdev > 2 ? choutdev[2] : 0); audiooutchan4 = (naudiooutdev > 3 ? choutdev[3] : 0); sprintf(buf, "pdtk_audio_dialog %%s \ %d %d %d %d %d %d %d %d \ %d %d %d %d %d %d %d %d \ %d %d %d %d %d %d\n", audioindev1, audioindev2, audioindev3, audioindev4, audioinchan1, audioinchan2, audioinchan3, audioinchan4, audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4, audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4, rate, advance, canmulti, (cancallback ? callback : -1), (flongform != 0), blocksize); gfxstub_deleteforkey(0); gfxstub_new(&glob_pdobject, (void *)glob_audio_properties, buf); }
static void iem_event_free(t_iem_event *x) { if(x->x_gui.x_fsf.x_rcv_able) pd_unbind(&x->x_gui.x_obj.ob_pd, x->x_gui.x_rcv); gfxstub_deleteforkey(x); }
static void hfadl_scale_ff(t_hfadl_scale *x) { gfxstub_deleteforkey(x); }
static void vfad_scale_ff(t_vfad_scale *x) { gfxstub_deleteforkey(x); }
/* start an midi settings dialog window */ void glob_midi_properties(t_pd *dummy, t_floatarg flongform) { char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)]; /* these are the devices you're using: */ int nindev, midiindev[MAXMIDIINDEV]; int noutdev, midioutdev[MAXMIDIOUTDEV]; int midiindev1, midiindev2, midiindev3, midiindev4, midioutdev1, midioutdev2, midioutdev3, midioutdev4; /* these are all the devices on your system: */ char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE]; int nindevs = 0, noutdevs = 0, i; char indevliststring[MAXNDEV*(DEVDESCSIZE+4)+80], outdevliststring[MAXNDEV*(DEVDESCSIZE+4)+80]; midi_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, MAXNDEV, DEVDESCSIZE); strcpy(indevliststring, "{ {none} "); for (i = 0; i < nindevs; i++) { strcat(indevliststring, "\""); strcat(indevliststring, indevlist + i * DEVDESCSIZE); strcat(indevliststring, "\" "); } strcat(indevliststring, "}"); strcpy(outdevliststring, "{ {none} "); for (i = 0; i < noutdevs; i++) { strcat(outdevliststring, "\""); strcat(outdevliststring, outdevlist + i * DEVDESCSIZE); strcat(outdevliststring, "\" "); } strcat(outdevliststring, "}"); sys_get_midi_params(&nindev, midiindev, &noutdev, midioutdev); if (nindev > 1 || noutdev > 1) flongform = 1; midiindev1 = (nindev > 0 && midiindev[0]>= 0 ? midiindev[0]+1 : 0); midiindev2 = (nindev > 1 && midiindev[1]>= 0 ? midiindev[1]+1 : 0); midiindev3 = (nindev > 2 && midiindev[2]>= 0 ? midiindev[2]+1 : 0); midiindev4 = (nindev > 3 && midiindev[3]>= 0 ? midiindev[3]+1 : 0); midioutdev1 = (noutdev > 0 && midioutdev[0]>=0 ? midioutdev[0]+1 : 0); midioutdev2 = (noutdev > 1 && midioutdev[1]>=0 ? midioutdev[1]+1 : 0); midioutdev3 = (noutdev > 2 && midioutdev[2]>=0 ? midioutdev[2]+1 : 0); midioutdev4 = (noutdev > 3 && midioutdev[3]>=0 ? midioutdev[3]+1 : 0); sprintf(buf, "pdtk_midi_dialog %%s \ %s %d %d %d %d %s %d %d %d %d \ %d\n", indevliststring, midiindev1, midiindev2, midiindev3, midiindev4, outdevliststring, midioutdev1, midioutdev2, midioutdev3, midioutdev4, (flongform != 0)); gfxstub_deleteforkey(0); gfxstub_new(&glob_pdobject, glob_midi_properties, buf); }
/* "cancel" to request that we close the dialog window. */ static void gfxstub_cancel(t_gfxstub *x) { gfxstub_deleteforkey(x->x_key); }
static void iem_image_ff(t_iem_image *x) { gfxstub_deleteforkey(x); }
void glob_audio_properties(t_pd *dummy, t_floatarg flongform) { char buf[1024 + 2 * MAXNDEV*(DEVDESCSIZE+4)]; /* these are the devices you're using: */ int naudioindev, audioindev[MAXAUDIOINDEV], chindev[MAXAUDIOINDEV]; int naudiooutdev, audiooutdev[MAXAUDIOOUTDEV], choutdev[MAXAUDIOOUTDEV]; int audioindev1, audioindev2, audioindev3, audioindev4, audioinchan1, audioinchan2, audioinchan3, audioinchan4, audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4, audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4; int rate, advance; /* these are all the devices on your system: */ char indevlist[MAXNDEV*DEVDESCSIZE], outdevlist[MAXNDEV*DEVDESCSIZE]; int nindevs = 0, noutdevs = 0, canmulti = 0, i; char indevliststring[MAXNDEV*(DEVDESCSIZE+4)+80], outdevliststring[MAXNDEV*(DEVDESCSIZE+4)+80]; audio_getdevs(indevlist, &nindevs, outdevlist, &noutdevs, &canmulti, MAXNDEV, DEVDESCSIZE); strcpy(indevliststring, "{"); for (i = 0; i < nindevs; i++) { strcat(indevliststring, "\""); strcat(indevliststring, indevlist + i * DEVDESCSIZE); strcat(indevliststring, "\" "); } strcat(indevliststring, "}"); strcpy(outdevliststring, "{"); for (i = 0; i < noutdevs; i++) { strcat(outdevliststring, "\""); strcat(outdevliststring, outdevlist + i * DEVDESCSIZE); strcat(outdevliststring, "\" "); } strcat(outdevliststring, "}"); sys_get_audio_params(&naudioindev, audioindev, chindev, &naudiooutdev, audiooutdev, choutdev, &rate, &advance); /* post("naudioindev %d naudiooutdev %d longform %f", naudioindev, naudiooutdev, flongform); */ if (naudioindev > 1 || naudiooutdev > 1) flongform = 1; audioindev1 = (naudioindev > 0 && audioindev[0]>= 0 ? audioindev[0] : 0); audioindev2 = (naudioindev > 1 && audioindev[1]>= 0 ? audioindev[1] : 0); audioindev3 = (naudioindev > 2 && audioindev[2]>= 0 ? audioindev[2] : 0); audioindev4 = (naudioindev > 3 && audioindev[3]>= 0 ? audioindev[3] : 0); audioinchan1 = (naudioindev > 0 ? chindev[0] : 0); audioinchan2 = (naudioindev > 1 ? chindev[1] : 0); audioinchan3 = (naudioindev > 2 ? chindev[2] : 0); audioinchan4 = (naudioindev > 3 ? chindev[3] : 0); audiooutdev1 = (naudiooutdev > 0 && audiooutdev[0]>=0 ? audiooutdev[0] : 0); audiooutdev2 = (naudiooutdev > 1 && audiooutdev[1]>=0 ? audiooutdev[1] : 0); audiooutdev3 = (naudiooutdev > 2 && audiooutdev[2]>=0 ? audiooutdev[2] : 0); audiooutdev4 = (naudiooutdev > 3 && audiooutdev[3]>=0 ? audiooutdev[3] : 0); audiooutchan1 = (naudiooutdev > 0 ? choutdev[0] : 0); audiooutchan2 = (naudiooutdev > 1 ? choutdev[1] : 0); audiooutchan3 = (naudiooutdev > 2 ? choutdev[2] : 0); audiooutchan4 = (naudiooutdev > 3 ? choutdev[3] : 0); sprintf(buf, "pdtk_audio_dialog %%s \ %s %d %d %d %d %d %d %d %d \ %s %d %d %d %d %d %d %d %d \ %d %d %d %d\n", indevliststring, audioindev1, audioindev2, audioindev3, audioindev4, audioinchan1, audioinchan2, audioinchan3, audioinchan4, outdevliststring, audiooutdev1, audiooutdev2, audiooutdev3, audiooutdev4, audiooutchan1, audiooutchan2, audiooutchan3, audiooutchan4, rate, advance, canmulti, (flongform != 0)); gfxstub_deleteforkey(0); gfxstub_new(&glob_pdobject, glob_audio_properties, buf); }