Exemplo n.º 1
0
/* 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);
}
Exemplo n.º 2
0
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.");
        }
    }
}