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.

1519 lines
40KB

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