t_max_err mode_set(t_hoa_3d_decoder *x, t_object *attr, long argc, t_atom *argv) { if(argc && argv && atom_gettype(argv) == A_SYM) { t_symbol* mode = atom_getsym(argv); if(mode == hoa_sym_ambisonic) // retro-compatibility { mode = hoa_sym_regular; } if (mode != x->f_mode) { if(mode == hoa_sym_regular) { object_method(hoa_sym_dsp->s_thing, hoa_sym_stop); ulong order = x->f_decoder->getDecompositionOrder(); x->f_decoder = SharedPtr<Decoder<Hoa3d, float>>(new Decoder<Hoa3d, float>::Regular(order, (order+1)*(order+1))); x->f_mode = mode; object_attr_setdisabled((t_object *)x, hoa_sym_angles, 0); object_attr_setdisabled((t_object *)x, hoa_sym_offset, 0); object_attr_setdisabled((t_object *)x, hoa_sym_channels, 0); object_attr_setdouble_array(x, hoa_sym_offset, 3, x->f_offsets); x->f_number_of_channels = x->f_decoder->getNumberOfPlanewaves(); object_attr_touch((t_object *)x, hoa_sym_channels); object_attr_touch((t_object *)x, hoa_sym_angles); hoa_3d_decoder_resize_outlets(x); } else if(mode == hoa_sym_binaural) { object_method(hoa_sym_dsp->s_thing, hoa_sym_stop); ulong order = x->f_decoder->getDecompositionOrder(); x->f_decoder = SharedPtr<Decoder<Hoa3d, float>>(new Decoder<Hoa3d, float>::Binaural(order)); x->f_mode = mode; object_attr_setdisabled((t_object *)x, hoa_sym_angles, 1); object_attr_setdisabled((t_object *)x, hoa_sym_offset, 1); object_attr_setdisabled((t_object *)x, hoa_sym_channels, 1); x->f_mode = mode; x->f_number_of_channels = 2; object_attr_touch((t_object *)x, hoa_sym_channels); object_attr_touch((t_object *)x, hoa_sym_angles); hoa_3d_decoder_resize_outlets(x); } } } return MAX_ERR_NONE; }
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; }
void data_list(TTPtr self, t_symbol *msg, long argc, t_atom *argv) { WrappedModularInstancePtr x = (WrappedModularInstancePtr)self; jamoma_data_command(x->wrappedObject, msg, argc, argv); // to warn attr ui for example object_attr_touch((t_object*)x, _sym_value); }
t_max_err channel_set(t_hoa_3d_decoder *x, t_object *attr, long argc, t_atom *argv) { if(argc && argv && atom_isNumber(argv)) { if (x->f_mode == hoa_sym_regular) { object_method(hoa_sym_dsp->s_thing, hoa_sym_stop); long channels = Math<long>::clip(atom_getlong(argv), 4, HOA_MAX_PLANEWAVES); ulong order = x->f_decoder->getDecompositionOrder(); x->f_decoder = SharedPtr<Decoder<Hoa3d, float>>(new Decoder<Hoa3d, float>::Regular(order, channels)); x->f_number_of_angles = x->f_decoder->getNumberOfPlanewaves() * 2; } x->f_number_of_channels = x->f_decoder->getNumberOfPlanewaves(); object_attr_touch((t_object *)x, hoa_sym_angles); hoa_3d_decoder_resize_outlets(x); } return MAX_ERR_NONE; }
/* 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 channel_set(t_hoa_decoder *x, t_object *attr, long argc, t_atom *argv) { t_object *b = NULL; if(argc && argv && atom_gettype(argv) == A_LONG && atom_getlong(argv) != x->f_decoder->getNumberOfChannels()) { if(x->f_decoder->getDecodingMode() != Hoa2D::DecoderMulti::Regular || atom_getlong(argv) >= x->f_decoder->getNumberOfHarmonics()) { object_method(gensym("dsp")->s_thing, gensym("stop")); object_obex_lookup(x, gensym("#B"), (t_object **)&b); object_method(b, gensym("dynlet_begin")); long last_number_of_channels = x->f_decoder->getNumberOfChannels(); x->f_decoder->setNumberOfChannels(atom_getlong(argv)); if(last_number_of_channels > x->f_decoder->getNumberOfChannels()) { for(int i = last_number_of_channels; i > x->f_decoder->getNumberOfChannels(); i--) { outlet_delete(outlet_nth((t_object*)x, i-1)); } } else if(last_number_of_channels < x->f_decoder->getNumberOfChannels()) { for(int i = last_number_of_channels; i < x->f_decoder->getNumberOfChannels(); i++) { outlet_append((t_object*)x, NULL, gensym("signal")); } } object_method(b, gensym("dynlet_end")); object_attr_touch((t_object *)x, gensym("angles")); } } send_configuration(x); return 0; }