| @@ -271,15 +271,28 @@ Module::Port::change_osc_path ( char *path ) | |||||
| if ( NULL == _scaled_signal ) | if ( NULL == _scaled_signal ) | ||||
| { | { | ||||
| _scaled_signal = | |||||
| mixer->osc_endpoint->add_signal( scaled_path, | |||||
| OSC::Signal::Input, &Module::Port::osc_control_change_cv, this ); | |||||
| _scaled_signal->signal_connection_state_changed.connect( sigc::mem_fun( this, &Module::Port::handle_signal_connection_state_changed ) ); | |||||
| _unscaled_signal = | |||||
| mixer->osc_endpoint->add_signal( unscaled_path, | |||||
| OSC::Signal::Input, &Module::Port::osc_control_change_exact, this ); | |||||
| float scaled_default = 0.5f; | |||||
| if ( hints.ranged ) | |||||
| { | |||||
| float scale = hints.maximum - hints.minimum; | |||||
| float offset = hints.minimum; | |||||
| scaled_default = ( hints.default_value - offset ) / scale; | |||||
| } | |||||
| _scaled_signal = mixer->osc_endpoint->add_signal( scaled_path, | |||||
| OSC::Signal::Input, | |||||
| 0.0, 1.0, scaled_default, | |||||
| &Module::Port::osc_control_change_cv, this ); | |||||
| _scaled_signal->signal_connection_state_changed.connect( | |||||
| sigc::mem_fun( this, &Module::Port::handle_signal_connection_state_changed ) ); | |||||
| _unscaled_signal = mixer->osc_endpoint->add_signal( unscaled_path, | |||||
| OSC::Signal::Input, | |||||
| hints.minimum, hints.maximum, hints.default_value, | |||||
| &Module::Port::osc_control_change_exact, this ); | |||||
| } | } | ||||
| else | else | ||||
| { | { | ||||
| @@ -287,36 +300,11 @@ Module::Port::change_osc_path ( char *path ) | |||||
| _scaled_signal->rename( scaled_path ); | _scaled_signal->rename( scaled_path ); | ||||
| _unscaled_signal->rename( unscaled_path ); | _unscaled_signal->rename( unscaled_path ); | ||||
| return; | |||||
| } | } | ||||
| free( unscaled_path ); | free( unscaled_path ); | ||||
| /* this was path, it's ok to free because it was malloc()'d in generate_osc_path */ | |||||
| free( scaled_path ); | free( scaled_path ); | ||||
| if ( hints.ranged ) | |||||
| { | |||||
| _unscaled_signal->parameter_limits( | |||||
| hints.minimum, | |||||
| hints.maximum, | |||||
| hints.default_value ); | |||||
| } | |||||
| float scaled_default = 0.5f; | |||||
| if ( hints.ranged ) | |||||
| { | |||||
| float scale = hints.maximum - hints.minimum; | |||||
| float offset = hints.minimum; | |||||
| scaled_default = ( hints.default_value - offset ) / scale; | |||||
| } | |||||
| _scaled_signal->parameter_limits( | |||||
| 0.0f, | |||||
| 1.0f, | |||||
| scaled_default ); | |||||
| } | } | ||||
| } | } | ||||
| @@ -72,7 +72,6 @@ namespace OSC | |||||
| { | { | ||||
| DMESSAGE( "Renaming signal %s to %s", this->path(), path ); | DMESSAGE( "Renaming signal %s to %s", this->path(), path ); | ||||
| free( _path ); | free( _path ); | ||||
| _path = strdup( path ); | _path = strdup( path ); | ||||
| @@ -417,9 +416,6 @@ namespace OSC | |||||
| { | { | ||||
| Endpoint *ep = (Endpoint*)user_data; | Endpoint *ep = (Endpoint*)user_data; | ||||
| if ( ! argc ) | |||||
| return -1; | |||||
| Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) ); | Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) ); | ||||
| if ( ! p ) | if ( ! p ) | ||||
| @@ -428,20 +424,28 @@ namespace OSC | |||||
| return 0; | return 0; | ||||
| } | } | ||||
| DMESSAGE( "Peer %s has created signal %s", p->name, &argv[0]->s ); | |||||
| const char *name = &argv[0]->s; | |||||
| const char *direction = &argv[1]->s; | |||||
| const int id = argv[2]->i; | |||||
| const float min = argv[3]->f; | |||||
| const float max = argv[4]->f; | |||||
| const float default_value = argv[5]->f; | |||||
| DMESSAGE( "Peer %s has created signal %s with id %i (%s %f %f %f)", p->name, | |||||
| name, id, direction, min, max, default_value ); | |||||
| int dir = 0; | |||||
| Signal::Direction dir = Signal::Input; | |||||
| if ( !strcmp( &argv[1]->s, "in" ) ) | |||||
| if ( !strcmp( direction, "in" ) ) | |||||
| dir = Signal::Input; | dir = Signal::Input; | ||||
| else if ( !strcmp( &argv[1]->s, "out" ) ) | |||||
| else if ( !strcmp( direction, "out" ) ) | |||||
| dir = Signal::Output; | dir = Signal::Output; | ||||
| Signal *s = new Signal( &argv[0]->s, (Signal::Direction)dir ); | |||||
| Signal *s = new Signal( name, dir ); | |||||
| s->_peer = p; | s->_peer = p; | ||||
| s->_id = argv[2]->i; | |||||
| s->parameter_limits( argv[3]->f, argv[4]->f, argv[5]->f ); | |||||
| s->_id = id; | |||||
| s->parameter_limits( min, max, default_value ); | |||||
| p->_signals.push_back( s ); | p->_signals.push_back( s ); | ||||
| @@ -650,7 +654,7 @@ namespace OSC | |||||
| void | void | ||||
| Endpoint::list_peers ( void (*callback) (const char *, const OSC::Signal *, void * ), void *v ) | |||||
| Endpoint::list_peer_signals ( void (*callback) (const char *, const OSC::Signal *, void * ), void *v ) | |||||
| { | { | ||||
| for ( std::list<Peer*>::iterator i = _peers.begin(); | for ( std::list<Peer*>::iterator i = _peers.begin(); | ||||
| i != _peers.end(); | i != _peers.end(); | ||||
| @@ -916,7 +920,7 @@ namespace OSC | |||||
| } | } | ||||
| Signal * | Signal * | ||||
| Endpoint::add_signal ( const char *path, Signal::Direction dir, signal_handler handler, void *user_data ) | |||||
| Endpoint::add_signal ( const char *path, Signal::Direction dir, float min, float max, float default_value, signal_handler handler, void *user_data ) | |||||
| { | { | ||||
| Signal *o = new Signal( path, dir ); | Signal *o = new Signal( path, dir ); | ||||
| @@ -934,6 +938,9 @@ namespace OSC | |||||
| lo_server_add_method( _server, path, NULL, osc_sig_handler, o ); | lo_server_add_method( _server, path, NULL, osc_sig_handler, o ); | ||||
| } | } | ||||
| o->parameter_limits( min, max, default_value ); | |||||
| /* tell our peers about it */ | /* tell our peers about it */ | ||||
| for ( std::list<Peer*>::iterator i = _peers.begin(); | for ( std::list<Peer*>::iterator i = _peers.begin(); | ||||
| i != _peers.end(); | i != _peers.end(); | ||||
| @@ -944,9 +951,9 @@ namespace OSC | |||||
| o->path(), | o->path(), | ||||
| o->_direction == Signal::Input ? "in" : "out", | o->_direction == Signal::Input ? "in" : "out", | ||||
| o->id(), | o->id(), | ||||
| o->parameter_limits().min, | |||||
| o->parameter_limits().max, | |||||
| o->parameter_limits().default_value | |||||
| min, | |||||
| max, | |||||
| default_value | |||||
| ); | ); | ||||
| } | } | ||||
| @@ -181,14 +181,14 @@ namespace OSC | |||||
| static Signal *get_peer_signal_by_id ( Peer *p, int signal_id ); | static Signal *get_peer_signal_by_id ( Peer *p, int signal_id ); | ||||
| int noutput_connections() { return _outgoing.size(); } | int noutput_connections() { return _outgoing.size(); } | ||||
| bool connected ( void ) { return _outgoing.size() + _incoming.size(); } | |||||
| bool connected ( void ) const { return _outgoing.size() + _incoming.size(); } | |||||
| char * get_output_connection_peer_name_and_path ( int n ); | char * get_output_connection_peer_name_and_path ( int n ); | ||||
| int id ( void ) const { return _id; } | int id ( void ) const { return _id; } | ||||
| Direction direction ( void ) { return _direction; } | |||||
| Direction direction ( void ) const { return _direction; } | |||||
| void parameter_limits ( float min, float max, float default_value ) | void parameter_limits ( float min, float max, float default_value ) | ||||
| { | { | ||||
| @@ -280,7 +280,7 @@ namespace OSC | |||||
| public: | public: | ||||
| void list_peers ( void (*callback) (const char *, const OSC::Signal *, void * ), void *v ); | |||||
| void list_peer_signals ( void (*callback) (const char *, const OSC::Signal *, void * ), void *v ); | |||||
| int init ( int proto, const char *port = 0 ); | int init ( int proto, const char *port = 0 ); | ||||
| Endpoint ( ); | Endpoint ( ); | ||||
| @@ -298,7 +298,7 @@ namespace OSC | |||||
| bool connect_signal ( OSC::Signal *s, const char *peer_and_path ); | bool connect_signal ( OSC::Signal *s, const char *peer_and_path ); | ||||
| Signal *add_signal ( const char *path, Signal::Direction dir, signal_handler handler, void *user_data ); | |||||
| Signal * add_signal ( const char *path, Signal::Direction dir, float min, float max, float default_value, signal_handler handler, void *user_data ); | |||||
| Method *add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description ); | Method *add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description ); | ||||
| void del_method ( const char *path, const char *typespec ); | void del_method ( const char *path, const char *typespec ); | ||||
| void del_method ( Method* method ); | void del_method ( Method* method ); | ||||
| @@ -235,7 +235,7 @@ Control_Sequence::mode ( Mode m ) | |||||
| char *path; | char *path; | ||||
| asprintf( &path, "/track/%s/control/%i", track()->name(), track()->ncontrols() ); | asprintf( &path, "/track/%s/control/%i", track()->name(), track()->ncontrols() ); | ||||
| _osc_output = timeline->osc->add_signal( path, OSC::Signal::Output, NULL, NULL ); | |||||
| _osc_output = timeline->osc->add_signal( path, OSC::Signal::Output, 0, 1, 0, NULL, NULL ); | |||||
| free( path ); | free( path ); | ||||
| @@ -531,6 +531,10 @@ Control_Sequence::peer_callback( const char *name, const OSC::Signal *sig ) | |||||
| { | { | ||||
| char *s; | char *s; | ||||
| /* only show inputs */ | |||||
| if ( sig->direction() != OSC::Signal::Input ) | |||||
| return; | |||||
| /* only list CV signals for now */ | /* only list CV signals for now */ | ||||
| if ( ! ( sig->parameter_limits().min == 0.0 && | if ( ! ( sig->parameter_limits().min == 0.0 && | ||||
| sig->parameter_limits().max == 1.0 ) ) | sig->parameter_limits().max == 1.0 ) ) | ||||
| @@ -553,7 +557,7 @@ Control_Sequence::add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix | |||||
| peer_menu = m; | peer_menu = m; | ||||
| peer_prefix = prefix; | peer_prefix = prefix; | ||||
| timeline->osc->list_peers( &Control_Sequence::peer_callback, this ); | |||||
| timeline->osc->list_peer_signals( &Control_Sequence::peer_callback, this ); | |||||
| } | } | ||||
| int | int | ||||