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.

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