| @@ -1 +1 @@ | |||||
| Subproject commit 8ee564bef320b3561e204d17c1aa054311b2ce47 | |||||
| Subproject commit fd8c8d419e8e548c8f6328f1b21783c6ca3001a5 | |||||
| @@ -514,13 +514,7 @@ Controller_Module::menu_cb ( const Fl_Menu_ *m ) | |||||
| Port *p = control_output[0].connected_port(); | Port *p = control_output[0].connected_port(); | ||||
| if ( learn_by_number ) | if ( learn_by_number ) | ||||
| { | |||||
| char *our_path = p->osc_number_path(); | |||||
| mixer->osc_endpoint->add_translation( path, our_path ); | |||||
| free(our_path); | |||||
| } | |||||
| mixer->osc_endpoint->add_translation( path, p->osc_number_path()); | |||||
| else | else | ||||
| mixer->osc_endpoint->add_translation( path, p->osc_path() ); | mixer->osc_endpoint->add_translation( path, p->osc_path() ); | ||||
| } | } | ||||
| @@ -608,7 +602,7 @@ Controller_Module::peer_callback( OSC::Signal *sig, OSC::Signal::State state, v | |||||
| else | else | ||||
| { | { | ||||
| /* building menu */ | /* building menu */ | ||||
| const char *name = sig->peer_name(); | |||||
| // const char *name = sig->peer_name(); | |||||
| assert( sig->path() ); | assert( sig->path() ); | ||||
| @@ -649,29 +643,37 @@ Controller_Module::add_osc_connections_to_menu ( Fl_Menu_Button *m, const char * | |||||
| // mixer->osc_endpoint->list_peer_signals( this ); | // mixer->osc_endpoint->list_peer_signals( this ); | ||||
| Port *p = control_output[0].connected_port(); | Port *p = control_output[0].connected_port(); | ||||
| const char ** conn = mixer->osc_endpoint->get_connections( p->osc_path() ); | |||||
| if ( conn ) | |||||
| const char *number_path = p->osc_number_path(); | |||||
| const char *name_path = p->osc_path(); | |||||
| const char *paths[] = { number_path,name_path,NULL }; | |||||
| for ( const char **cpath = paths; *cpath; cpath++ ) | |||||
| { | { | ||||
| for ( const char **s = conn; *s; s++ ) | |||||
| const char ** conn = mixer->osc_endpoint->get_connections( *cpath ); | |||||
| if ( conn ) | |||||
| { | { | ||||
| /* building menu */ | |||||
| for ( const char **s = conn; *s; s++ ) | |||||
| { | |||||
| /* building menu */ | |||||
| char *path = strdup( *s ); | |||||
| char *path = strdup( *s ); | |||||
| unescape_url( path ); | |||||
| unescape_url( path ); | |||||
| char *ns; | |||||
| asprintf( &ns, "%s/%s", peer_prefix, path ); | |||||
| char *ns; | |||||
| asprintf( &ns, "%s/%s", peer_prefix, path ); | |||||
| peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 ); | |||||
| peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 ); | |||||
| free( path ); | |||||
| free( path ); | |||||
| // free(*s); | // free(*s); | ||||
| } | |||||
| } | |||||
| free( conn ); | |||||
| free( conn ); | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -730,24 +732,11 @@ Controller_Module::handle ( int m ) | |||||
| if ( p ) | if ( p ) | ||||
| { | { | ||||
| if ( learn_by_number ) | |||||
| { | |||||
| char *path = p->osc_number_path(); | |||||
| DMESSAGE( "Will learn %s", path ); | |||||
| const char * path = learn_by_number ? p->osc_number_path() : p->osc_path(); | |||||
| mixer->osc_endpoint->learn( path ); | |||||
| free(path); | |||||
| } | |||||
| else | |||||
| { | |||||
| const char *path = p->osc_path(); | |||||
| DMESSAGE( "Will learn %s", path ); | |||||
| DMESSAGE( "Will learn %s", path ); | |||||
| mixer->osc_endpoint->learn( path ); | |||||
| } | |||||
| mixer->osc_endpoint->learn( path ); | |||||
| } | } | ||||
| return 1; | return 1; | ||||
| @@ -37,7 +37,6 @@ | |||||
| #include <FL/Fl_File_Chooser.H> | #include <FL/Fl_File_Chooser.H> | ||||
| #include <FL/Fl_Theme_Chooser.H> | #include <FL/Fl_Theme_Chooser.H> | ||||
| #include <FL/Fl_Value_SliderX.H> | #include <FL/Fl_Value_SliderX.H> | ||||
| #include "FL/Fl_Text_Edit_Window.H" | |||||
| #include "file.h" | #include "file.h" | ||||
| #include <string.h> | #include <string.h> | ||||
| @@ -261,10 +260,6 @@ void Mixer::cb_menu(Fl_Widget* o) { | |||||
| { | { | ||||
| command_add_strip(); | command_add_strip(); | ||||
| } | } | ||||
| else if ( !strcmp( picked, "&Mixer/Send Feedback" ) ) | |||||
| { | |||||
| send_feedback(); | |||||
| } | |||||
| else if ( !strcmp( picked, "&Mixer/Add &N Strips" ) ) | else if ( !strcmp( picked, "&Mixer/Add &N Strips" ) ) | ||||
| { | { | ||||
| const char *s = fl_input( "Enter number of strips to add" ); | const char *s = fl_input( "Enter number of strips to add" ); | ||||
| @@ -293,29 +288,29 @@ void Mixer::cb_menu(Fl_Widget* o) { | |||||
| { | { | ||||
| Controller_Module::learn_by_number = true; | Controller_Module::learn_by_number = true; | ||||
| } | } | ||||
| else if ( ! strcmp( picked, "&Mixer/Remote Control/Start Learning" ) ) | |||||
| else if ( ! strcmp( picked, "&Remote Control/Start Learning" ) ) | |||||
| { | { | ||||
| Controller_Module::learn_mode( true ); | Controller_Module::learn_mode( true ); | ||||
| tooltip( "Now in learn mode. Click on a highlighted control to teach it something." ); | tooltip( "Now in learn mode. Click on a highlighted control to teach it something." ); | ||||
| redraw(); | redraw(); | ||||
| } | } | ||||
| else if ( ! strcmp( picked, "&Mixer/Remote Control/Stop Learning" ) ) | |||||
| else if ( ! strcmp( picked, "&Remote Control/Stop Learning" ) ) | |||||
| { | { | ||||
| Controller_Module::learn_mode( false ); | Controller_Module::learn_mode( false ); | ||||
| tooltip( "Learning complete" ); | tooltip( "Learning complete" ); | ||||
| redraw(); | redraw(); | ||||
| } | } | ||||
| else if ( ! strcmp( picked, "&Mixer/Remote Control/Clear Mappings" ) ) | |||||
| else if ( !strcmp( picked, "&Remote Control/Send State" ) ) | |||||
| { | |||||
| send_feedback(); | |||||
| } | |||||
| else if ( ! strcmp( picked, "&Remote Control/Clear All Mappings" ) ) | |||||
| { | { | ||||
| if ( 1 == fl_ask( "This will remove all mappings, are you sure?") ) | if ( 1 == fl_ask( "This will remove all mappings, are you sure?") ) | ||||
| { | { | ||||
| command_clear_mappings(); | command_clear_mappings(); | ||||
| } | } | ||||
| } | } | ||||
| else if ( ! strcmp( picked, "&Mixer/Remote Control/Edit Mappings" ) ) | |||||
| { | |||||
| edit_translations(); | |||||
| } | |||||
| else if ( !strcmp( picked, "&Mixer/Paste" ) ) | else if ( !strcmp( picked, "&Mixer/Paste" ) ) | ||||
| { | { | ||||
| Fl::paste(*this); | Fl::paste(*this); | ||||
| @@ -496,20 +491,19 @@ Mixer::Mixer ( int X, int Y, int W, int H, const char *L ) : | |||||
| o->add( "&Project/Se&ttings/&Rows/One", '1', 0, 0, FL_MENU_RADIO | FL_MENU_VALUE ); | o->add( "&Project/Se&ttings/&Rows/One", '1', 0, 0, FL_MENU_RADIO | FL_MENU_VALUE ); | ||||
| o->add( "&Project/Se&ttings/&Rows/Two", '2', 0, 0, FL_MENU_RADIO ); | o->add( "&Project/Se&ttings/&Rows/Two", '2', 0, 0, FL_MENU_RADIO ); | ||||
| o->add( "&Project/Se&ttings/&Rows/Three", '3', 0, 0, FL_MENU_RADIO ); | o->add( "&Project/Se&ttings/&Rows/Three", '3', 0, 0, FL_MENU_RADIO ); | ||||
| o->add( "&Project/Se&ttings/Make Default", 0,0,0); | |||||
| o->add( "&Project/Se&ttings/Learn/By Strip Number", 0, 0, 0, FL_MENU_RADIO ); | o->add( "&Project/Se&ttings/Learn/By Strip Number", 0, 0, 0, FL_MENU_RADIO ); | ||||
| o->add( "&Project/Se&ttings/Learn/By Strip Name", 0, 0, 0, FL_MENU_RADIO | FL_MENU_VALUE ); | o->add( "&Project/Se&ttings/Learn/By Strip Name", 0, 0, 0, FL_MENU_RADIO | FL_MENU_VALUE ); | ||||
| o->add( "&Project/Se&ttings/Make Default", 0,0,0); | |||||
| o->add( "&Project/&Save", FL_CTRL + 's', 0, 0 ); | o->add( "&Project/&Save", FL_CTRL + 's', 0, 0 ); | ||||
| o->add( "&Project/&Quit", FL_CTRL + 'q', 0, 0 ); | o->add( "&Project/&Quit", FL_CTRL + 'q', 0, 0 ); | ||||
| o->add( "&Mixer/&Add Strip", 'a', 0, 0 ); | o->add( "&Mixer/&Add Strip", 'a', 0, 0 ); | ||||
| o->add( "&Mixer/Add &N Strips" ); | o->add( "&Mixer/Add &N Strips" ); | ||||
| o->add( "&Mixer/Send Feedback" ); | |||||
| o->add( "&Mixer/&Import Strip" ); | o->add( "&Mixer/&Import Strip" ); | ||||
| o->add( "&Mixer/Paste", FL_CTRL + 'v', 0, 0 ); | o->add( "&Mixer/Paste", FL_CTRL + 'v', 0, 0 ); | ||||
| o->add( "&Mixer/Remote Control/Start Learning", FL_F + 9, 0, 0 ); | |||||
| o->add( "&Mixer/Remote Control/Stop Learning", FL_F + 10, 0, 0 ); | |||||
| o->add( "&Mixer/Remote Control/Clear Mappings", 0, 0, 0 ); | |||||
| o->add( "&Mixer/Remote Control/Edit Mappings", 0, 0, 0 ); | |||||
| o->add( "&Remote Control/Start Learning", FL_F + 9, 0, 0 ); | |||||
| o->add( "&Remote Control/Stop Learning", FL_F + 10, 0, 0 ); | |||||
| o->add( "&Remote Control/Send State" ); | |||||
| o->add( "&Remote Control/Clear All Mappings", 0, 0, 0 ); | |||||
| o->add( "&View/&Theme", 0, 0, 0 ); | o->add( "&View/&Theme", 0, 0, 0 ); | ||||
| o->add( "&Help/&Manual" ); | o->add( "&Help/&Manual" ); | ||||
| o->add( "&Help/&About" ); | o->add( "&Help/&About" ); | ||||
| @@ -656,30 +650,6 @@ Mixer::save_translations ( void ) | |||||
| fclose( fp ); | fclose( fp ); | ||||
| } | } | ||||
| void | |||||
| Mixer::edit_translations ( void ) | |||||
| { | |||||
| char *file_contents = NULL; | |||||
| if ( exists( "mappings" ) ) | |||||
| { | |||||
| size_t l = ::size( "mappings" ); | |||||
| file_contents = (char*)malloc( l ); | |||||
| FILE *fp = fopen( "mappings", "r" ); | |||||
| fread( file_contents, l, 1, fp ); | |||||
| fclose( fp ); | |||||
| } | |||||
| char *s = fl_text_edit( "Mappings", "&Save", file_contents, 800, 600 ); | |||||
| if ( file_contents ) | |||||
| free(file_contents); | |||||
| } | |||||
| int | int | ||||
| Mixer::init_osc ( const char *osc_port ) | Mixer::init_osc ( const char *osc_port ) | ||||
| { | { | ||||
| @@ -226,11 +226,17 @@ Module::paste_before ( void ) | |||||
| char * | |||||
| const char * | |||||
| Module::Port::osc_number_path ( void ) | Module::Port::osc_number_path ( void ) | ||||
| { | { | ||||
| int n = _module->chain()->strip()->number(); | int n = _module->chain()->strip()->number(); | ||||
| if ( _by_number_path && n == _by_number_number ) | |||||
| return _by_number_path; | |||||
| if ( _by_number_path ) | |||||
| free( _by_number_path ); | |||||
| char *rem; | char *rem; | ||||
| char *client_name; | char *client_name; | ||||
| char *strip_name; | char *strip_name; | ||||
| @@ -245,6 +251,9 @@ Module::Port::osc_number_path ( void ) | |||||
| free( client_name ); | free( client_name ); | ||||
| free( rem ); | free( rem ); | ||||
| _by_number_path = path; | |||||
| _by_number_number = n; | |||||
| return path; | return path; | ||||
| } | } | ||||
| @@ -274,15 +283,9 @@ Module::Port::send_feedback ( void ) | |||||
| /* send feedback for by_name signal */ | /* send feedback for by_name signal */ | ||||
| mixer->osc_endpoint->send_feedback( _scaled_signal->path(), f ); | mixer->osc_endpoint->send_feedback( _scaled_signal->path(), f ); | ||||
| /* send feedback for by number signal */ | |||||
| { | |||||
| char *path = osc_number_path(); | |||||
| mixer->osc_endpoint->send_feedback( path, f ); | |||||
| free(path); | |||||
| } | |||||
| } | |||||
| /* send feedback for by number signal */ | |||||
| mixer->osc_endpoint->send_feedback( osc_number_path(), f ); | |||||
| } | |||||
| } | } | ||||
| void | void | ||||
| @@ -138,6 +138,8 @@ public: | |||||
| _module = module; | _module = module; | ||||
| _scaled_signal = 0; | _scaled_signal = 0; | ||||
| _unscaled_signal = 0; | _unscaled_signal = 0; | ||||
| _by_number_path = 0; | |||||
| _by_number_number = -1; | |||||
| } | } | ||||
| Port ( const Port& p ) | Port ( const Port& p ) | ||||
| @@ -152,10 +154,16 @@ public: | |||||
| hints = p.hints; | hints = p.hints; | ||||
| _scaled_signal = p._scaled_signal; | _scaled_signal = p._scaled_signal; | ||||
| _unscaled_signal = p._unscaled_signal; | _unscaled_signal = p._unscaled_signal; | ||||
| _by_number_path = 0; | |||||
| _by_number_number = -1; | |||||
| } | } | ||||
| virtual ~Port ( ) | virtual ~Port ( ) | ||||
| { | { | ||||
| if ( _by_number_path ) | |||||
| free( _by_number_path ); | |||||
| _by_number_path = NULL; | |||||
| // change_osc_path( NULL ); | // change_osc_path( NULL ); | ||||
| // disconnect(); | // disconnect(); | ||||
| } | } | ||||
| @@ -172,6 +180,9 @@ public: | |||||
| OSC::Signal *scaled_signal ( void ) { return _scaled_signal; } | OSC::Signal *scaled_signal ( void ) { return _scaled_signal; } | ||||
| int _by_number_number; | |||||
| char *_by_number_path; | |||||
| const char *osc_path ( ) | const char *osc_path ( ) | ||||
| { | { | ||||
| if ( _scaled_signal ) | if ( _scaled_signal ) | ||||
| @@ -180,7 +191,7 @@ public: | |||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| char *osc_number_path ( void ); | |||||
| const char *osc_number_path ( void ); | |||||
| void update_osc_port ( ) | void update_osc_port ( ) | ||||
| { | { | ||||
| @@ -44,6 +44,8 @@ using namespace MIDI; | |||||
| #undef APP_NAME | #undef APP_NAME | ||||
| const char *APP_NAME = "non-midi-mapper"; | const char *APP_NAME = "non-midi-mapper"; | ||||
| #undef APP_TITLE | |||||
| const char *APP_TITLE = "Non-MIDI-Mapper"; | |||||
| #undef VERSION | #undef VERSION | ||||
| const char *VERSION = "1.0"; | const char *VERSION = "1.0"; | ||||
| @@ -100,7 +102,7 @@ say_hello ( void ) | |||||
| lo_message_add( m, "sssss", | lo_message_add( m, "sssss", | ||||
| "/non/hello", | "/non/hello", | ||||
| osc->url(), | osc->url(), | ||||
| APP_NAME, | |||||
| APP_TITLE, | |||||
| VERSION, | VERSION, | ||||
| instance_name ); | instance_name ); | ||||
| @@ -618,7 +620,7 @@ main ( int argc, char **argv ) | |||||
| { | { | ||||
| if ( ! nsm_init( nsm, nsm_url ) ) | if ( ! nsm_init( nsm, nsm_url ) ) | ||||
| { | { | ||||
| nsm_send_announce( nsm, APP_NAME, ":dirty:", argv[0] ); | |||||
| nsm_send_announce( nsm, APP_TITLE, ":dirty:", basename( argv[0] ) ); | |||||
| /* poll so we can keep OSC handlers running in the GUI thread and avoid extra sync */ | /* poll so we can keep OSC handlers running in the GUI thread and avoid extra sync */ | ||||
| // Fl::add_timeout( NSM_CHECK_INTERVAL, check_nsm, NULL ); | // Fl::add_timeout( NSM_CHECK_INTERVAL, check_nsm, NULL ); | ||||
| @@ -629,7 +631,7 @@ main ( int argc, char **argv ) | |||||
| DMESSAGE( "Creating JACK engine" ); | DMESSAGE( "Creating JACK engine" ); | ||||
| if ( ! engine->init("midi-to-osc" ) ) | |||||
| if ( ! engine->init( APP_NAME ) ) | |||||
| { | { | ||||
| WARNING( "Failed to create JACK client" ); | WARNING( "Failed to create JACK client" ); | ||||
| } | } | ||||
| @@ -72,8 +72,8 @@ src/main.C | |||||
| uselib = [ 'JACK', 'LIBLO', 'LRDF', 'NTK', 'NTK_IMAGES', 'PTHREAD', 'DL', 'M' ], | uselib = [ 'JACK', 'LIBLO', 'LRDF', 'NTK', 'NTK_IMAGES', 'PTHREAD', 'DL', 'M' ], | ||||
| install_path = '${BINDIR}') | install_path = '${BINDIR}') | ||||
| bld.program( source = 'src/midi-to-osc.C', | |||||
| target = 'midi-to-osc', | |||||
| bld.program( source = 'src/midi-mapper.C', | |||||
| target = 'non-midi-mapper', | |||||
| includes = ['.', 'src', '..', '../nonlib'], | includes = ['.', 'src', '..', '../nonlib'], | ||||
| use = ['nonlib', 'fl_widgets'], | use = ['nonlib', 'fl_widgets'], | ||||
| uselib = [ 'JACK', 'LIBLO', 'LRDF', 'NTK', 'NTK_IMAGES', 'PTHREAD', 'DL', 'M' ], | uselib = [ 'JACK', 'LIBLO', 'LRDF', 'NTK', 'NTK_IMAGES', 'PTHREAD', 'DL', 'M' ], | ||||