@@ -271,15 +271,28 @@ Module::Port::change_osc_path ( char *path ) | |||
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 | |||
{ | |||
@@ -287,36 +300,11 @@ Module::Port::change_osc_path ( char *path ) | |||
_scaled_signal->rename( scaled_path ); | |||
_unscaled_signal->rename( unscaled_path ); | |||
return; | |||
} | |||
free( unscaled_path ); | |||
/* this was path, it's ok to free because it was malloc()'d in generate_osc_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 ); | |||
free( _path ); | |||
_path = strdup( path ); | |||
@@ -417,9 +416,6 @@ namespace OSC | |||
{ | |||
Endpoint *ep = (Endpoint*)user_data; | |||
if ( ! argc ) | |||
return -1; | |||
Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) ); | |||
if ( ! p ) | |||
@@ -428,20 +424,28 @@ namespace OSC | |||
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; | |||
else if ( !strcmp( &argv[1]->s, "out" ) ) | |||
else if ( !strcmp( direction, "out" ) ) | |||
dir = Signal::Output; | |||
Signal *s = new Signal( &argv[0]->s, (Signal::Direction)dir ); | |||
Signal *s = new Signal( name, dir ); | |||
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 ); | |||
@@ -650,7 +654,7 @@ namespace OSC | |||
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(); | |||
i != _peers.end(); | |||
@@ -916,7 +920,7 @@ namespace OSC | |||
} | |||
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 ); | |||
@@ -934,6 +938,9 @@ namespace OSC | |||
lo_server_add_method( _server, path, NULL, osc_sig_handler, o ); | |||
} | |||
o->parameter_limits( min, max, default_value ); | |||
/* tell our peers about it */ | |||
for ( std::list<Peer*>::iterator i = _peers.begin(); | |||
i != _peers.end(); | |||
@@ -944,9 +951,9 @@ namespace OSC | |||
o->path(), | |||
o->_direction == Signal::Input ? "in" : "out", | |||
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 ); | |||
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 ); | |||
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 ) | |||
{ | |||
@@ -280,7 +280,7 @@ namespace OSC | |||
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 ); | |||
Endpoint ( ); | |||
@@ -298,7 +298,7 @@ namespace OSC | |||
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 ); | |||
void del_method ( const char *path, const char *typespec ); | |||
void del_method ( Method* method ); | |||
@@ -235,7 +235,7 @@ Control_Sequence::mode ( Mode m ) | |||
char *path; | |||
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 ); | |||
@@ -531,6 +531,10 @@ Control_Sequence::peer_callback( const char *name, const OSC::Signal *sig ) | |||
{ | |||
char *s; | |||
/* only show inputs */ | |||
if ( sig->direction() != OSC::Signal::Input ) | |||
return; | |||
/* only list CV signals for now */ | |||
if ( ! ( sig->parameter_limits().min == 0.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_prefix = prefix; | |||
timeline->osc->list_peers( &Control_Sequence::peer_callback, this ); | |||
timeline->osc->list_peer_signals( &Control_Sequence::peer_callback, this ); | |||
} | |||
int | |||