t_pd_err channels_set(t_hoa_meter *x, void *attr, long argc, t_atom *argv)
{
    t_atom* av;
    if(argc && argv)
    {
        if(atom_gettype(argv) == A_FLOAT)
        {
            long d = pd_clip_minmax(atom_getfloat(argv), 1, MAX_SPEAKER);
            if(d != x->f_meter->getNumberOfChannels())
            {
                int dspState = canvas_suspend_dsp();
                delete x->f_meter;
                x->f_meter = new Meter(d);
                delete x->f_vector;
                x->f_vector = new Vector(d);
                
                av = new t_atom[x->f_meter->getNumberOfChannels()];
                for(int i = 0; i < x->f_meter->getNumberOfChannels(); i++)
                {
                    atom_setfloat(av+i, x->f_meter->getChannelAzimuth(i) / HOA_2PI * 360.);
                    x->f_over_leds[i] = 0;
                }
                angles_set(x, NULL, x->f_meter->getNumberOfChannels(), av);
                
                eobj_resize_inputs((t_ebox *)x, x->f_meter->getNumberOfChannels());
                
                canvas_resume_dsp(dspState);
            }
        }
    }
    return NULL;
}
t_pd_err set_order(t_hoa_scope *x, t_object *attr, long ac, t_atom *av)
{
    long order;
    if (ac && av && atom_gettype(av) == A_LONG)
    {
        order = atom_getlong(av);
        if(order != x->f_scope->getDecompositionOrder() && order > 0)
        {
            int dspState = canvas_suspend_dsp();

            delete x->f_scope;
            delete [] x->f_signals;
            x->f_scope      = new Hoa2D::Scope(order, NUMBEROFCIRCLEPOINTS_UI);
            x->f_order      = x->f_scope->getDecompositionOrder();
            x->f_signals    = new t_float[x->f_scope->getNumberOfHarmonics() * SYS_MAXBLKSIZE];

            eobj_resize_inputs((t_ebox *)x, x->f_scope->getNumberOfHarmonics());
            canvas_update_dsp();
            canvas_resume_dsp(dspState);
        }
    }

    return 0;
}