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.

1561 lines
43KB

  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. const char**
  494. Endpoint::get_connections ( const char *path )
  495. {
  496. const char ** conn = NULL;
  497. int j = 0;
  498. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  499. i != _translations.end();
  500. i++ )
  501. {
  502. if ( !strcmp( i->second.path.c_str(), path ) )
  503. {
  504. conn = (const char**)realloc( conn, sizeof( char * ) * (j+2));
  505. conn[j++] = i->first.c_str();
  506. }
  507. }
  508. if ( conn )
  509. conn[j] = 0;
  510. return conn;
  511. }
  512. void
  513. Endpoint::clear_translations ( void )
  514. {
  515. _translations.clear();
  516. }
  517. void
  518. Endpoint::add_translation ( const char *a, const char *b )
  519. {
  520. _translations[a].path = b;
  521. }
  522. void
  523. Endpoint::del_translation ( const char *a )
  524. {
  525. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  526. if ( i != _translations.end() )
  527. _translations.erase( i );
  528. }
  529. void
  530. Endpoint::rename_translation_destination ( const char *a, const char *b )
  531. {
  532. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  533. i != _translations.end();
  534. i++ )
  535. {
  536. if ( !strcmp( i->second.path.c_str(), a ) )
  537. {
  538. i->second.path = b;
  539. }
  540. }
  541. }
  542. void
  543. Endpoint::rename_translation_source ( const char *a, const char *b )
  544. {
  545. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  546. if ( i != _translations.end() )
  547. {
  548. _translations[b] = _translations[a];
  549. _translations.erase( i );
  550. }
  551. }
  552. int
  553. Endpoint::ntranslations ( void )
  554. {
  555. return _translations.size();
  556. }
  557. bool
  558. Endpoint::get_translation ( int n, const char **from, const char **to )
  559. {
  560. int j = 0;
  561. for ( std::map<std::string,TranslationDestination>::const_iterator i = _translations.begin();
  562. i != _translations.end();
  563. i++, j++)
  564. {
  565. if ( j == n )
  566. {
  567. *from = i->first.c_str();
  568. *to = i->second.path.c_str();
  569. return true;
  570. }
  571. }
  572. return false;
  573. }
  574. int
  575. Endpoint::osc_generic ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  576. {
  577. // OSC_DMSG();
  578. Endpoint *ep = (Endpoint*)user_data;
  579. if ( ep->_learning_path )
  580. {
  581. ep->add_translation( path, ep->_learning_path );
  582. DMESSAGE( "Learned translation \"%s\" -> \"%s\"", path, ep->_learning_path );
  583. free(ep->_learning_path);
  584. ep->_learning_path = NULL;
  585. return 0;
  586. }
  587. {
  588. std::map<std::string,TranslationDestination>::iterator i = ep->_translations.find( path );
  589. if ( i != ep->_translations.end() )
  590. {
  591. const char *dpath = i->second.path.c_str();
  592. // DMESSAGE( "Translating message \"%s\" to \"%s\"", path, dpath );
  593. if ( !strcmp(types, "f" ))
  594. {
  595. // DMESSAGE( "recording value %f", argv[0]->f );
  596. i->second.current_value = argv[0]->f;
  597. }
  598. i->second.suppress_feedback = true;
  599. lo_send_message(ep->_addr, dpath, msg );
  600. return 0;
  601. }
  602. }
  603. if ( argc || path[ strlen(path) - 1 ] != '/' )
  604. return -1;
  605. for ( std::list<Method*>::const_iterator i = ep->_methods.begin(); i != ep->_methods.end(); ++i )
  606. {
  607. if ( ! (*i)->path() )
  608. continue;
  609. if (! strncmp( (*i)->path(), path, strlen(path) ) )
  610. {
  611. /* asprintf( &stored_path, "%s (%s); %s", path, typespec, argument_description ); */
  612. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path, (*i)->path() );
  613. }
  614. }
  615. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path );
  616. return 0;
  617. }
  618. int
  619. Endpoint::osc_signal_lister ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  620. {
  621. // OSC_DMSG();
  622. DMESSAGE( "Listing signals." );
  623. const char *prefix = NULL;
  624. if ( argc )
  625. prefix = &argv[0]->s;
  626. Endpoint *ep = (Endpoint*)user_data;
  627. for ( std::list<Signal*>::const_iterator i = ep->_signals.begin(); i != ep->_signals.end(); ++i )
  628. {
  629. Signal *o = *i;
  630. if ( ! prefix || ! strncmp( o->path(), prefix, strlen(prefix) ) )
  631. {
  632. ep->send( lo_message_get_source( msg ),
  633. "/reply",
  634. path,
  635. o->path(),
  636. o->_direction == Signal::Input ? "in" : "out",
  637. o->parameter_limits().min,
  638. o->parameter_limits().max,
  639. o->parameter_limits().default_value
  640. );
  641. }
  642. }
  643. ep->send( lo_message_get_source( msg ), "/reply", path );
  644. return 0;
  645. }
  646. bool
  647. Endpoint::address_matches ( lo_address addr1, lo_address addr2 )
  648. {
  649. char *purl = strdup( lo_address_get_port( addr1 ) );
  650. char *url = strdup( lo_address_get_port( addr2 ) );
  651. bool r = !strcmp( purl, url );
  652. free( purl );
  653. free( url );
  654. return r;
  655. }
  656. void
  657. Endpoint::list_peer_signals ( void *v )
  658. {
  659. for ( std::list<Peer*>::iterator i = _peers.begin();
  660. i != _peers.end();
  661. ++i )
  662. {
  663. for ( std::list<Signal*>::iterator j = (*i)->_signals.begin();
  664. j != (*i)->_signals.end();
  665. ++j )
  666. {
  667. if ( _peer_signal_notification_callback )
  668. _peer_signal_notification_callback( *j, OSC::Signal::Created, v );
  669. }
  670. }
  671. }
  672. Peer *
  673. Endpoint::find_peer_by_address ( lo_address addr )
  674. {
  675. char *url = strdup( lo_address_get_port( addr ) );
  676. Peer *p = NULL;
  677. for ( std::list<Peer*>::iterator i = _peers.begin();
  678. i != _peers.end();
  679. ++i )
  680. {
  681. char *purl = strdup( lo_address_get_port( (*i)->addr ) );
  682. if ( !strcmp( purl, url ) )
  683. {
  684. free( purl );
  685. p = *i;
  686. break;
  687. }
  688. free(purl);
  689. }
  690. free( url );
  691. return p;
  692. }
  693. Peer *
  694. Endpoint::find_peer_by_name ( const char *name )
  695. {
  696. for ( std::list<Peer*>::iterator i = _peers.begin();
  697. i != _peers.end();
  698. ++i )
  699. {
  700. if ( !strcmp( name, (*i)->name ) )
  701. {
  702. return *i;
  703. }
  704. }
  705. return NULL;
  706. }
  707. bool
  708. Endpoint::disconnect_signal ( OSC::Signal *s, OSC::Signal *d )
  709. {
  710. /* if ( ! s->is_connected_to( d ) ) */
  711. /* return false; */
  712. if ( d->_peer )
  713. {
  714. MESSAGE( "Disconnecting signal output \"%s\" from %s:%s", s->path(), d->_peer->name, d->_path );
  715. /* send( d->_peer->addr, "/signal/disconnect", */
  716. /* s->_id, /\* our signal id *\/ */
  717. /* d->_id /\* their signal id *\/ ); */
  718. }
  719. else
  720. {
  721. /* MESSAGE( "Disconnecting signal output \"%s\" to (unknown):%i", s->path(), d->_id ); */
  722. }
  723. s->_outgoing.remove( d );
  724. d->_incoming.remove( s );
  725. return true;
  726. }
  727. bool
  728. Endpoint::disconnect_signal ( OSC::Signal *s, const char *signal_path )
  729. {
  730. if ( s->_direction == Signal::Output )
  731. {
  732. /* Peer *p = find_peer_by_name( peer_name ); */
  733. /* if ( ! p ) */
  734. /* return false; */
  735. Signal *ps = find_signal_by_path( signal_path );
  736. if ( ! ps )
  737. return false;
  738. if ( ! s->is_connected_to( ps ) )
  739. return false;
  740. return disconnect_signal( s, ps );
  741. }
  742. return false;
  743. }
  744. /* bool */
  745. /* Endpoint::connect_signal ( OSC::Signal *s, OSC::Signal *d ) */
  746. /* { */
  747. /* /\* if ( s->is_connected_to( d ) ) *\/ */
  748. /* /\* { *\/ */
  749. /* /\* return false; *\/ */
  750. /* /\* } *\/ */
  751. /* MESSAGE( "Connecting signal output \"%s\" to %s:%s", s->path(), d->_peer->name, d->path() ); */
  752. /* s->_outgoing.push_back( d ); */
  753. /* /\* make a record of it ourselves *\/ */
  754. /* d->_incoming.push_back( s ); */
  755. /* send( d->_peer->addr, "/signal/connect", */
  756. /* s->path(), */
  757. /* d->path() ); */
  758. /* return true; */
  759. /* } */
  760. bool
  761. Endpoint::connect_signal( OSC::Signal *s, const char *signal_path )
  762. {
  763. if ( s->_direction == Signal::Output )
  764. {
  765. for ( std::list<Peer*>::iterator i = _peers.begin();
  766. i != _peers.end();
  767. i++ )
  768. {
  769. send( (*i)->addr, "/signal/connect",
  770. s->path(),
  771. signal_path );
  772. }
  773. }
  774. return true;
  775. }
  776. int
  777. Endpoint::osc_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  778. {
  779. Endpoint *ep = (Endpoint*)user_data;
  780. if ( argc && !strcmp( &argv[0]->s, "/signal/list" ) )
  781. {
  782. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  783. if ( ! p )
  784. {
  785. WARNING( "Got input list reply from unknown peer." );
  786. return 0;
  787. }
  788. if ( argc == 1 )
  789. {
  790. p->_scanning = false;
  791. DMESSAGE( "Done scanning %s", p->name );
  792. if ( ep->_peer_scan_complete_callback )
  793. ep->_peer_scan_complete_callback(ep->_peer_scan_complete_userdata);
  794. }
  795. else if ( argc == 6 && p->_scanning )
  796. {
  797. Signal *s = ep->find_peer_signal_by_path( p, &argv[1]->s );
  798. if ( s )
  799. return 0;
  800. DMESSAGE( "Peer %s has signal %s (%s)", p->name, &argv[1]->s, &argv[2]->s );
  801. int dir = 0;
  802. if ( !strcmp( &argv[2]->s, "in" ) )
  803. dir = Signal::Input;
  804. else if ( !strcmp( &argv[2]->s, "out" ) )
  805. dir = Signal::Output;
  806. s = new Signal( &argv[1]->s, (Signal::Direction)dir );
  807. s->_peer = p;
  808. s->parameter_limits( argv[3]->f, argv[4]->f, argv[5]->f );
  809. p->_signals.push_back( s );
  810. // ep->_signals.push_back(s);
  811. if ( ep->_peer_signal_notification_callback )
  812. ep->_peer_signal_notification_callback( s, Signal::Created, ep->_peer_signal_notification_userdata );
  813. }
  814. return 0;
  815. }
  816. else
  817. return -1;
  818. }
  819. Method *
  820. Endpoint::add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description )
  821. {
  822. // DMESSAGE( "Added OSC method %s (%s)", path, typespec );
  823. lo_server_add_method( _server, path, typespec, handler, user_data );
  824. Method *md = new Method;
  825. if ( path )
  826. md->_path = strdup( path );
  827. if ( typespec )
  828. md->_typespec = strdup( typespec );
  829. if ( argument_description )
  830. md->_documentation = strdup( argument_description );
  831. _methods.push_back( md );
  832. return md;
  833. }
  834. Signal *
  835. Endpoint::add_signal ( const char *path, Signal::Direction dir, float min, float max, float default_value, signal_handler handler, void *user_data )
  836. {
  837. Signal *o = new Signal( path, dir );
  838. char *s;
  839. asprintf( &s, "%s%s", name(), path );
  840. if ( s )
  841. o->_path = s;
  842. o->_handler = handler;
  843. o->_user_data = user_data;
  844. o->_endpoint = this;
  845. o->parameter_limits( min, max, default_value );
  846. _signals.push_back( o );
  847. /* if ( dir == Signal::Input ) */
  848. /* { */
  849. lo_server_add_method( _server, o->_path, NULL, osc_sig_handler, o );
  850. /* } */
  851. /* tell our peers about it */
  852. for ( std::list<Peer*>::iterator i = _peers.begin();
  853. i != _peers.end();
  854. ++i )
  855. {
  856. send( (*i)->addr,
  857. "/signal/created",
  858. o->path(),
  859. o->_direction == Signal::Input ? "in" : "out",
  860. min,
  861. max,
  862. default_value
  863. );
  864. }
  865. return o;
  866. }
  867. void
  868. Endpoint::del_method ( const char *path, const char *typespec )
  869. {
  870. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  871. lo_server_del_method( _server, path, typespec );
  872. for ( std::list<Method *>::iterator i = _methods.begin(); i != _methods.end(); ++i )
  873. {
  874. if ( ! (*i)->path() )
  875. continue;
  876. if ( ! strcmp( path, (*i)->path() ) &&
  877. ! strcmp( typespec, (*i)->typespec() ) )
  878. {
  879. delete *i;
  880. i = _methods.erase( i );
  881. break;
  882. }
  883. }
  884. }
  885. void
  886. Endpoint::del_method ( Method *meth )
  887. {
  888. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  889. lo_server_del_method( _server, meth->path(), meth->typespec() );
  890. delete meth;
  891. _methods.remove( meth );
  892. }
  893. void
  894. Endpoint::del_signal ( Signal *o )
  895. {
  896. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  897. lo_server_del_method( _server, o->path(), "f" );
  898. /* tell our peers about it */
  899. for ( std::list<Peer*>::iterator i = _peers.begin();
  900. i != _peers.end();
  901. ++i )
  902. {
  903. send( (*i)->addr,
  904. "/signal/removed",
  905. o->path() );
  906. }
  907. Endpoint *ep = this;
  908. /* /\* disconnect it *\/ */
  909. /* if ( o->_outgoing.size() ) */
  910. /* { */
  911. /* for ( std::list<Signal*>::iterator i = o->_outgoing.begin(); */
  912. /* i != o->_outgoing.end(); */
  913. /* ) */
  914. /* { */
  915. /* Signal *s = *i; */
  916. /* /\* avoid messing up iterator *\/ */
  917. /* ++i; */
  918. /* ep->disconnect_signal( o, s ); */
  919. /* } */
  920. /* } */
  921. /* if ( o->_incoming.size() ) */
  922. /* { */
  923. /* for ( std::list<Signal*>::iterator i = o->_incoming.begin(); */
  924. /* i != o->_incoming.end(); */
  925. /* ) */
  926. /* { */
  927. /* Signal *s = *i; */
  928. /* /\* avoid messing up iterator *\/ */
  929. /* ++i; */
  930. /* ep->disconnect_signal( s, o ); */
  931. /* } */
  932. /* } */
  933. /* FIXME: clear loopback connections first! */
  934. _signals.remove( o );
  935. }
  936. /* prepare to learn a translation for /path/. The next unhandled message to come through will be mapped to /path/ */
  937. void
  938. Endpoint::learn ( const char *path )
  939. {
  940. if ( _learning_path )
  941. free( _learning_path );
  942. _learning_path = NULL;
  943. if ( path )
  944. _learning_path = strdup( path );
  945. }
  946. /** if there's a translation with a destination of 'path', then send feedback for it */
  947. void
  948. Endpoint::send_feedback ( const char *path, float v )
  949. {
  950. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  951. i != _translations.end();
  952. i++ )
  953. {
  954. if ( ! strcmp( i->second.path.c_str(), path ) )
  955. {
  956. /* found it */
  957. if ( !i->second.suppress_feedback && i->second.current_value != v )
  958. {
  959. const char *spath = i->first.c_str();
  960. // DMESSAGE( "Sending feedback to \"%s\": %f", spath, v );
  961. /* send to all peers */
  962. for ( std::list<Peer*>::iterator p = _peers.begin();
  963. p != _peers.end();
  964. ++p )
  965. {
  966. send( (*p)->addr, spath, v );
  967. }
  968. i->second.current_value = v;
  969. }
  970. i->second.suppress_feedback = false;
  971. /* break; */
  972. }
  973. }
  974. }
  975. Peer *
  976. Endpoint::add_peer ( const char *name, const char *url )
  977. {
  978. Peer *p = new Peer;
  979. DMESSAGE( "Adding peer %s @ %s...", name, url );
  980. p->name = strdup( name );
  981. p->addr = lo_address_new_from_url( url );
  982. _peers.push_back( p );
  983. return p;
  984. }
  985. void
  986. Endpoint::scan_peer ( const char *name, const char *url )
  987. {
  988. Peer *p = add_peer(name,url);
  989. p->_scanning = true;
  990. DMESSAGE( "Scanning peer %s", name );
  991. send( p->addr, "/signal/list" );
  992. }
  993. void *
  994. Endpoint::osc_thread ( void * arg )
  995. {
  996. ((Endpoint*)arg)->osc_thread();
  997. return NULL;
  998. }
  999. void
  1000. Endpoint::osc_thread ( void )
  1001. {
  1002. _thread.name( "OSC" );
  1003. DMESSAGE( "OSC Thread running" );
  1004. run();
  1005. }
  1006. void
  1007. Endpoint::start ( void )
  1008. {
  1009. if ( !_thread.clone( &Endpoint::osc_thread, this ) )
  1010. FATAL( "Could not create OSC thread" );
  1011. /* lo_server_thread_start( _st ); */
  1012. }
  1013. void
  1014. Endpoint::stop ( void )
  1015. {
  1016. _thread.join();
  1017. // lo_server_thread_stop( _st );
  1018. }
  1019. int
  1020. Endpoint::port ( void ) const
  1021. {
  1022. return lo_server_get_port( _server );
  1023. }
  1024. char *
  1025. Endpoint::url ( void ) const
  1026. {
  1027. return lo_server_get_url( _server );
  1028. }
  1029. /** Process any waiting events and return immediately */
  1030. void
  1031. Endpoint::check ( void ) const
  1032. {
  1033. wait( 0 );
  1034. }
  1035. /** Process any waiting events and return after timeout */
  1036. void
  1037. Endpoint::wait ( int timeout ) const
  1038. {
  1039. if ( lo_server_wait( _server, timeout ) )
  1040. while ( lo_server_recv_noblock( _server, 0 ) ) { }
  1041. }
  1042. /** Process events forever */
  1043. void
  1044. Endpoint::run ( void ) const
  1045. {
  1046. for ( ;; )
  1047. {
  1048. lo_server_recv( _server );
  1049. }
  1050. }
  1051. int
  1052. Endpoint::send ( lo_address to, const char *path, std::list< OSC_Value > values )
  1053. {
  1054. lo_message m = lo_message_new();
  1055. for ( std::list< OSC_Value >::const_iterator i = values.begin();
  1056. i != values.end();
  1057. ++i )
  1058. {
  1059. const OSC_Value *ov = &(*i);
  1060. switch ( ov->type() )
  1061. {
  1062. case 'f':
  1063. // DMESSAGE( "Adding float %f", ((OSC_Float*)ov)->value() );
  1064. lo_message_add_float( m, ((OSC_Float*)ov)->value() );
  1065. break;
  1066. case 'i':
  1067. // DMESSAGE( "Adding int %i", ((OSC_Int*)ov)->value() );
  1068. lo_message_add_int32( m, ((OSC_Int*)ov)->value() );
  1069. break;
  1070. case 's':
  1071. // DMESSAGE( "Adding string %s", ((OSC_String*)ov)->value() );
  1072. lo_message_add_string( m, ((OSC_String*)ov)->value() );
  1073. break;
  1074. default:
  1075. FATAL( "Unknown format: %c", ov->type() );
  1076. break;
  1077. }
  1078. }
  1079. // DMESSAGE( "Path: %s", path );
  1080. lo_bundle b = lo_bundle_new( LO_TT_IMMEDIATE );
  1081. lo_bundle_add_message(b, path, m );
  1082. int r = lo_send_bundle_from( to, _server, b );
  1083. // int r = lo_send_message_from( to, _server, path, m );
  1084. // lo_message_free( m );
  1085. return r;
  1086. }
  1087. int
  1088. Endpoint::send ( lo_address to, const char *path )
  1089. {
  1090. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "" );
  1091. }
  1092. int
  1093. Endpoint::send ( lo_address to, const char *path, int v )
  1094. {
  1095. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "i", v );
  1096. }
  1097. int
  1098. Endpoint::send ( lo_address to, const char *path, float v )
  1099. {
  1100. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "f", v );
  1101. }
  1102. int
  1103. Endpoint::send ( lo_address to, const char *path, double v )
  1104. {
  1105. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "d", v );
  1106. }
  1107. int
  1108. Endpoint::send ( lo_address to, const char *path, const char * v )
  1109. {
  1110. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "s", v );
  1111. }
  1112. int
  1113. Endpoint::send ( lo_address to, const char *path, const char * v1, float v2 )
  1114. {
  1115. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sf", v1, v2 );
  1116. }
  1117. int
  1118. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2 )
  1119. {
  1120. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ss", v1, v2 );
  1121. }
  1122. int
  1123. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2, const char *v3 )
  1124. {
  1125. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sss", v1, v2, v3 );
  1126. }
  1127. int
  1128. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, int v4 )
  1129. {
  1130. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siii", v1, v2, v3, v4 );
  1131. }
  1132. int
  1133. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, int v4, int v5 )
  1134. {
  1135. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssiii", v1, v2, v3, v4, v5 );
  1136. }
  1137. int
  1138. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, int v5, int v6 )
  1139. {
  1140. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssiii", v1, v2, v3, v4, v5, v6 );
  1141. }
  1142. int
  1143. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2 )
  1144. {
  1145. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "si", v1, v2 );
  1146. }
  1147. int
  1148. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2 )
  1149. {
  1150. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "is", v1, v2 );
  1151. }
  1152. int
  1153. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3 )
  1154. {
  1155. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sis", v1, v2, v3 );
  1156. }
  1157. int
  1158. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2, const char *v3, const char *v4 )
  1159. {
  1160. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "isss", v1, v2, v3, v4 );
  1161. }
  1162. int
  1163. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3, const char *v4, const char *v5 )
  1164. {
  1165. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sisss", v1, v2, v3, v4, v5 );
  1166. }
  1167. int
  1168. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4, const char *v5 )
  1169. {
  1170. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssss", v1, v2, v3, v4, v5 );
  1171. }
  1172. int
  1173. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4 )
  1174. {
  1175. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssss", v1, v2, v3, v4 );
  1176. }
  1177. int
  1178. Endpoint::send ( lo_address to, const char *path, lo_message msg )
  1179. {
  1180. return lo_send_message_from( to, _server, path, msg );
  1181. }
  1182. int
  1183. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, float v4, float v5, float v6 )
  1184. {
  1185. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssifff", v1, v2, v3, v4, v5, v6 );
  1186. }
  1187. int
  1188. 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 )
  1189. {
  1190. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssifff", v1, v2, v3, v4, v5, v6, v7 );
  1191. }
  1192. int
  1193. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, float v4, float v5, float v6 )
  1194. {
  1195. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssfff", v1, v2, v3, v4, v5, v6 );
  1196. }
  1197. int
  1198. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3 )
  1199. {
  1200. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sii", v1, v2, v3 );
  1201. }
  1202. int
  1203. Endpoint::send ( lo_address to, const char *path, int v1, int v2 )
  1204. {
  1205. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ii", v1, v2 );
  1206. }
  1207. int
  1208. Endpoint::send ( lo_address to, const char *path, int v1, float v2 )
  1209. {
  1210. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "if", v1, v2 );
  1211. }
  1212. int
  1213. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, float v4 )
  1214. {
  1215. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siif", v1, v2, v3, v4 );
  1216. }
  1217. int
  1218. Endpoint::send ( lo_address to, const char *path, int v1, int v2, float v3 )
  1219. {
  1220. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "iif", v1, v2, v3 );
  1221. }
  1222. }