t_max_err hoa_meter_attr_set_loudspeakers(t_hoa_meter *x, t_object *attr, long ac, t_atom *av) { long d; t_object *b = NULL; if (ac && av) { if(atom_gettype(av) == A_LONG) { d = Hoa3D::clip_min(long(atom_getlong(av)), long(1)); if (d != x->f_number_of_loudspeakers) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); delete x->f_meter; delete [] x->f_signals; x->f_meter = new Hoa3D::Meter(x->f_number_of_loudspeakers, 100, 199); x->f_number_of_loudspeakers = x->f_meter->getNumberOfLoudspeakers(); x->f_signals = new double[x->f_meter->getNumberOfLoudspeakers() * SYS_MAXBLKSIZE]; object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, gensym("dynlet_begin")); dsp_resize((t_pxobject*)x, x->f_meter->getNumberOfLoudspeakers()); object_method(b, gensym("dynlet_end")); if(dspState) object_method(gensym("dsp")->s_thing, gensym("start")); } } } return MAX_ERR_NONE; }
t_max_err scope_setattr_order(t_scope *x, t_object *attr, long ac, t_atom *av) { long d; if (ac && av) { if (atom_gettype(av) == A_LONG) { d = Tools::clip_min( long(atom_getlong(av)), long(1)); if (d != x->f_order) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); free(x->f_harmonicsValues); free(x->f_averageHarmo); delete x->f_viewer; x->f_viewer = new AmbisonicsViewer(d); x->f_order = x->f_viewer->getOrder(); x->f_harmonicsValues = new double[x->f_order * 2 + 1]; x->f_averageHarmo = new double[x->f_order * 2 + 1]; scope_resize_inputs(x, x->f_order * 2 + 1); if(dspState) object_method(gensym("dsp")->s_thing, gensym("start")); } } } return MAX_ERR_NONE; }
t_max_err set_order(t_hoa_scope *x, t_object *attr, long ac, t_atom *av) { long order; t_object *b = NULL; if (ac && av && atom_gettype(av) == A_LONG) { order = atom_getlong(av); if(order != x->f_scope->getOrder() && order > 0) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, hoa_sym_start); delete x->f_scope; delete [] x->f_signals; x->f_scope = new Hoa2D::Scope(order, NUMBEROFCIRCLEPOINTS_UI); x->f_order = x->f_scope->getOrder(); x->f_signals = new double[x->f_scope->getNumberOfHarmonics() * SYS_MAXBLKSIZE]; object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, hoa_sym_dynlet_begin); dsp_resize((t_pxobject*)x, x->f_scope->getNumberOfHarmonics()); object_method(b, hoa_sym_dynlet_end); if(dspState) object_method(gensym("dsp")->s_thing, hoa_sym_stop); } } return MAX_ERR_NONE; }
void HoaDecode_resize_outlet(t_HoaDecode *x, long lastNumberOfOutlet) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); t_object *b = NULL; object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, gensym("dynlet_begin")); if(lastNumberOfOutlet > x->f_AmbisonicsDecoder->getNumberOfOutputs()) { for(int i = lastNumberOfOutlet; i > x->f_AmbisonicsDecoder->getNumberOfOutputs(); i--) { outlet_delete(outlet_nth((t_object*)x, i-1)); } } else if(lastNumberOfOutlet < x->f_AmbisonicsDecoder->getNumberOfOutputs()) { for(int i = lastNumberOfOutlet; i < x->f_AmbisonicsDecoder->getNumberOfOutputs(); i++) { outlet_append((t_object*)x, NULL, gensym("signal")); } } object_method(b, gensym("dynlet_end")); if(x->f_send_config) { HoaDecode_send_configuration(x); HoaDecode_send_angles(x); HoaDecode_reconnect_outlet(x); } }
t_max_err configuration_set(t_HoaDecode *x, t_object *attr, long argc, t_atom *argv) { if(atom_gettype(argv) == A_SYM) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); long numOutlet = x->f_AmbisonicsDecoder->getNumberOfOutputs(); if(atom_getsym(argv) == gensym("binaural") || atom_getsym(argv) == gensym(" binaural")) { x->f_AmbisonicsDecoder->setMode(Hoa_Dec_Binaural); x->f_mode = gensym("binaural"); object_attr_setdisabled((t_object *)x, gensym("angles"), 1); object_attr_setdisabled((t_object *)x, gensym("pinnaesize"), 0); object_attr_setdisabled((t_object *)x, gensym("loudspeakers"), 1); object_attr_setdisabled((t_object *)x, gensym("restitution"), 1); } else if(atom_getsym(argv) == gensym("irregular") || atom_getsym(argv) == gensym(" irregular")) { x->f_AmbisonicsDecoder->setMode(Hoa_Dec_Irregular); x->f_mode = gensym("irregular"); object_attr_setdisabled((t_object *)x, gensym("angles"), 0); object_attr_setdisabled((t_object *)x, gensym("pinnaesize"), 1); object_attr_setdisabled((t_object *)x, gensym("loudspeakers"), 0); object_attr_setdisabled((t_object *)x, gensym("restitution"), 0); } else { x->f_AmbisonicsDecoder->setMode(Hoa_Dec_Ambisonic); x->f_mode = gensym("ambisonic"); object_attr_setdisabled((t_object *)x, gensym("angles"), 1); object_attr_setdisabled((t_object *)x, gensym("pinnaesize"), 1); object_attr_setdisabled((t_object *)x, gensym("loudspeakers"), 0); object_attr_setdisabled((t_object *)x, gensym("restitution"), 1); } HoaDecode_resize_outlet(x, numOutlet); x->f_number_of_loudspeakers = x->f_AmbisonicsDecoder->getNumberOfOutputs(); for(int i = 0; i < x->f_number_of_loudspeakers; i++) x->f_angles_of_loudspeakers[i] = x->f_AmbisonicsDecoder->getLoudspeakerAngle(i); object_attr_touch((t_object *)x, gensym("loudspeakers")); object_attr_touch((t_object *)x, gensym("angles")); } return NULL; }
t_max_err number_of_channels_set(t_meter *x, t_object *attr, long argc, t_atom *argv) { t_object *b = NULL; int numberOfChannels; if(argc && argv && atom_gettype(argv) == A_LONG) { numberOfChannels = atom_getlong(argv); if(numberOfChannels != x->f_meter->getNumberOfChannels() && numberOfChannels > 0 && numberOfChannels <= MAX_SPEAKER) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); delete x->f_meter; delete x->f_vector; x->f_number_of_channels = numberOfChannels; x->f_meter = new Hoa2D::Meter(x->f_number_of_channels); x->f_vector = new Hoa2D::Vector(x->f_number_of_channels); object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, gensym("dynlet_begin")); dsp_resize((t_pxobject*)x, x->f_number_of_channels); object_method(b, gensym("dynlet_end")); if (x->f_number_of_channels == 1) { object_attr_setdisabled((t_object*)x, gensym("angles"), 1); object_attr_setdisabled((t_object*)x, gensym("offset"), 1); object_attr_setdisabled((t_object*)x, gensym("rotation"), 1); } else { object_attr_setdisabled((t_object*)x, gensym("angles"), 0); object_attr_setdisabled((t_object*)x, gensym("offset"), 0); object_attr_setdisabled((t_object*)x, gensym("rotation"), 0); } object_attr_setvalueof(x, gensym("angles"), 0, NULL); } } return NULL; }
/* Ambisonics */ t_max_err loudspeakers_set(t_HoaDecode *x, t_object *attr, long argc, t_atom *argv) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); long numOutlet = x->f_AmbisonicsDecoder->getNumberOfOutputs(); if(argc && argv && (atom_gettype(argv) == A_FLOAT || atom_gettype(argv) == A_LONG)) { x->f_AmbisonicsDecoder->setNumberOfLoudspeakers(atom_getfloat(argv)); } HoaDecode_resize_outlet(x, numOutlet); x->f_number_of_loudspeakers = x->f_AmbisonicsDecoder->getNumberOfOutputs(); for(int i = 0; i < x->f_number_of_loudspeakers; i++) x->f_angles_of_loudspeakers[i] = x->f_AmbisonicsDecoder->getLoudspeakerAngle(i); object_attr_touch((t_object *)x, gensym("angles")); return NULL; }
t_max_err HoaRecomposer_set_attr_mode(t_HoaRecomposer *x, t_object *attr, long argc, t_atom *argv) { long lastNumberOfInputs = x->f_ambiRecomposer->getNumberOfInputs(); if(argc && argv) { int dspState = sys_getdspobjdspstate((t_object*)x); if(dspState) object_method(gensym("dsp")->s_thing, gensym("stop")); if(atom_gettype(argv) == A_SYM) { t_symbol* newModeSym = atom_getsym(argv); int newModeInt = (newModeSym == gensym("free")) ? Hoa_Free : (newModeSym == gensym("fisheye")) ? Hoa_Fisheye : 0; x->f_ambiRecomposer->setMode(newModeInt); } else if(atom_gettype(argv) == A_LONG || atom_gettype(argv) == A_FLOAT) { x->f_ambiRecomposer->setMode(atom_getfloat(argv)); } int newModeInt = x->f_ambiRecomposer->getMode(); x->f_mode = (newModeInt == Hoa_Free) ? gensym("free") : (newModeInt == Hoa_Fisheye) ? gensym("fisheye") : gensym("fixe"); if (lastNumberOfInputs != x->f_ambiRecomposer->getNumberOfInputs()) { t_object *b = NULL; object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, gensym("dynlet_begin")); dsp_resize((t_pxobject*)x, x->f_ambiRecomposer->getNumberOfInputs()); object_method(b, gensym("dynlet_end")); } if(x->f_ambiRecomposer->getMode() == Hoa_Fixe) object_attr_setdisabled((t_object *)x, gensym("ramp"), 1); else object_attr_setdisabled((t_object *)x, gensym("ramp"), 0); } return MAX_ERR_NONE; }