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.

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