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.

1538 lines
42KB

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