Assists music production by grouping standalone programs into sessions. Community version of "Non Session Manager".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1429 lines
39KB

  1. /*******************************************************************************/
  2. /* Copyright (C) 2008-2020 Jonathan Moore Liles (as "Non-Session-Manager") */
  3. /* Copyright (C) 2020- Nils Hilbricht */
  4. /* */
  5. /* This file is part of New-Session-Manager */
  6. /* */
  7. /* New-Session-Manager is free software: you can redistribute it and/or modify */
  8. /* it under the terms of the GNU General Public License as published by */
  9. /* the Free Software Foundation, either version 3 of the License, or */
  10. /* (at your option) any later version. */
  11. /* */
  12. /* New-Session-Manager is distributed in the hope that it will be useful, */
  13. /* but WITHOUT ANY WARRANTY; without even the implied warranty of */
  14. /* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
  15. /* GNU General Public License for more details. */
  16. /* */
  17. /* You should have received a copy of the GNU General Public License */
  18. /* along with New-Session-Manager. If not, see <https://www.gnu.org/licenses/>.*/
  19. /*******************************************************************************/
  20. #include <lo/lo.h>
  21. #include "debug.h"
  22. #include <stdlib.h>
  23. #include <stdio.h>
  24. #include <string.h>
  25. #include <assert.h>
  26. #include "Endpoint.hpp"
  27. #include "Thread.hpp"
  28. #pragma GCC diagnostic ignored "-Wunused-parameter"
  29. #pragma GCC diagnostic ignored "-Wunused-result"
  30. namespace OSC
  31. {
  32. /**********/
  33. /* Method */
  34. /**********/
  35. Method::Method ( )
  36. {
  37. _path = _typespec = _documentation = 0;
  38. }
  39. Method::~Method ( )
  40. {
  41. if ( _path )
  42. free( _path );
  43. if ( _typespec )
  44. free( _typespec );
  45. if ( _documentation )
  46. free( _documentation );
  47. }
  48. /**********/
  49. /* Signal */
  50. /**********/
  51. Signal::Signal ( const char *path, Direction dir )
  52. {
  53. _direction = dir;
  54. _path = NULL;
  55. if ( path )
  56. _path = strdup( path );
  57. _value = 0.0f;
  58. _endpoint = NULL;
  59. _peer = NULL;
  60. _documentation = 0;
  61. _user_data = 0;
  62. _connection_state_callback = 0;
  63. _connection_state_userdata = 0;
  64. }
  65. Signal::~Signal ( )
  66. {
  67. if ( _endpoint )
  68. {
  69. _endpoint->del_signal( this );
  70. }
  71. if ( _path )
  72. free( _path );
  73. _path = NULL;
  74. _endpoint = NULL;
  75. }
  76. void
  77. Signal::rename ( const char *path )
  78. {
  79. char *new_path;
  80. asprintf( &new_path, "%s%s", _endpoint->name() ? _endpoint->name() : "", path );
  81. DMESSAGE( "Renaming signal %s to %s", this->path(), new_path );
  82. /* if ( _direction == Signal::Input ) */
  83. /* { */
  84. lo_server_del_method( _endpoint->_server, _path, NULL );
  85. lo_server_add_method( _endpoint->_server, new_path, NULL, _endpoint->osc_sig_handler, this );
  86. /* } */
  87. for ( std::list<Peer*>::iterator i = _endpoint->_peers.begin();
  88. i != _endpoint->_peers.end();
  89. ++i )
  90. {
  91. _endpoint->send( (*i)->addr, "/signal/renamed", _path, new_path );
  92. }
  93. _endpoint->rename_translation_destination( _path, new_path );
  94. free( _path );
  95. _path = new_path;
  96. }
  97. void
  98. Signal::value ( float f )
  99. {
  100. if ( f == _value )
  101. return;
  102. _value = f;
  103. if ( direction() == Output )
  104. {
  105. for ( std::list<Peer*>::iterator i = _endpoint->_peers.begin();
  106. i != _endpoint->_peers.end();
  107. ++i )
  108. {
  109. _endpoint->send( (*i)->addr,
  110. path(),
  111. f );
  112. }
  113. // free(s);
  114. }
  115. /* else if ( direction() == Input ) */
  116. /* { */
  117. /* DMESSAGE( "Sending value feedback for signal %s...", path() ); */
  118. /* for ( std::list<Signal*>::iterator i = _incoming.begin(); */
  119. /* i != _incoming.end(); */
  120. /* ++i ) */
  121. /* { */
  122. /* DMESSAGE( "Sending value feedback to %s %s %f", lo_address_get_url( (*i)->_peer->addr), (*i)->path() , f); */
  123. /* _endpoint->send( (*i)->_peer->addr, */
  124. /* (*i)->path(), */
  125. /* f ); */
  126. /* } */
  127. /* } */
  128. }
  129. /* char * */
  130. /* Signal::get_output_connection_peer_name_and_path ( int n ) */
  131. /* { */
  132. /* Signal *t = NULL; */
  133. /* int j = 0; */
  134. /* for ( std::list<Signal*>::const_iterator i = _outgoing.begin(); */
  135. /* i != _outgoing.end(); */
  136. /* ++i, ++j ) */
  137. /* { */
  138. /* if ( j == n ) */
  139. /* { */
  140. /* t = *i; */
  141. /* break; */
  142. /* } */
  143. /* } */
  144. /* if ( t ) */
  145. /* { */
  146. /* char *r; */
  147. /* asprintf( &r, "%s%s", t->_peer->name, t->path() ); */
  148. /* return r; */
  149. /* } */
  150. /* else */
  151. /* return NULL; */
  152. /* } */
  153. /* */
  154. void
  155. Endpoint::error_handler(int num, const char *msg, const char *path)
  156. {
  157. WARNING( "LibLO server error %d in path %s: %s\n", num, path, msg);
  158. }
  159. Endpoint::Endpoint ( )
  160. {
  161. _learning_path = NULL;
  162. _peer_signal_notification_callback = 0;
  163. _peer_signal_notification_userdata = 0;
  164. _peer_scan_complete_callback = 0;
  165. _peer_scan_complete_userdata = 0;
  166. _server = 0;
  167. _name = 0;
  168. owner = 0;
  169. }
  170. int
  171. Endpoint::init ( int proto, const char *port )
  172. {
  173. DMESSAGE( "Creating OSC server" );
  174. _server = lo_server_new_with_proto( port, proto, error_handler );
  175. char *url = lo_server_get_url( _server );
  176. _addr = lo_address_new_from_url( url );
  177. free( url );
  178. if ( ! _server )
  179. {
  180. WARNING( "Error creating OSC server" );
  181. return -1;
  182. }
  183. add_method( "/signal/hello", "ss", &Endpoint::osc_sig_hello, this, "" );
  184. add_method( "/signal/connect", "ss", &Endpoint::osc_sig_connect, this, "" );
  185. add_method( "/signal/disconnect", "ss", &Endpoint::osc_sig_disconnect, this, "" );
  186. add_method( "/signal/renamed", "ss", &Endpoint::osc_sig_renamed, this, "" );
  187. add_method( "/signal/removed", "s", &Endpoint::osc_sig_removed, this, "" );
  188. add_method( "/signal/created", "ssfff", &Endpoint::osc_sig_created, this, "" );
  189. add_method( "/signal/list", NULL, &Endpoint::osc_signal_lister, this, "" );
  190. add_method( "/reply", NULL, &Endpoint::osc_reply, this, "" );
  191. add_method( NULL, NULL, &Endpoint::osc_generic, this, "" );
  192. return 0;
  193. }
  194. Endpoint::~Endpoint ( )
  195. {
  196. // lo_server_thread_free( _st );
  197. for ( std::list<Method*>::iterator i = _methods.begin();
  198. i != _methods.end();
  199. i++ )
  200. delete(*i);
  201. _methods.clear();
  202. if ( _server )
  203. {
  204. lo_server_free( _server );
  205. _server = 0;
  206. }
  207. lo_address_free( _addr );
  208. _addr = 0;
  209. }
  210. OSC::Signal *
  211. Endpoint::find_target_by_peer_address ( std::list<Signal*> *l, lo_address addr )
  212. {
  213. for ( std::list<Signal*>::iterator i = l->begin();
  214. i != l->end();
  215. ++i )
  216. {
  217. if ( address_matches( addr, (*i)->_peer->addr ) )
  218. {
  219. return *i;
  220. }
  221. }
  222. return NULL;
  223. }
  224. OSC::Signal *
  225. Endpoint::find_peer_signal_by_path ( Peer *p, const char *path )
  226. {
  227. for ( std::list<Signal*>::iterator i = p->_signals.begin();
  228. i != p->_signals.end();
  229. ++i )
  230. {
  231. if ( !strcmp( (*i)->path(), path ) )
  232. return *i;
  233. }
  234. return NULL;
  235. }
  236. OSC::Signal *
  237. Endpoint::find_signal_by_path ( const char *path )
  238. {
  239. for ( std::list<Signal*>::iterator i = _signals.begin();
  240. i != _signals.end();
  241. ++i )
  242. {
  243. if ( !strcmp( (*i)->path(), path ) )
  244. return *i;
  245. }
  246. return NULL;
  247. }
  248. void
  249. Endpoint::hello ( const char *url )
  250. {
  251. assert( name() );
  252. lo_address addr = lo_address_new_from_url ( url );
  253. char *our_url = this->url();
  254. send( addr, "/signal/hello", name(), our_url );
  255. free( our_url );
  256. lo_address_free( addr );
  257. }
  258. void
  259. Endpoint::handle_hello ( const char *peer_name, const char *peer_url )
  260. {
  261. DMESSAGE( "Got hello from %s", peer_name );
  262. Peer *p = find_peer_by_name( peer_name );
  263. if ( ! p )
  264. {
  265. scan_peer( peer_name, peer_url );
  266. }
  267. else
  268. {
  269. /* maybe the peer has a new URL */
  270. /* update address */
  271. lo_address addr = lo_address_new_from_url( peer_url );
  272. if ( address_matches( addr, p->addr ) )
  273. {
  274. free( addr );
  275. return;
  276. }
  277. if ( p->addr )
  278. free( p->addr );
  279. p->addr = addr;
  280. /* scan it while we're at it */
  281. p->_scanning = true;
  282. DMESSAGE( "Scanning peer %s", peer_name );
  283. send( p->addr, "/signal/list" );
  284. }
  285. if ( name() )
  286. {
  287. hello( peer_url );
  288. }
  289. else
  290. {
  291. DMESSAGE( "Not sending hello because we don't have a name yet!" );
  292. }
  293. }
  294. int
  295. Endpoint::osc_sig_hello ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  296. {
  297. Endpoint *ep = (Endpoint*)user_data;
  298. const char *peer_name = &argv[0]->s;
  299. const char *peer_url = &argv[1]->s;
  300. ep->handle_hello( peer_name, peer_url );
  301. return 0;
  302. }
  303. int
  304. Endpoint::osc_sig_disconnect ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  305. {
  306. const char *their_name = &argv[0]->s;
  307. const char *our_name = &argv[1]->s;
  308. Endpoint *ep = (Endpoint*)user_data;
  309. Signal *s = ep->find_signal_by_path( our_name );
  310. if ( ! s )
  311. return 0;
  312. if ( s->_direction == Signal::Input )
  313. {
  314. DMESSAGE( "Peer %s has disconnected from signal %s", our_name, their_name );
  315. ep->del_translation( their_name );
  316. if ( s->_connection_state_callback )
  317. s->_connection_state_callback( s, s->_connection_state_userdata );
  318. return 0;
  319. }
  320. return 0;
  321. }
  322. int
  323. Endpoint::osc_sig_connect ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  324. {
  325. const char *src_path = &argv[0]->s;
  326. const char *dst_path = &argv[1]->s;
  327. Endpoint *ep = (Endpoint*)user_data;
  328. Signal *dst_s = ep->find_signal_by_path( dst_path );
  329. if ( ! dst_s )
  330. {
  331. WARNING( "Unknown destination signal in connection attempt: \"%s\"", dst_path );
  332. return 0;
  333. }
  334. if ( dst_s->_endpoint != ep )
  335. {
  336. WARNING( "Got connection request for a destination signal we don't own" );
  337. return 0;
  338. }
  339. DMESSAGE( "Has requested signal connection %s |> %s", src_path, dst_s->path() );
  340. ep->add_translation( src_path, dst_s->path() );
  341. /* if ( dst_s->_connection_state_callback ) */
  342. /* dst_s->_connection_state_callback( dst_s, dst_s->_connection_state_userdata ); */
  343. return 0;
  344. }
  345. int
  346. Endpoint::osc_sig_removed ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  347. {
  348. const char *name = &argv[0]->s;
  349. Endpoint *ep = (Endpoint*)user_data;
  350. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  351. if ( ! p )
  352. {
  353. WARNING( "Got signal removed notification from unknown peer." );
  354. return 0;
  355. }
  356. Signal *o = ep->find_peer_signal_by_path( p, name );
  357. if ( ! o )
  358. {
  359. WARNING( "Unknown signal: %s", name );
  360. return 0;
  361. }
  362. DMESSAGE( "Signal %s:%s was removed", o->_peer->name, o->path() );
  363. if ( ep->_peer_signal_notification_callback )
  364. ep->_peer_signal_notification_callback( o, Signal::Removed, ep->_peer_signal_notification_userdata );
  365. p->_signals.remove(o);
  366. delete o;
  367. return 0;
  368. }
  369. int
  370. Endpoint::osc_sig_created ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  371. {
  372. Endpoint *ep = (Endpoint*)user_data;
  373. const char *name = &argv[0]->s;
  374. const char *direction = &argv[1]->s;
  375. const float min = argv[2]->f;
  376. const float max = argv[3]->f;
  377. const float default_value = argv[4]->f;
  378. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  379. if ( ! p )
  380. {
  381. WARNING( "Got signal creation notification from unknown peer" );
  382. return 0;
  383. }
  384. Signal::Direction dir = Signal::Input;
  385. if ( !strcmp( direction, "in" ) )
  386. dir = Signal::Input;
  387. else if ( !strcmp( direction, "out" ) )
  388. dir = Signal::Output;
  389. Signal *s = new Signal( name, dir );
  390. s->_peer = p;
  391. s->parameter_limits( min, max, default_value );
  392. p->_signals.push_back( s );
  393. DMESSAGE( "Peer %s has created signal %s (%s %f %f %f)", p->name,
  394. name, direction, min, max, default_value );
  395. if ( ep->_peer_signal_notification_callback )
  396. ep->_peer_signal_notification_callback( s, Signal::Created, ep->_peer_signal_notification_userdata );
  397. return 0;
  398. }
  399. int
  400. Endpoint::osc_sig_renamed ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  401. {
  402. DMESSAGE( "Got renamed message." );
  403. const char *old_name = &argv[0]->s;
  404. const char *new_name = &argv[1]->s;
  405. Endpoint *ep = (Endpoint*)user_data;
  406. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  407. if ( ! p )
  408. {
  409. WARNING( "Got signal rename notification from unknown peer." );
  410. return 0;
  411. }
  412. Signal *o = ep->find_peer_signal_by_path( p, old_name );
  413. if ( ! o )
  414. {
  415. WARNING( "Unknown signal: %s", old_name );
  416. return 0;
  417. }
  418. DMESSAGE( "Signal %s was renamed to %s", o->_path, new_name );
  419. ep->rename_translation_source( o->_path, new_name );
  420. free( o->_path );
  421. o->_path = strdup( new_name );
  422. return 0;
  423. }
  424. int
  425. Endpoint::osc_sig_handler ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  426. {
  427. Signal *o;
  428. float f = 0.0;
  429. if ( ! strcmp( types, "f" ) )
  430. {
  431. /* accept a value for signal named in path */
  432. o = (Signal*)user_data;
  433. f = argv[0]->f;
  434. }
  435. else if ( ! types || 0 == types[0] )
  436. {
  437. /* reply with current value */
  438. o = (Signal*)user_data;
  439. o->_endpoint->send( lo_message_get_source( msg ), "/reply", path, o->value() );
  440. return 0;
  441. }
  442. else
  443. {
  444. return -1;
  445. }
  446. o->_value = f;
  447. if ( o->_handler )
  448. o->_handler( f, o->_user_data );
  449. return 1;
  450. }
  451. const char**
  452. Endpoint::get_connections ( const char *path )
  453. {
  454. const char ** conn = NULL;
  455. int j = 0;
  456. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  457. i != _translations.end();
  458. i++ )
  459. {
  460. if ( !strcmp( i->second.path.c_str(), path ) )
  461. {
  462. conn = (const char**)realloc( conn, sizeof( char * ) * (j+2));
  463. conn[j++] = i->first.c_str();
  464. }
  465. }
  466. if ( conn )
  467. conn[j] = 0;
  468. return conn;
  469. }
  470. void
  471. Endpoint::clear_translations ( void )
  472. {
  473. _translations.clear();
  474. }
  475. void
  476. Endpoint::add_translation ( const char *a, const char *b )
  477. {
  478. _translations[a].path = b;
  479. }
  480. void
  481. Endpoint::del_translation ( const char *a )
  482. {
  483. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  484. if ( i != _translations.end() )
  485. _translations.erase( i );
  486. }
  487. void
  488. Endpoint::rename_translation_destination ( const char *a, const char *b )
  489. {
  490. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  491. i != _translations.end();
  492. i++ )
  493. {
  494. if ( !strcmp( i->second.path.c_str(), a ) )
  495. {
  496. i->second.path = b;
  497. }
  498. }
  499. }
  500. void
  501. Endpoint::rename_translation_source ( const char *a, const char *b )
  502. {
  503. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  504. if ( i != _translations.end() )
  505. {
  506. _translations[b] = _translations[a];
  507. _translations.erase( i );
  508. }
  509. }
  510. int
  511. Endpoint::ntranslations ( void )
  512. {
  513. return _translations.size();
  514. }
  515. bool
  516. Endpoint::get_translation ( int n, const char **from, const char **to )
  517. {
  518. int j = 0;
  519. for ( std::map<std::string,TranslationDestination>::const_iterator i = _translations.begin();
  520. i != _translations.end();
  521. i++, j++)
  522. {
  523. if ( j == n )
  524. {
  525. *from = i->first.c_str();
  526. *to = i->second.path.c_str();
  527. return true;
  528. }
  529. }
  530. return false;
  531. }
  532. int
  533. Endpoint::osc_generic ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  534. {
  535. // OSC_DMSG();
  536. Endpoint *ep = (Endpoint*)user_data;
  537. if ( ep->_learning_path )
  538. {
  539. ep->add_translation( path, ep->_learning_path );
  540. DMESSAGE( "Learned translation \"%s\" -> \"%s\"", path, ep->_learning_path );
  541. free(ep->_learning_path);
  542. ep->_learning_path = NULL;
  543. return 0;
  544. }
  545. {
  546. std::map<std::string,TranslationDestination>::iterator i = ep->_translations.find( path );
  547. if ( i != ep->_translations.end() )
  548. {
  549. const char *dpath = i->second.path.c_str();
  550. // DMESSAGE( "Translating message \"%s\" to \"%s\"", path, dpath );
  551. if ( !strcmp(types, "f" ))
  552. {
  553. // DMESSAGE( "recording value %f", argv[0]->f );
  554. i->second.current_value = argv[0]->f;
  555. }
  556. i->second.suppress_feedback = true;
  557. lo_send_message(ep->_addr, dpath, msg );
  558. return 0;
  559. }
  560. }
  561. if ( argc || path[ strlen(path) - 1 ] != '/' )
  562. return -1;
  563. for ( std::list<Method*>::const_iterator i = ep->_methods.begin(); i != ep->_methods.end(); ++i )
  564. {
  565. if ( ! (*i)->path() )
  566. continue;
  567. if (! strncmp( (*i)->path(), path, strlen(path) ) )
  568. {
  569. /* asprintf( &stored_path, "%s (%s); %s", path, typespec, argument_description ); */
  570. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path, (*i)->path() );
  571. }
  572. }
  573. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path );
  574. return 0;
  575. }
  576. int
  577. Endpoint::osc_signal_lister ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  578. {
  579. // OSC_DMSG();
  580. DMESSAGE( "Listing signals." );
  581. const char *prefix = NULL;
  582. if ( argc )
  583. prefix = &argv[0]->s;
  584. Endpoint *ep = (Endpoint*)user_data;
  585. for ( std::list<Signal*>::const_iterator i = ep->_signals.begin(); i != ep->_signals.end(); ++i )
  586. {
  587. Signal *o = *i;
  588. if ( ! prefix || ! strncmp( o->path(), prefix, strlen(prefix) ) )
  589. {
  590. ep->send( lo_message_get_source( msg ),
  591. "/reply",
  592. path,
  593. o->path(),
  594. o->_direction == Signal::Input ? "in" : "out",
  595. o->parameter_limits().min,
  596. o->parameter_limits().max,
  597. o->parameter_limits().default_value
  598. );
  599. }
  600. }
  601. ep->send( lo_message_get_source( msg ), "/reply", path );
  602. return 0;
  603. }
  604. bool
  605. Endpoint::address_matches ( lo_address addr1, lo_address addr2 )
  606. {
  607. char *purl = strdup( lo_address_get_port( addr1 ) );
  608. char *url = strdup( lo_address_get_port( addr2 ) );
  609. bool r = !strcmp( purl, url );
  610. free( purl );
  611. free( url );
  612. return r;
  613. }
  614. void
  615. Endpoint::list_peer_signals ( void *v )
  616. {
  617. for ( std::list<Peer*>::iterator i = _peers.begin();
  618. i != _peers.end();
  619. ++i )
  620. {
  621. for ( std::list<Signal*>::iterator j = (*i)->_signals.begin();
  622. j != (*i)->_signals.end();
  623. ++j )
  624. {
  625. if ( _peer_signal_notification_callback )
  626. _peer_signal_notification_callback( *j, OSC::Signal::Created, v );
  627. }
  628. }
  629. }
  630. Peer *
  631. Endpoint::find_peer_by_address ( lo_address addr )
  632. {
  633. char *url = strdup( lo_address_get_port( addr ) );
  634. Peer *p = NULL;
  635. for ( std::list<Peer*>::iterator i = _peers.begin();
  636. i != _peers.end();
  637. ++i )
  638. {
  639. char *purl = strdup( lo_address_get_port( (*i)->addr ) );
  640. if ( !strcmp( purl, url ) )
  641. {
  642. free( purl );
  643. p = *i;
  644. break;
  645. }
  646. free(purl);
  647. }
  648. free( url );
  649. return p;
  650. }
  651. Peer *
  652. Endpoint::find_peer_by_name ( const char *name )
  653. {
  654. for ( std::list<Peer*>::iterator i = _peers.begin();
  655. i != _peers.end();
  656. ++i )
  657. {
  658. if ( !strcmp( name, (*i)->name ) )
  659. {
  660. return *i;
  661. }
  662. }
  663. return NULL;
  664. }
  665. bool
  666. Endpoint::disconnect_signal ( OSC::Signal *s, const char *signal_path )
  667. {
  668. if ( s->_direction == Signal::Output )
  669. {
  670. for ( std::list<Peer*>::iterator i = _peers.begin();
  671. i != _peers.end();
  672. ++i )
  673. {
  674. send( (*i)->addr, "/signal/disconnect",
  675. s->path(),
  676. signal_path);
  677. }
  678. return true;
  679. }
  680. return false;
  681. }
  682. bool
  683. Endpoint::connect_signal( OSC::Signal *s, const char *signal_path )
  684. {
  685. if ( s->_direction == Signal::Output )
  686. {
  687. for ( std::list<Peer*>::iterator i = _peers.begin();
  688. i != _peers.end();
  689. i++ )
  690. {
  691. send( (*i)->addr, "/signal/connect",
  692. s->path(),
  693. signal_path );
  694. }
  695. }
  696. return true;
  697. }
  698. int
  699. Endpoint::osc_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  700. {
  701. Endpoint *ep = (Endpoint*)user_data;
  702. if ( argc && !strcmp( &argv[0]->s, "/signal/list" ) )
  703. {
  704. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  705. if ( ! p )
  706. {
  707. WARNING( "Got input list reply from unknown peer." );
  708. return 0;
  709. }
  710. if ( argc == 1 )
  711. {
  712. p->_scanning = false;
  713. DMESSAGE( "Done scanning %s", p->name );
  714. if ( ep->_peer_scan_complete_callback )
  715. ep->_peer_scan_complete_callback(ep->_peer_scan_complete_userdata);
  716. }
  717. else if ( argc == 6 && p->_scanning )
  718. {
  719. Signal *s = ep->find_peer_signal_by_path( p, &argv[1]->s );
  720. if ( s )
  721. return 0;
  722. DMESSAGE( "Peer %s has signal %s (%s)", p->name, &argv[1]->s, &argv[2]->s );
  723. int dir = 0;
  724. if ( !strcmp( &argv[2]->s, "in" ) )
  725. dir = Signal::Input;
  726. else if ( !strcmp( &argv[2]->s, "out" ) )
  727. dir = Signal::Output;
  728. s = new Signal( &argv[1]->s, (Signal::Direction)dir );
  729. s->_peer = p;
  730. s->parameter_limits( argv[3]->f, argv[4]->f, argv[5]->f );
  731. p->_signals.push_back( s );
  732. // ep->_signals.push_back(s);
  733. if ( ep->_peer_signal_notification_callback )
  734. ep->_peer_signal_notification_callback( s, Signal::Created, ep->_peer_signal_notification_userdata );
  735. }
  736. return 0;
  737. }
  738. else
  739. return -1;
  740. }
  741. Method *
  742. Endpoint::add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description )
  743. {
  744. // DMESSAGE( "Added OSC method %s (%s)", path, typespec );
  745. lo_server_add_method( _server, path, typespec, handler, user_data );
  746. Method *md = new Method;
  747. if ( path )
  748. md->_path = strdup( path );
  749. if ( typespec )
  750. md->_typespec = strdup( typespec );
  751. if ( argument_description )
  752. md->_documentation = strdup( argument_description );
  753. _methods.push_back( md );
  754. return md;
  755. }
  756. Signal *
  757. Endpoint::add_signal ( const char *path, Signal::Direction dir, float min, float max, float default_value, signal_handler handler, void *user_data )
  758. {
  759. char *s;
  760. asprintf( &s, "%s%s", name() ? name() : "", path );
  761. Signal *o = new Signal( s, dir );
  762. free(s);
  763. o->_handler = handler;
  764. o->_user_data = user_data;
  765. o->_endpoint = this;
  766. o->parameter_limits( min, max, default_value );
  767. _signals.push_back( o );
  768. /* if ( dir == Signal::Input ) */
  769. /* { */
  770. lo_server_add_method( _server, o->_path, NULL, osc_sig_handler, o );
  771. /* } */
  772. /* tell our peers about it */
  773. for ( std::list<Peer*>::iterator i = _peers.begin();
  774. i != _peers.end();
  775. ++i )
  776. {
  777. send( (*i)->addr,
  778. "/signal/created",
  779. o->path(),
  780. o->_direction == Signal::Input ? "in" : "out",
  781. min,
  782. max,
  783. default_value
  784. );
  785. }
  786. return o;
  787. }
  788. void
  789. Endpoint::del_method ( const char *path, const char *typespec )
  790. {
  791. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  792. lo_server_del_method( _server, path, typespec );
  793. for ( std::list<Method *>::iterator i = _methods.begin(); i != _methods.end(); ++i )
  794. {
  795. if ( ! (*i)->path() )
  796. continue;
  797. if ( ! strcmp( path, (*i)->path() ) &&
  798. ! strcmp( typespec, (*i)->typespec() ) )
  799. {
  800. delete *i;
  801. i = _methods.erase( i );
  802. break;
  803. }
  804. }
  805. }
  806. void
  807. Endpoint::del_method ( Method *meth )
  808. {
  809. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  810. lo_server_del_method( _server, meth->path(), meth->typespec() );
  811. delete meth;
  812. _methods.remove( meth );
  813. }
  814. void
  815. Endpoint::del_signal ( Signal *o )
  816. {
  817. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  818. lo_server_del_method( _server, o->path(), NULL );
  819. /* tell our peers about it */
  820. for ( std::list<Peer*>::iterator i = _peers.begin();
  821. i != _peers.end();
  822. ++i )
  823. {
  824. send( (*i)->addr,
  825. "/signal/removed",
  826. o->path() );
  827. }
  828. /* FIXME: clear loopback connections first! */
  829. _signals.remove( o );
  830. }
  831. /* prepare to learn a translation for /path/. The next unhandled message to come through will be mapped to /path/ */
  832. void
  833. Endpoint::learn ( const char *path )
  834. {
  835. if ( _learning_path )
  836. free( _learning_path );
  837. _learning_path = NULL;
  838. if ( path )
  839. _learning_path = strdup( path );
  840. }
  841. /** if there's a translation with a destination of 'path', then send feedback for it */
  842. void
  843. Endpoint::send_feedback ( const char *path, float v )
  844. {
  845. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  846. i != _translations.end();
  847. i++ )
  848. {
  849. if ( path && ! strcmp( i->second.path.c_str(), path ) )
  850. {
  851. /* found it */
  852. if ( !i->second.suppress_feedback && i->second.current_value != v )
  853. {
  854. const char *spath = i->first.c_str();
  855. // DMESSAGE( "Sending feedback to \"%s\": %f", spath, v );
  856. /* send to all peers */
  857. for ( std::list<Peer*>::iterator p = _peers.begin();
  858. p != _peers.end();
  859. ++p )
  860. {
  861. send( (*p)->addr, spath, v );
  862. }
  863. i->second.current_value = v;
  864. }
  865. i->second.suppress_feedback = false;
  866. /* break; */
  867. }
  868. }
  869. }
  870. Peer *
  871. Endpoint::add_peer ( const char *name, const char *url )
  872. {
  873. Peer *p = new Peer;
  874. DMESSAGE( "Adding peer %s @ %s...", name, url );
  875. p->name = strdup( name );
  876. p->addr = lo_address_new_from_url( url );
  877. _peers.push_back( p );
  878. return p;
  879. }
  880. void
  881. Endpoint::scan_peer ( const char *name, const char *url )
  882. {
  883. Peer *p = add_peer(name,url);
  884. p->_scanning = true;
  885. DMESSAGE( "Scanning peer %s", name );
  886. send( p->addr, "/signal/list" );
  887. }
  888. void *
  889. Endpoint::osc_thread ( void * arg )
  890. {
  891. ((Endpoint*)arg)->osc_thread();
  892. return NULL;
  893. }
  894. void
  895. Endpoint::osc_thread ( void )
  896. {
  897. _thread.name( "OSC" );
  898. DMESSAGE( "OSC Thread running" );
  899. run();
  900. }
  901. void
  902. Endpoint::start ( void )
  903. {
  904. if ( !_thread.clone( &Endpoint::osc_thread, this ) )
  905. FATAL( "Could not create OSC thread" );
  906. /* lo_server_thread_start( _st ); */
  907. }
  908. void
  909. Endpoint::stop ( void )
  910. {
  911. _thread.join();
  912. // lo_server_thread_stop( _st );
  913. }
  914. int
  915. Endpoint::port ( void ) const
  916. {
  917. return lo_server_get_port( _server );
  918. }
  919. char *
  920. Endpoint::url ( void ) const
  921. {
  922. return lo_server_get_url( _server );
  923. }
  924. /** Process any waiting events and return immediately */
  925. void
  926. Endpoint::check ( void ) const
  927. {
  928. wait( 0 );
  929. }
  930. /** Process any waiting events and return after timeout */
  931. void
  932. Endpoint::wait ( int timeout ) const
  933. {
  934. if ( lo_server_wait( _server, timeout ) )
  935. while ( lo_server_recv_noblock( _server, 0 ) ) { }
  936. }
  937. /** Process events forever */
  938. void
  939. Endpoint::run ( void ) const
  940. {
  941. for ( ;; )
  942. {
  943. lo_server_recv( _server );
  944. }
  945. }
  946. int
  947. Endpoint::send ( lo_address to, const char *path, std::list< OSC_Value > values )
  948. {
  949. lo_message m = lo_message_new();
  950. for ( std::list< OSC_Value >::const_iterator i = values.begin();
  951. i != values.end();
  952. ++i )
  953. {
  954. const OSC_Value *ov = &(*i);
  955. switch ( ov->type() )
  956. {
  957. case 'f':
  958. // DMESSAGE( "Adding float %f", ((OSC_Float*)ov)->value() );
  959. lo_message_add_float( m, ((OSC_Float*)ov)->value() );
  960. break;
  961. case 'i':
  962. // DMESSAGE( "Adding int %i", ((OSC_Int*)ov)->value() );
  963. lo_message_add_int32( m, ((OSC_Int*)ov)->value() );
  964. break;
  965. case 's':
  966. // DMESSAGE( "Adding string %s", ((OSC_String*)ov)->value() );
  967. lo_message_add_string( m, ((OSC_String*)ov)->value() );
  968. break;
  969. default:
  970. FATAL( "Unknown format: %c", ov->type() );
  971. break;
  972. }
  973. }
  974. // DMESSAGE( "Path: %s", path );
  975. lo_bundle b = lo_bundle_new( LO_TT_IMMEDIATE );
  976. lo_bundle_add_message(b, path, m );
  977. int r = lo_send_bundle_from( to, _server, b );
  978. // int r = lo_send_message_from( to, _server, path, m );
  979. // lo_message_free( m );
  980. return r;
  981. }
  982. int
  983. Endpoint::send ( lo_address to, const char *path )
  984. {
  985. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "" );
  986. }
  987. int
  988. Endpoint::send ( lo_address to, const char *path, int v )
  989. {
  990. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "i", v );
  991. }
  992. int
  993. Endpoint::send ( lo_address to, const char *path, float v )
  994. {
  995. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "f", v );
  996. }
  997. int
  998. Endpoint::send ( lo_address to, const char *path, double v )
  999. {
  1000. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "d", v );
  1001. }
  1002. int
  1003. Endpoint::send ( lo_address to, const char *path, const char * v )
  1004. {
  1005. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "s", v );
  1006. }
  1007. int
  1008. Endpoint::send ( lo_address to, const char *path, const char * v1, float v2 )
  1009. {
  1010. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sf", v1, v2 );
  1011. }
  1012. int
  1013. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2 )
  1014. {
  1015. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ss", v1, v2 );
  1016. }
  1017. int
  1018. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2, const char *v3 )
  1019. {
  1020. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sss", v1, v2, v3 );
  1021. }
  1022. int
  1023. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, int v4 )
  1024. {
  1025. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siii", v1, v2, v3, v4 );
  1026. }
  1027. int
  1028. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, int v4, int v5 )
  1029. {
  1030. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssiii", v1, v2, v3, v4, v5 );
  1031. }
  1032. int
  1033. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, int v5, int v6 )
  1034. {
  1035. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssiii", v1, v2, v3, v4, v5, v6 );
  1036. }
  1037. int
  1038. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2 )
  1039. {
  1040. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "si", v1, v2 );
  1041. }
  1042. int
  1043. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2 )
  1044. {
  1045. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "is", v1, v2 );
  1046. }
  1047. int
  1048. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3 )
  1049. {
  1050. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sis", v1, v2, v3 );
  1051. }
  1052. int
  1053. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2, const char *v3, const char *v4 )
  1054. {
  1055. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "isss", v1, v2, v3, v4 );
  1056. }
  1057. int
  1058. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3, const char *v4, const char *v5 )
  1059. {
  1060. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sisss", v1, v2, v3, v4, v5 );
  1061. }
  1062. int
  1063. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4, const char *v5 )
  1064. {
  1065. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssss", v1, v2, v3, v4, v5 );
  1066. }
  1067. int
  1068. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4 )
  1069. {
  1070. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssss", v1, v2, v3, v4 );
  1071. }
  1072. int
  1073. Endpoint::send ( lo_address to, const char *path, lo_message msg )
  1074. {
  1075. return lo_send_message_from( to, _server, path, msg );
  1076. }
  1077. int
  1078. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, float v4, float v5, float v6 )
  1079. {
  1080. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssifff", v1, v2, v3, v4, v5, v6 );
  1081. }
  1082. int
  1083. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, float v5, float v6, float v7 )
  1084. {
  1085. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssifff", v1, v2, v3, v4, v5, v6, v7 );
  1086. }
  1087. int
  1088. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, float v4, float v5, float v6 )
  1089. {
  1090. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssfff", v1, v2, v3, v4, v5, v6 );
  1091. }
  1092. int
  1093. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3 )
  1094. {
  1095. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sii", v1, v2, v3 );
  1096. }
  1097. int
  1098. Endpoint::send ( lo_address to, const char *path, int v1, int v2 )
  1099. {
  1100. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ii", v1, v2 );
  1101. }
  1102. int
  1103. Endpoint::send ( lo_address to, const char *path, int v1, float v2 )
  1104. {
  1105. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "if", v1, v2 );
  1106. }
  1107. int
  1108. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, float v4 )
  1109. {
  1110. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siif", v1, v2, v3, v4 );
  1111. }
  1112. int
  1113. Endpoint::send ( lo_address to, const char *path, int v1, int v2, float v3 )
  1114. {
  1115. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "iif", v1, v2, v3 );
  1116. }
  1117. }