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.

1336 lines
35KB

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