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.

1376 lines
36KB

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