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.

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