X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fnsmclient.cc;h=e440d33c6f717d494cb64b434b95a226a0fe5224;hb=dfef8b7f6257364053e13ab4d5e317b703abd0af;hp=94c3e8570e978c835fbd0e47bad5d1accd546000;hpb=37b1f5017e904005fae6b815b1519b3fa595d8d3;p=ardour.git diff --git a/gtk2_ardour/nsmclient.cc b/gtk2_ardour/nsmclient.cc index 94c3e8570e..e440d33c6f 100644 --- a/gtk2_ardour/nsmclient.cc +++ b/gtk2_ardour/nsmclient.cc @@ -27,6 +27,10 @@ #pragma GCC diagnostic ignored "-Wunused-parameter" #else #include // Needed for 'getpid()' + +#include +#define LO_TT_IMMEDIATE lo_get_tt_immediate() +lo_timetag lo_get_tt_immediate() { lo_timetag tt = {0U,1U}; return tt; } #endif namespace NSM @@ -39,262 +43,273 @@ namespace NSM #undef OSC_REPLY #undef OSC_REPLY_ERR -#define OSC_REPLY( value ) lo_send_from( ((NSM::Client*)user_data)->nsm_addr, ((NSM::Client*)user_data)->_server, LO_TT_IMMEDIATE, "/reply", "ss", path, value ) - -#define OSC_REPLY_ERR( errcode, value ) lo_send_from( ((NSM::Client*)user_data)->nsm_addr, ((NSM::Client*)user_data)->_server, LO_TT_IMMEDIATE, "/error", "sis", path, errcode, value ) - - Client::Client ( ) - { - nsm_addr = 0; - _nsm_client_id = 0; - _nsm_client_path = 0; - _session_manager_name = 0; - nsm_url = ""; - nsm_is_active = false; - _server = 0; - _st = 0; - } - - Client::~Client ( ) - { - if ( _st ) - stop(); - - if ( _st ) - lo_server_thread_free( _st ); - else - lo_server_free ( _server ); - } - - void - Client::announce ( const char *application_name, const char *capabilities, const char *process_name ) - { - - lo_address to = lo_address_new_from_url( nsm_url ); - - if ( ! to ) - { - return; - } - - int pid = (int)getpid(); - - lo_send_from( to, _server, LO_TT_IMMEDIATE, "/nsm/server/announce", "sssiii", +#define OSC_REPLY(value) lo_send_from( ((NSM::Client*)user_data)->nsm_addr, ((NSM::Client*)user_data)->_server, LO_TT_IMMEDIATE, "/reply", "ss", path, value) + +#define OSC_REPLY_ERR(errcode, value) lo_send_from( ((NSM::Client*)user_data)->nsm_addr, ((NSM::Client*)user_data)->_server, LO_TT_IMMEDIATE, "/error", "sis", path, errcode, value) + + Client::Client () + { + nsm_addr = 0; + _nsm_client_id = 0; + _nsm_client_path = 0; + _session_manager_name = 0; + nsm_url = ""; + nsm_is_active = false; + _server = 0; + _st = 0; + } + + Client::~Client () + { + if (_st) { + stop(); + } + + if (_st) { + lo_server_thread_free (_st); + } else { + lo_server_free (_server); + } + } + + void + Client::announce (const char *application_name, const char *capabilities, const char *process_name) + { + + lo_address to = lo_address_new_from_url (nsm_url); + + if (!to) + { + return; + } + + int pid = (int)getpid(); + + lo_send_from (to, _server, LO_TT_IMMEDIATE, "/nsm/server/announce", "sssiii", application_name, capabilities, process_name, 1, /* api_major_version */ 0, /* api_minor_version */ - pid ); - - lo_address_free( to ); - } - - void - Client::progress ( float p ) - { - if ( nsm_is_active ) - { - lo_send_from( nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/progress", "f", p ); - } - } - - void - Client::is_dirty ( void ) - { - if ( nsm_is_active ) - { - lo_send_from( nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/is_dirty", "" ); - } - } - - void - Client::is_clean ( void ) - { - if ( nsm_is_active ) - { - lo_send_from( nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/is_clean", "" ); - } - } - - void - Client::message ( int priority, const char *msg ) - { - if ( nsm_is_active ) - { - lo_send_from( nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/message", "is", priority, msg ); - } - } - - - void - Client::broadcast ( lo_message msg ) - { - if ( nsm_is_active ) - { - lo_send_message_from( nsm_addr, _server, "/nsm/server/broadcast", msg ); - } - } - - void - Client::check ( int timeout ) - { - if ( lo_server_wait( _server, timeout ) ) - while ( lo_server_recv_noblock( _server, 0 ) ) {} - } - - void - Client::start ( ) - { - lo_server_thread_start( _st ); - } - - void - Client::stop ( ) - { - lo_server_thread_stop( _st ); - } - - int - Client::init ( const char *nsm_url ) - { - this->nsm_url = nsm_url; - - lo_address addr = lo_address_new_from_url( nsm_url ); - int proto = lo_address_get_protocol( addr ); - lo_address_free( addr ); - - _server = lo_server_new_with_proto( NULL, proto, NULL ); - - if ( ! _server ) - return -1; - - lo_server_add_method( _server, "/error", "sis", &Client::osc_error, this ); - lo_server_add_method( _server, "/reply", "ssss", &Client::osc_announce_reply, this ); - lo_server_add_method( _server, "/nsm/client/open", "sss", &Client::osc_open, this ); - lo_server_add_method( _server, "/nsm/client/save", "", &Client::osc_save, this ); - lo_server_add_method( _server, "/nsm/client/session_is_loaded", "", &Client::osc_session_is_loaded, this ); - lo_server_add_method( _server, NULL, NULL, &Client::osc_broadcast, this ); - - return 0; - } - - int - Client::init_thread ( const char *nsm_url ) - { - this->nsm_url = nsm_url; - - lo_address addr = lo_address_new_from_url( nsm_url ); - int proto = lo_address_get_protocol( addr ); - lo_address_free( addr ); - - _st = lo_server_thread_new_with_proto( NULL, proto, NULL ); - _server = lo_server_thread_get_server( _st ); - - if ( ! _server || ! _st ) - return -1; - - lo_server_thread_add_method( _st, "/error", "sis", &Client::osc_error, this ); - lo_server_thread_add_method( _st, "/reply", "ssss", &Client::osc_announce_reply, this ); - lo_server_thread_add_method( _st, "/nsm/client/open", "sss", &Client::osc_open, this ); - lo_server_thread_add_method( _st, "/nsm/client/save", "", &Client::osc_save, this ); - lo_server_thread_add_method( _st, "/nsm/client/session_is_loaded", "", &Client::osc_session_is_loaded, this ); - lo_server_thread_add_method( _st, NULL, NULL, &Client::osc_broadcast, this ); - - return 0; - } + pid); + + lo_address_free (to); + } + + void + Client::progress (float p) + { + if (nsm_is_active) + { + lo_send_from (nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/progress", "f", p); + } + } + + void + Client::is_dirty (void) + { + if (nsm_is_active) + { + lo_send_from (nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/is_dirty", ""); + } + } + + void + Client::is_clean (void) + { + if (nsm_is_active) + { + lo_send_from (nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/is_clean", ""); + } + } + + void + Client::message (int priority, const char *msg) + { + if (nsm_is_active) + { + lo_send_from (nsm_addr, _server, LO_TT_IMMEDIATE, "/nsm/client/message", "is", priority, msg); + } + } + + + void + Client::broadcast (lo_message msg) + { + if (nsm_is_active) + { + lo_send_message_from (nsm_addr, _server, "/nsm/server/broadcast", msg); + } + } + + void + Client::check (int timeout) + { + if (lo_server_wait (_server, timeout)) { + while (lo_server_recv_noblock (_server, 0)); + } + } + + void + Client::start () + { + lo_server_thread_start (_st); + } + + void + Client::stop () + { + lo_server_thread_stop (_st); + } + + int + Client::init (const char *nsm_url) + { + this->nsm_url = nsm_url; + + lo_address addr = lo_address_new_from_url (nsm_url); + int proto = lo_address_get_protocol (addr); + lo_address_free (addr); + + _server = lo_server_new_with_proto (NULL, proto, NULL); + + if (!_server) { + return -1; + } + + lo_server_add_method (_server, "/error", "sis", &Client::osc_error, this); + lo_server_add_method (_server, "/reply", "ssss", &Client::osc_announce_reply, this); + lo_server_add_method (_server, "/nsm/client/open", "sss", &Client::osc_open, this); + lo_server_add_method (_server, "/nsm/client/save", "", &Client::osc_save, this); + lo_server_add_method (_server, "/nsm/client/session_is_loaded", "", &Client::osc_session_is_loaded, this); + lo_server_add_method (_server, NULL, NULL, &Client::osc_broadcast, this); + + return 0; + } + + int + Client::init_thread (const char *nsm_url) + { + this->nsm_url = nsm_url; + + lo_address addr = lo_address_new_from_url (nsm_url); + int proto = lo_address_get_protocol (addr); + lo_address_free (addr); + + _st = lo_server_thread_new_with_proto (NULL, proto, NULL); + _server = lo_server_thread_get_server (_st); + + if (! _server || ! _st) { + return -1; + } + + lo_server_thread_add_method (_st, "/error", "sis", &Client::osc_error, this); + lo_server_thread_add_method (_st, "/reply", "ssss", &Client::osc_announce_reply, this); + lo_server_thread_add_method (_st, "/nsm/client/open", "sss", &Client::osc_open, this); + lo_server_thread_add_method (_st, "/nsm/client/save", "", &Client::osc_save, this); + lo_server_thread_add_method (_st, "/nsm/client/session_is_loaded", "", &Client::osc_session_is_loaded, this); + lo_server_thread_add_method (_st, NULL, NULL, &Client::osc_broadcast, this); + + return 0; + } /************************/ /* OSC Message Handlers */ /************************/ - int - Client::osc_broadcast ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - return ((NSM::Client*)user_data)->command_broadcast( path, msg ); - } - - int - Client::osc_save ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - char *out_msg = NULL; - - int r = ((NSM::Client*)user_data)->command_save(&out_msg); - - if ( r ) - OSC_REPLY_ERR( r, ( out_msg ? out_msg : "") ); - else - OSC_REPLY( "OK" ); - - if ( out_msg ) - free( out_msg ); - - return 0; - } - - int - Client::osc_open ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - char *out_msg = NULL; - - NSM::Client *nsm = (NSM::Client*)user_data; - - nsm->_nsm_client_id = strdup( &argv[2]->s ); - nsm->_nsm_client_path = strdup( &argv[0]->s ); - - int r = ((NSM::Client*)user_data)->command_open( &argv[0]->s, &argv[1]->s, &argv[2]->s, &out_msg); - - if ( r ) - OSC_REPLY_ERR( r, ( out_msg ? out_msg : "") ); - else - OSC_REPLY( "OK" ); - - if ( out_msg ) - free( out_msg ); - - return 0; - } - - int - Client::osc_session_is_loaded ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - NSM::Client *nsm = (NSM::Client*)user_data; - - nsm->command_session_is_loaded(); - - return 0; - } - - int - Client::osc_error ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - if ( strcmp( &argv[0]->s, "/nsm/server/announce" ) ) - return -1; - - NSM::Client *nsm = (NSM::Client*)user_data; - - - nsm->nsm_is_active = false; - - nsm->command_active( nsm->nsm_is_active ); - - return 0; - } - - int - Client::osc_announce_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data ) - { - if ( strcmp( &argv[0]->s, "/nsm/server/announce" ) ) - return -1; - - NSM::Client *nsm = (NSM::Client*)user_data; - - nsm->nsm_is_active = true; - nsm->_session_manager_name = strdup( &argv[2]->s ); - nsm->nsm_addr = lo_address_new_from_url( lo_address_get_url( lo_message_get_source( msg ) )); - - nsm->command_active( nsm->nsm_is_active ); - - return 0; - } + int + Client::osc_broadcast (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + return ((NSM::Client*)user_data)->command_broadcast (path, msg); + } + + int + Client::osc_save (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + char *out_msg = NULL; + + int r = ((NSM::Client*)user_data)->command_save(&out_msg); + + if (r) { + OSC_REPLY_ERR (r, (out_msg ? out_msg : "")); + } else { + OSC_REPLY ("OK"); + } + + if (out_msg) { + free (out_msg); + } + + return 0; + } + + int + Client::osc_open (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + char *out_msg = NULL; + + NSM::Client *nsm = (NSM::Client*)user_data; + + nsm->_nsm_client_id = strdup (&argv[2]->s); + nsm->_nsm_client_path = strdup (&argv[0]->s); + + int r = ((NSM::Client*)user_data)->command_open (&argv[0]->s, &argv[1]->s, &argv[2]->s, &out_msg); + + if (r) { + OSC_REPLY_ERR (r, (out_msg ? out_msg : "")); + } else { + OSC_REPLY ("OK"); + } + + if (out_msg) { + free(out_msg); + } + + return 0; + } + + int + Client::osc_session_is_loaded (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + NSM::Client *nsm = (NSM::Client*)user_data; + + nsm->command_session_is_loaded(); + + return 0; + } + + int + Client::osc_error (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + if (strcmp (&argv[0]->s, "/nsm/server/announce")) { + return -1; + } + + NSM::Client *nsm = (NSM::Client*)user_data; + + + nsm->nsm_is_active = false; + + nsm->command_active (nsm->nsm_is_active); + + return 0; + } + + int + Client::osc_announce_reply (const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data) + { + if (strcmp (&argv[0]->s, "/nsm/server/announce")) { + return -1; + } + + NSM::Client *nsm = (NSM::Client*)user_data; + + nsm->nsm_is_active = true; + nsm->_session_manager_name = strdup (&argv[2]->s); + nsm->nsm_addr = lo_address_new_from_url (lo_address_get_url (lo_message_get_source (msg))); + + nsm->command_active (nsm->nsm_is_active); + + return 0; + } };