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.

1405 lines
38KB

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