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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}
Esempio n. 5
0
/* 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;
}
Esempio n. 6
0
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;
}