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.

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