/* ensures that sinks match signal outlets -- this is needed in the constructor, but is called before each push, perhaps too defensively... LATER rethink */ static int riddle_validatesinks(t_riddle *rd) { t_object *x = (t_object *)rd; int sigoutno, outno, nouts = obj_noutlets(x); for (sigoutno = 0, outno = 0; outno < nouts; outno++) { if (obj_issignaloutlet(x, outno)) { if (sigoutno < rd->rd_nsigoutlets) { if (rd->rd_outslots[sigoutno].si_outno != outno) { if (rd->rd_outslots[sigoutno].si_outno < 0) rd->rd_outslots[sigoutno].si_outno = outno; else { loudbug_bug("riddle_validatesinks 1"); return (0); } } } else { loudbug_bug("riddle_validatesinks 2"); /* LATER grow */ return (0); } sigoutno++; } } if (sigoutno < rd->rd_nsigoutlets) { loudbug_bug("riddle_validatesinks 3"); /* LATER shrink */ return (0); } return (1); }
void eobj_dsp(void *x, t_signal **sp) { int i; short* count; t_int* temp; t_float **tempout, *tempreal; t_linetraverser t; t_outconnect *oc; t_eclass* c = eobj_getclass(x); t_edsp* dsp = eobj_getdsp(x); int nouts = obj_nsigoutlets((t_object *)x); int nins = obj_nsiginlets((t_object *)x); int samplesize; if(c && c->c_widget.w_dsp && dsp && (nins || nouts) && sp && sp[0]) { samplesize = sp[0]->s_n; dsp->d_perform_method = NULL; if(dsp->d_misc == E_NO_INPLACE) { if(dsp->d_sigs_out) { tempout = (t_float **)realloc(dsp->d_sigs_out, (size_t)nouts * sizeof(t_float *)); } else { tempout = (t_float **)malloc((size_t)nouts * sizeof(t_float *)); } if(!tempout) { if(dsp->d_sigs_out) { free(dsp->d_sigs_out); dsp->d_sigs_out = NULL; } pd_error(dsp, "can't allocate memory for ni inpace processing."); return; } dsp->d_sigs_out = tempout; if(dsp->d_sigs_real) { tempreal = (t_float *)realloc(dsp->d_sigs_real, (size_t)(nouts * samplesize) * sizeof(t_float)); } else { tempreal = (t_float *)malloc((size_t)(nouts * samplesize) * sizeof(t_float)); } if(!tempreal) { if(dsp->d_sigs_real) { free(dsp->d_sigs_real); dsp->d_sigs_real = NULL; } free(dsp->d_sigs_out); dsp->d_sigs_out = NULL; pd_error(dsp, "can't allocate memory for ni inpace processing."); return; } dsp->d_sigs_real = tempreal; for(i = 0; i < nouts; i++) { dsp->d_sigs_out[i] = dsp->d_sigs_real+i*samplesize; } } if(dsp->d_vectors) { temp = (t_int *)realloc(dsp->d_vectors, (size_t)(nins + nouts + 7) * sizeof(t_int)); } else { temp = (t_int *)malloc((size_t)(nins + nouts + 7) * sizeof(t_int)); } if(!temp) { if(dsp->d_vectors) { free(dsp->d_vectors); dsp->d_vectors = NULL; } free(dsp->d_sigs_real); dsp->d_sigs_real = NULL; free(dsp->d_sigs_out); dsp->d_sigs_out = NULL; dsp->d_size = 0; pd_error(x, "can't allocate memory for dsp vector."); return; } dsp->d_vectors = temp; dsp->d_size = nins + nouts + 7; count = (short*)malloc((size_t)(nins + nouts) * sizeof(short)); if(count) { for(i = 0; i < (nins + nouts); i++) { count[i] = 0; } linetraverser_start(&t, eobj_getcanvas(x)); while((oc = linetraverser_next(&t))) { if(t.tr_ob2 == x && obj_issignaloutlet(t.tr_ob, t.tr_outno)) { count[t.tr_inno] = 1; } } dsp->d_vectors[0] = (t_int)x; dsp->d_vectors[1] = (t_int)dsp; dsp->d_vectors[2] = (t_int)sp[0]->s_n; dsp->d_vectors[3] = (t_int)dsp->d_flags; dsp->d_vectors[4] = (t_int)dsp->d_user_param; dsp->d_vectors[5] = (t_int)nins; dsp->d_vectors[6] = (t_int)nouts; for(i = 7; i < dsp->d_size; i++) { if(sp[i - 7] && sp[i - 7]->s_vec) { dsp->d_vectors[i] = (t_int)(sp[i - 7]->s_vec); } else { free(count); free(dsp->d_vectors); dsp->d_vectors = NULL; free(dsp->d_sigs_real); dsp->d_sigs_real = NULL; free(dsp->d_sigs_out); dsp->d_sigs_out = NULL; dsp->d_size = 0; pd_error(x, "one of the signal isn't allocated."); return; } } c->c_widget.w_dsp(x, x, count, sp[0]->s_sr, sp[0]->s_n, 0); if(dsp->d_perform_method != NULL && dsp->d_misc == E_INPLACE) { dsp_addv(eobj_perform_inplace, (int)dsp->d_size, dsp->d_vectors); } else if(dsp->d_perform_method != NULL && dsp->d_misc == E_NO_INPLACE) { dsp_addv(eobj_perform_noinplace, (int)dsp->d_size, dsp->d_vectors); } free(count); return; } else { free(dsp->d_vectors); dsp->d_vectors = NULL; free(dsp->d_sigs_real); dsp->d_sigs_real = NULL; free(dsp->d_sigs_out); dsp->d_sigs_out = NULL; dsp->d_size = 0; pd_error(x, "can't allocate memory for dsp chain counter."); } } }