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.

1428 lines
39KB

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