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.

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