Non reinvents the DAW. Powerful enough to form a complete studio, fast and light enough to run on low-end hardware like the eeePC or Raspberry Pi, and so reliable that it can be used live https://non.tuxfamily.org/
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.

1554 lines
42KB

  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 <unistd.h>
  25. #include "Endpoint.H"
  26. #include "Thread.H"
  27. #pragma GCC diagnostic ignored "-Wunused-parameter"
  28. static int SCAN_BATCH_SIZE = 100;
  29. namespace OSC
  30. {
  31. /**********/
  32. /* Method */
  33. /**********/
  34. Method::Method ( )
  35. {
  36. _path = _typespec = _documentation = 0;
  37. }
  38. Method::~Method ( )
  39. {
  40. if ( _path )
  41. free( _path );
  42. if ( _typespec )
  43. free( _typespec );
  44. if ( _documentation )
  45. free( _documentation );
  46. }
  47. /**********/
  48. /* Signal */
  49. /**********/
  50. Signal::Signal ( const char *path, Direction dir )
  51. {
  52. _direction = dir;
  53. _path = NULL;
  54. if ( path )
  55. _path = strdup( path );
  56. _value = 0.0f;
  57. _endpoint = NULL;
  58. _peer = NULL;
  59. _documentation = 0;
  60. _user_data = 0;
  61. _connection_state_callback = 0;
  62. _connection_state_userdata = 0;
  63. }
  64. Signal::~Signal ( )
  65. {
  66. if ( _endpoint )
  67. {
  68. _endpoint->del_signal( this );
  69. }
  70. if ( _path )
  71. free( _path );
  72. _path = NULL;
  73. _endpoint = NULL;
  74. }
  75. void
  76. Signal::rename ( const char *path )
  77. {
  78. char *new_path;
  79. asprintf( &new_path, "%s%s", _endpoint->name() ? _endpoint->name() : "", path );
  80. DMESSAGE( "Renaming signal %s to %s", this->path(), new_path );
  81. /* if ( _direction == Signal::Input ) */
  82. /* { */
  83. lo_server_del_method( _endpoint->_server, _path, NULL );
  84. lo_server_add_method( _endpoint->_server, new_path, NULL, _endpoint->osc_sig_handler, this );
  85. /* } */
  86. for ( std::list<Peer*>::iterator i = _endpoint->_peers.begin();
  87. i != _endpoint->_peers.end();
  88. ++i )
  89. {
  90. _endpoint->send( (*i)->addr, "/signal/renamed", _path, new_path );
  91. }
  92. _endpoint->rename_translation_destination( _path, new_path );
  93. free( _path );
  94. _path = new_path;
  95. }
  96. void
  97. Signal::value ( float f )
  98. {
  99. if ( f == _value )
  100. return;
  101. _value = f;
  102. if ( direction() == Output )
  103. {
  104. for ( std::list<Peer*>::iterator i = _endpoint->_peers.begin();
  105. i != _endpoint->_peers.end();
  106. ++i )
  107. {
  108. _endpoint->send( (*i)->addr,
  109. path(),
  110. f );
  111. }
  112. // free(s);
  113. }
  114. /* else if ( direction() == Input ) */
  115. /* { */
  116. /* DMESSAGE( "Sending value feedback for signal %s...", path() ); */
  117. /* for ( std::list<Signal*>::iterator i = _incoming.begin(); */
  118. /* i != _incoming.end(); */
  119. /* ++i ) */
  120. /* { */
  121. /* DMESSAGE( "Sending value feedback to %s %s %f", lo_address_get_url( (*i)->_peer->addr), (*i)->path() , f); */
  122. /* _endpoint->send( (*i)->_peer->addr, */
  123. /* (*i)->path(), */
  124. /* f ); */
  125. /* } */
  126. /* } */
  127. }
  128. /* char * */
  129. /* Signal::get_output_connection_peer_name_and_path ( int n ) */
  130. /* { */
  131. /* Signal *t = NULL; */
  132. /* int j = 0; */
  133. /* for ( std::list<Signal*>::const_iterator i = _outgoing.begin(); */
  134. /* i != _outgoing.end(); */
  135. /* ++i, ++j ) */
  136. /* { */
  137. /* if ( j == n ) */
  138. /* { */
  139. /* t = *i; */
  140. /* break; */
  141. /* } */
  142. /* } */
  143. /* if ( t ) */
  144. /* { */
  145. /* char *r; */
  146. /* asprintf( &r, "%s%s", t->_peer->name, t->path() ); */
  147. /* return r; */
  148. /* } */
  149. /* else */
  150. /* return NULL; */
  151. /* } */
  152. /* */
  153. void
  154. Endpoint::error_handler(int num, const char *msg, const char *path)
  155. {
  156. WARNING( "LibLO server error %d in path %s: %s\n", num, path, msg);
  157. }
  158. Endpoint::Endpoint ( )
  159. {
  160. _learning_path = NULL;
  161. _learning_callback = NULL;
  162. _peer_signal_notification_callback = 0;
  163. _peer_signal_notification_userdata = 0;
  164. _peer_scan_complete_callback = 0;
  165. _peer_scan_complete_userdata = 0;
  166. _server = 0;
  167. _name = 0;
  168. owner = 0;
  169. }
  170. int
  171. Endpoint::init ( int proto, const char *port )
  172. {
  173. DMESSAGE( "Creating OSC server" );
  174. _server = lo_server_new_with_proto( port, proto, error_handler );
  175. char *url = lo_server_get_url( _server );
  176. _addr = lo_address_new_from_url( url );
  177. free( url );
  178. if ( ! _server )
  179. {
  180. WARNING( "Error creating OSC server" );
  181. return -1;
  182. }
  183. add_method( "/signal/hello", "ss", &Endpoint::osc_sig_hello, this, "" );
  184. add_method( "/signal/connect", "ss", &Endpoint::osc_sig_connect, this, "" );
  185. add_method( "/signal/disconnect", "ss", &Endpoint::osc_sig_disconnect, this, "" );
  186. add_method( "/signal/renamed", "ss", &Endpoint::osc_sig_renamed, this, "" );
  187. add_method( "/signal/removed", "s", &Endpoint::osc_sig_removed, this, "" );
  188. add_method( "/signal/created", "ssfff", &Endpoint::osc_sig_created, this, "" );
  189. add_method( "/signal/list", NULL, &Endpoint::osc_signal_lister, this, "" );
  190. add_method( "/reply", NULL, &Endpoint::osc_reply, this, "" );
  191. add_method( NULL, NULL, &Endpoint::osc_generic, this, "" );
  192. return 0;
  193. }
  194. Endpoint::~Endpoint ( )
  195. {
  196. // lo_server_thread_free( _st );
  197. for ( std::list<Method*>::iterator i = _methods.begin();
  198. i != _methods.end();
  199. i++ )
  200. delete(*i);
  201. _methods.clear();
  202. if ( _server )
  203. {
  204. lo_server_free( _server );
  205. _server = 0;
  206. }
  207. lo_address_free( _addr );
  208. _addr = 0;
  209. }
  210. OSC::Signal *
  211. Endpoint::find_target_by_peer_address ( std::list<Signal*> *l, lo_address addr )
  212. {
  213. for ( std::list<Signal*>::iterator i = l->begin();
  214. i != l->end();
  215. ++i )
  216. {
  217. if ( address_matches( addr, (*i)->_peer->addr ) )
  218. {
  219. return *i;
  220. }
  221. }
  222. return NULL;
  223. }
  224. OSC::Signal *
  225. Endpoint::find_peer_signal_by_path ( Peer *p, const char *path )
  226. {
  227. for ( std::list<Signal*>::iterator i = p->_signals.begin();
  228. i != p->_signals.end();
  229. ++i )
  230. {
  231. if ( !strcmp( (*i)->path(), path ) )
  232. return *i;
  233. }
  234. return NULL;
  235. }
  236. OSC::Signal *
  237. Endpoint::find_signal_by_path ( const char *path )
  238. {
  239. for ( std::list<Signal*>::iterator i = _signals.begin();
  240. i != _signals.end();
  241. ++i )
  242. {
  243. if ( !strcmp( (*i)->path(), path ) )
  244. return *i;
  245. }
  246. return NULL;
  247. }
  248. void
  249. Endpoint::hello ( const char *url )
  250. {
  251. assert( name() );
  252. lo_address addr = lo_address_new_from_url ( url );
  253. char *our_url = this->url();
  254. send( addr, "/signal/hello", name(), our_url );
  255. free( our_url );
  256. lo_address_free( addr );
  257. }
  258. void
  259. Endpoint::handle_hello ( const char *peer_name, const char *peer_url )
  260. {
  261. DMESSAGE( "Got hello from %s", peer_name );
  262. Peer *p = find_peer_by_name( peer_name );
  263. if ( ! p )
  264. {
  265. scan_peer( peer_name, peer_url );
  266. }
  267. else
  268. {
  269. /* maybe the peer has a new URL */
  270. /* update address */
  271. lo_address addr = lo_address_new_from_url( peer_url );
  272. if ( address_matches( addr, p->addr ) )
  273. {
  274. free( addr );
  275. return;
  276. }
  277. if ( p->addr )
  278. free( p->addr );
  279. p->addr = addr;
  280. /* scan it while we're at it */
  281. p->_scanning = true;
  282. DMESSAGE( "Scanning peer %s", peer_name );
  283. send( p->addr, "/signal/list" );
  284. }
  285. if ( name() )
  286. {
  287. hello( peer_url );
  288. }
  289. else
  290. {
  291. DMESSAGE( "Not sending hello because we don't have a name yet!" );
  292. }
  293. }
  294. int
  295. Endpoint::osc_sig_hello ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  296. {
  297. Endpoint *ep = (Endpoint*)user_data;
  298. const char *peer_name = &argv[0]->s;
  299. const char *peer_url = &argv[1]->s;
  300. ep->handle_hello( peer_name, peer_url );
  301. return 0;
  302. }
  303. int
  304. Endpoint::osc_sig_disconnect ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  305. {
  306. const char *their_name = &argv[0]->s;
  307. const char *our_name = &argv[1]->s;
  308. Endpoint *ep = (Endpoint*)user_data;
  309. Signal *s = ep->find_signal_by_path( our_name );
  310. if ( ! s )
  311. return 0;
  312. if ( s->_direction == Signal::Input )
  313. {
  314. DMESSAGE( "Peer %s has disconnected from signal %s", our_name, their_name );
  315. ep->del_translation( their_name );
  316. if ( s->_connection_state_callback )
  317. s->_connection_state_callback( s, s->_connection_state_userdata );
  318. return 0;
  319. }
  320. return 0;
  321. }
  322. int
  323. Endpoint::osc_sig_connect ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  324. {
  325. const char *src_path = &argv[0]->s;
  326. const char *dst_path = &argv[1]->s;
  327. Endpoint *ep = (Endpoint*)user_data;
  328. Signal *dst_s = ep->find_signal_by_path( dst_path );
  329. if ( ! dst_s )
  330. {
  331. WARNING( "Unknown destination signal in connection attempt: \"%s\"", dst_path );
  332. return 0;
  333. }
  334. if ( dst_s->_endpoint != ep )
  335. {
  336. WARNING( "Got connection request for a destination signal we don't own" );
  337. return 0;
  338. }
  339. DMESSAGE( "Has requested signal connection %s |> %s", src_path, dst_s->path() );
  340. ep->add_translation( src_path, dst_s->path() );
  341. /* if ( dst_s->_connection_state_callback ) */
  342. /* dst_s->_connection_state_callback( dst_s, dst_s->_connection_state_userdata ); */
  343. return 0;
  344. }
  345. int
  346. Endpoint::osc_sig_removed ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  347. {
  348. const char *name = &argv[0]->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 removed notification from unknown peer." );
  354. return 0;
  355. }
  356. Signal *o = ep->find_peer_signal_by_path( p, name );
  357. if ( ! o )
  358. {
  359. WARNING( "Unknown signal: %s", name );
  360. return 0;
  361. }
  362. DMESSAGE( "Signal %s:%s was removed", o->_peer->name, o->path() );
  363. if ( ep->_peer_signal_notification_callback )
  364. ep->_peer_signal_notification_callback( o, Signal::Removed, ep->_peer_signal_notification_userdata );
  365. p->_signals.remove(o);
  366. delete o;
  367. return 0;
  368. }
  369. int
  370. Endpoint::osc_sig_created ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  371. {
  372. Endpoint *ep = (Endpoint*)user_data;
  373. const char *name = &argv[0]->s;
  374. const char *direction = &argv[1]->s;
  375. const float min = argv[2]->f;
  376. const float max = argv[3]->f;
  377. const float default_value = argv[4]->f;
  378. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  379. if ( ! p )
  380. {
  381. WARNING( "Got signal creation notification from unknown peer" );
  382. return 0;
  383. }
  384. Signal::Direction dir = Signal::Input;
  385. if ( !strcmp( direction, "in" ) )
  386. dir = Signal::Input;
  387. else if ( !strcmp( direction, "out" ) )
  388. dir = Signal::Output;
  389. Signal *s = new Signal( name, dir );
  390. s->_peer = p;
  391. s->parameter_limits( min, max, default_value );
  392. p->_signals.push_back( s );
  393. DMESSAGE( "Peer %s has created signal %s (%s %f %f %f)", p->name,
  394. name, direction, min, max, default_value );
  395. if ( ep->_peer_signal_notification_callback )
  396. ep->_peer_signal_notification_callback( s, Signal::Created, ep->_peer_signal_notification_userdata );
  397. return 0;
  398. }
  399. int
  400. Endpoint::osc_sig_renamed ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  401. {
  402. DMESSAGE( "Got renamed message." );
  403. const char *old_name = &argv[0]->s;
  404. const char *new_name = &argv[1]->s;
  405. Endpoint *ep = (Endpoint*)user_data;
  406. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  407. if ( ! p )
  408. {
  409. WARNING( "Got signal rename notification from unknown peer." );
  410. return 0;
  411. }
  412. Signal *o = ep->find_peer_signal_by_path( p, old_name );
  413. if ( ! o )
  414. {
  415. WARNING( "Unknown signal: %s", old_name );
  416. return 0;
  417. }
  418. DMESSAGE( "Signal %s was renamed to %s", o->_path, new_name );
  419. ep->rename_translation_source( o->_path, new_name );
  420. free( o->_path );
  421. o->_path = strdup( new_name );
  422. return 0;
  423. }
  424. int
  425. Endpoint::osc_sig_handler ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  426. {
  427. Signal *o;
  428. float f = 0.0;
  429. if ( ! strcmp( types, "f" ) )
  430. {
  431. /* accept a value for signal named in path */
  432. o = (Signal*)user_data;
  433. f = argv[0]->f;
  434. }
  435. else if ( ! types || 0 == types[0] )
  436. {
  437. /* reply with current value */
  438. o = (Signal*)user_data;
  439. o->_endpoint->send( lo_message_get_source( msg ), "/reply", path, o->value() );
  440. return 0;
  441. }
  442. else
  443. {
  444. return -1;
  445. }
  446. o->_value = f;
  447. if ( o->_handler )
  448. o->_handler( f, o->_user_data );
  449. return 1;
  450. }
  451. const char**
  452. Endpoint::get_connections ( const char *path )
  453. {
  454. const char ** conn = NULL;
  455. int j = 0;
  456. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  457. i != _translations.end();
  458. i++ )
  459. {
  460. if ( !strcmp( i->second.path.c_str(), path ) )
  461. {
  462. conn = (const char**)realloc( conn, sizeof( char * ) * (j+2));
  463. conn[j++] = i->first.c_str();
  464. }
  465. }
  466. if ( conn )
  467. conn[j] = 0;
  468. return conn;
  469. }
  470. void
  471. Endpoint::clear_translations ( void )
  472. {
  473. _translations.clear();
  474. }
  475. void
  476. Endpoint::add_translation ( const char *a, const char *b )
  477. {
  478. _translations[a].path = b;
  479. }
  480. void
  481. Endpoint::del_translation ( const char *a )
  482. {
  483. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  484. if ( i != _translations.end() )
  485. _translations.erase( i );
  486. }
  487. void
  488. Endpoint::rename_translation_destination ( const char *a, const char *b )
  489. {
  490. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  491. i != _translations.end();
  492. i++ )
  493. {
  494. if ( !strcmp( i->second.path.c_str(), a ) )
  495. {
  496. i->second.path = b;
  497. }
  498. }
  499. }
  500. void
  501. Endpoint::rename_translation_source ( const char *a, const char *b )
  502. {
  503. std::map<std::string,TranslationDestination>::iterator i = _translations.find( a );
  504. if ( i != _translations.end() )
  505. {
  506. _translations[b] = _translations[a];
  507. _translations.erase( i );
  508. }
  509. }
  510. int
  511. Endpoint::ntranslations ( void )
  512. {
  513. return _translations.size();
  514. }
  515. bool
  516. Endpoint::get_translation ( int n, const char **from, const char **to )
  517. {
  518. int j = 0;
  519. for ( std::map<std::string,TranslationDestination>::const_iterator i = _translations.begin();
  520. i != _translations.end();
  521. i++, j++)
  522. {
  523. if ( j == n )
  524. {
  525. *from = i->first.c_str();
  526. *to = i->second.path.c_str();
  527. return true;
  528. }
  529. }
  530. return false;
  531. }
  532. int
  533. Endpoint::osc_generic ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  534. {
  535. // OSC_DMSG();
  536. Endpoint *ep = (Endpoint*)user_data;
  537. if ( ep->_learning_path )
  538. {
  539. ep->add_translation( path, ep->_learning_path );
  540. DMESSAGE( "Learned translation \"%s\" -> \"%s\"", path, ep->_learning_path );
  541. free(ep->_learning_path);
  542. ep->_learning_callback(ep->_learning_userdata);
  543. ep->_learning_userdata = NULL;
  544. ep->_learning_callback = NULL;
  545. ep->_learning_path = NULL;
  546. return 0;
  547. }
  548. {
  549. std::map<std::string,TranslationDestination>::iterator i = ep->_translations.find( path );
  550. if ( i != ep->_translations.end() )
  551. {
  552. const char *dpath = i->second.path.c_str();
  553. // DMESSAGE( "Translating message \"%s\" to \"%s\"", path, dpath );
  554. if ( !strcmp(types, "f" ))
  555. {
  556. // DMESSAGE( "recording value %f", argv[0]->f );
  557. i->second.current_value = argv[0]->f;
  558. }
  559. /* FIXME: this was intended to break feedback cycles, but it actually
  560. results in some feedback values not being sent at all */
  561. /* i->second.suppress_feedback = true; */
  562. lo_send_message(ep->_addr, dpath, msg );
  563. return 0;
  564. }
  565. }
  566. if ( argc || path[ strlen(path) - 1 ] != '/' )
  567. return -1;
  568. for ( std::list<Method*>::const_iterator i = ep->_methods.begin(); i != ep->_methods.end(); ++i )
  569. {
  570. if ( ! (*i)->path() )
  571. continue;
  572. if (! strncmp( (*i)->path(), path, strlen(path) ) )
  573. {
  574. /* asprintf( &stored_path, "%s (%s); %s", path, typespec, argument_description ); */
  575. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path, (*i)->path() );
  576. }
  577. }
  578. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path );
  579. return 0;
  580. }
  581. int
  582. Endpoint::osc_signal_lister ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  583. {
  584. // OSC_DMSG();
  585. const char *prefix = NULL;
  586. int skip = 0;
  587. bool batch_mode = true;
  588. int start;
  589. const int count = SCAN_BATCH_SIZE;
  590. if ( 's' == types[0] )
  591. {
  592. prefix = &argv[0]->s;
  593. DMESSAGE( "Listing signals for prefix \"%s\"", prefix );
  594. skip++;
  595. batch_mode = 2 == argc;
  596. }
  597. else
  598. {
  599. DMESSAGE( "Listing all signals." );
  600. }
  601. if ( 0 == argc || 's' == types[0] )
  602. {
  603. /* obsolete unbatched mode left for backwards compatibility... */
  604. WARNING("Peer asked for unbatched signal list... will incur delays!");
  605. batch_mode = false;
  606. }
  607. else
  608. {
  609. /* we have to list these in batches, otherwise they the UDP packets overrun and get dropped... Probably
  610. wouldn't be an issue with TCP transport. */
  611. batch_mode = true;
  612. start = argv[0+skip]->i;
  613. /* count = argv[1+skip]->i; */
  614. }
  615. Endpoint *ep = (Endpoint*)user_data;
  616. int sent = 0;
  617. int s = 0;
  618. bool more = false;
  619. lo_bundle b;
  620. if ( batch_mode )
  621. {
  622. b = lo_bundle_new(LO_TT_IMMEDIATE);
  623. }
  624. for ( std::list<Signal*>::const_iterator i = ep->_signals.begin(); i != ep->_signals.end(); ++i )
  625. {
  626. Signal *o = *i;
  627. if ( ! prefix || ! strncmp( o->path(), prefix, strlen(prefix) ) )
  628. {
  629. if ( s++ < start )
  630. continue;
  631. /* DMESSAGE( "Listing signal %s", o->path() ); */
  632. if ( batch_mode )
  633. {
  634. lo_message m = lo_message_new();
  635. lo_message_add_string( m, path );
  636. lo_message_add_string( m, o->path() );
  637. lo_message_add_string( m, o->_direction == Signal::Input ? "in" : "out" );
  638. lo_message_add_float( m, o->parameter_limits().min );
  639. lo_message_add_float( m, o->parameter_limits().max );
  640. lo_message_add_float( m, o->parameter_limits().default_value );
  641. lo_bundle_add_message( b, "/reply", m );
  642. }
  643. else
  644. {
  645. ep->send( lo_message_get_source( msg ),
  646. "/reply",
  647. path,
  648. o->path(),
  649. o->_direction == Signal::Input ? "in" : "out",
  650. o->parameter_limits().min,
  651. o->parameter_limits().max,
  652. o->parameter_limits().default_value
  653. );
  654. }
  655. if ( batch_mode )
  656. {
  657. if ( ++sent == count )
  658. {
  659. more = true;
  660. break;
  661. }
  662. }
  663. else
  664. {
  665. usleep(1000);
  666. }
  667. }
  668. }
  669. if ( batch_mode )
  670. {
  671. lo_message m = lo_message_new();
  672. lo_message_add_string(m, path);
  673. lo_message_add_int32( m, sent );
  674. lo_message_add_int32( m, more );
  675. lo_bundle_add_message( b, "/reply", m );
  676. lo_send_bundle_from( lo_message_get_source( msg ), ep->_server, b );
  677. /* ep->send( lo_message_get_source( msg ), "/reply", path, sent, more ); */
  678. }
  679. else
  680. ep->send( lo_message_get_source( msg ), "/reply", path );
  681. return 0;
  682. }
  683. bool
  684. Endpoint::address_matches ( lo_address addr1, lo_address addr2 )
  685. {
  686. char *purl = strdup( lo_address_get_port( addr1 ) );
  687. char *url = strdup( lo_address_get_port( addr2 ) );
  688. bool r = !strcmp( purl, url );
  689. free( purl );
  690. free( url );
  691. return r;
  692. }
  693. void
  694. Endpoint::list_peer_signals ( void *v )
  695. {
  696. for ( std::list<Peer*>::iterator i = _peers.begin();
  697. i != _peers.end();
  698. ++i )
  699. {
  700. for ( std::list<Signal*>::iterator j = (*i)->_signals.begin();
  701. j != (*i)->_signals.end();
  702. ++j )
  703. {
  704. if ( _peer_signal_notification_callback )
  705. _peer_signal_notification_callback( *j, OSC::Signal::Created, v );
  706. }
  707. }
  708. }
  709. Peer *
  710. Endpoint::find_peer_by_address ( lo_address addr )
  711. {
  712. char *url = strdup( lo_address_get_port( addr ) );
  713. Peer *p = NULL;
  714. for ( std::list<Peer*>::iterator i = _peers.begin();
  715. i != _peers.end();
  716. ++i )
  717. {
  718. char *purl = strdup( lo_address_get_port( (*i)->addr ) );
  719. if ( !strcmp( purl, url ) )
  720. {
  721. free( purl );
  722. p = *i;
  723. break;
  724. }
  725. free(purl);
  726. }
  727. free( url );
  728. return p;
  729. }
  730. Peer *
  731. Endpoint::find_peer_by_name ( const char *name )
  732. {
  733. for ( std::list<Peer*>::iterator i = _peers.begin();
  734. i != _peers.end();
  735. ++i )
  736. {
  737. if ( !strcmp( name, (*i)->name ) )
  738. {
  739. return *i;
  740. }
  741. }
  742. return NULL;
  743. }
  744. bool
  745. Endpoint::disconnect_signal ( OSC::Signal *s, const char *signal_path )
  746. {
  747. if ( s->_direction == Signal::Output )
  748. {
  749. for ( std::list<Peer*>::iterator i = _peers.begin();
  750. i != _peers.end();
  751. ++i )
  752. {
  753. send( (*i)->addr, "/signal/disconnect",
  754. s->path(),
  755. signal_path);
  756. }
  757. return true;
  758. }
  759. return false;
  760. }
  761. bool
  762. Endpoint::connect_signal( OSC::Signal *s, const char *signal_path )
  763. {
  764. if ( s->_direction == Signal::Output )
  765. {
  766. for ( std::list<Peer*>::iterator i = _peers.begin();
  767. i != _peers.end();
  768. i++ )
  769. {
  770. send( (*i)->addr, "/signal/connect",
  771. s->path(),
  772. signal_path );
  773. }
  774. }
  775. return true;
  776. }
  777. int
  778. Endpoint::osc_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  779. {
  780. Endpoint *ep = (Endpoint*)user_data;
  781. if ( argc && !strcmp( &argv[0]->s, "/signal/list" ) )
  782. {
  783. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  784. if ( ! p )
  785. {
  786. WARNING( "Got input list reply from unknown peer." );
  787. return 0;
  788. }
  789. if ( argc == 1 )
  790. {
  791. /* old handler for backwards compatibility */
  792. p->_scanning = false;
  793. DMESSAGE( "Done scanning %s", p->name );
  794. if ( ep->_peer_scan_complete_callback )
  795. ep->_peer_scan_complete_callback(ep->_peer_scan_complete_userdata);
  796. }
  797. else
  798. if ( argc == 3 )
  799. {
  800. const int sent = argv[1]->i;
  801. const int more = argv[2]->i;
  802. if ( !more )
  803. {
  804. p->_scanning = false;
  805. DMESSAGE( "Done scanning %s", p->name );
  806. if ( ep->_peer_scan_complete_callback )
  807. ep->_peer_scan_complete_callback(ep->_peer_scan_complete_userdata);
  808. }
  809. else
  810. {
  811. DMESSAGE( "Scanning next batch %s", p->name );
  812. p->_scanning_current += sent;
  813. ep->send( p->addr, "/signal/list", p->_scanning_current );
  814. }
  815. }
  816. else if ( argc == 6 && p->_scanning )
  817. {
  818. Signal *s = ep->find_peer_signal_by_path( p, &argv[1]->s );
  819. if ( s )
  820. return 0;
  821. /* DMESSAGE( "Peer %s has signal %s (%s)", p->name, &argv[1]->s, &argv[2]->s ); */
  822. int dir = 0;
  823. if ( !strcmp( &argv[2]->s, "in" ) )
  824. dir = Signal::Input;
  825. else if ( !strcmp( &argv[2]->s, "out" ) )
  826. dir = Signal::Output;
  827. s = new Signal( &argv[1]->s, (Signal::Direction)dir );
  828. s->_peer = p;
  829. s->parameter_limits( argv[3]->f, argv[4]->f, argv[5]->f );
  830. p->_signals.push_back( s );
  831. // ep->_signals.push_back(s);
  832. if ( ep->_peer_signal_notification_callback )
  833. ep->_peer_signal_notification_callback( s, Signal::Created, ep->_peer_signal_notification_userdata );
  834. }
  835. return 0;
  836. }
  837. else
  838. return -1;
  839. }
  840. Method *
  841. Endpoint::add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description )
  842. {
  843. // DMESSAGE( "Added OSC method %s (%s)", path, typespec );
  844. lo_server_add_method( _server, path, typespec, handler, user_data );
  845. Method *md = new Method;
  846. if ( path )
  847. md->_path = strdup( path );
  848. if ( typespec )
  849. md->_typespec = strdup( typespec );
  850. if ( argument_description )
  851. md->_documentation = strdup( argument_description );
  852. _methods.push_back( md );
  853. return md;
  854. }
  855. Signal *
  856. Endpoint::add_signal ( const char *path, Signal::Direction dir, float min, float max, float default_value, signal_handler handler, void *user_data )
  857. {
  858. char *s;
  859. asprintf( &s, "%s%s", name() ? name() : "", path );
  860. Signal *o = new Signal( s, dir );
  861. free(s);
  862. o->_handler = handler;
  863. o->_user_data = user_data;
  864. o->_endpoint = this;
  865. o->parameter_limits( min, max, default_value );
  866. _signals.push_back( o );
  867. /* if ( dir == Signal::Input ) */
  868. /* { */
  869. lo_server_add_method( _server, o->_path, NULL, osc_sig_handler, o );
  870. /* } */
  871. /* tell our peers about it */
  872. for ( std::list<Peer*>::iterator i = _peers.begin();
  873. i != _peers.end();
  874. ++i )
  875. {
  876. send( (*i)->addr,
  877. "/signal/created",
  878. o->path(),
  879. o->_direction == Signal::Input ? "in" : "out",
  880. min,
  881. max,
  882. default_value
  883. );
  884. }
  885. return o;
  886. }
  887. void
  888. Endpoint::del_method ( const char *path, const char *typespec )
  889. {
  890. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  891. lo_server_del_method( _server, path, typespec );
  892. for ( std::list<Method *>::iterator i = _methods.begin(); i != _methods.end(); ++i )
  893. {
  894. if ( ! (*i)->path() )
  895. continue;
  896. if ( ! strcmp( path, (*i)->path() ) &&
  897. ! strcmp( typespec, (*i)->typespec() ) )
  898. {
  899. delete *i;
  900. i = _methods.erase( i );
  901. break;
  902. }
  903. }
  904. }
  905. void
  906. Endpoint::del_method ( Method *meth )
  907. {
  908. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  909. lo_server_del_method( _server, meth->path(), meth->typespec() );
  910. delete meth;
  911. _methods.remove( meth );
  912. }
  913. void
  914. Endpoint::del_signal ( Signal *o )
  915. {
  916. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  917. lo_server_del_method( _server, o->path(), NULL );
  918. /* tell our peers about it */
  919. for ( std::list<Peer*>::iterator i = _peers.begin();
  920. i != _peers.end();
  921. ++i )
  922. {
  923. send( (*i)->addr,
  924. "/signal/removed",
  925. o->path() );
  926. }
  927. /* FIXME: clear loopback connections first! */
  928. _signals.remove( o );
  929. }
  930. /* prepare to learn a translation for /path/. The next unhandled message to come through will be mapped to /path/ */
  931. void
  932. Endpoint::learn ( const char *path, void (*callback)(void*), void *userdata )
  933. {
  934. if ( _learning_path )
  935. free( _learning_path );
  936. _learning_path = NULL;
  937. _learning_callback = callback;
  938. _learning_userdata = userdata;
  939. if ( path )
  940. _learning_path = strdup( path );
  941. }
  942. /** if there's a translation with a destination of 'path', then send feedback for it */
  943. void
  944. Endpoint::send_feedback ( const char *path, float v )
  945. {
  946. for ( std::map<std::string,TranslationDestination>::iterator i = _translations.begin();
  947. i != _translations.end();
  948. i++ )
  949. {
  950. if ( path && ! strcmp( i->second.path.c_str(), path ) )
  951. {
  952. /* found it */
  953. if ( !i->second.suppress_feedback && i->second.current_value != v )
  954. {
  955. const char *spath = i->first.c_str();
  956. // DMESSAGE( "Sending feedback to \"%s\": %f", spath, v );
  957. /* send to all peers */
  958. for ( std::list<Peer*>::iterator p = _peers.begin();
  959. p != _peers.end();
  960. ++p )
  961. {
  962. send( (*p)->addr, spath, v );
  963. }
  964. i->second.current_value = v;
  965. }
  966. i->second.suppress_feedback = false;
  967. /* break; */
  968. }
  969. }
  970. }
  971. Peer *
  972. Endpoint::add_peer ( const char *name, const char *url )
  973. {
  974. Peer *p = new Peer;
  975. DMESSAGE( "Adding peer %s @ %s...", name, url );
  976. p->name = strdup( name );
  977. p->addr = lo_address_new_from_url( url );
  978. _peers.push_back( p );
  979. return p;
  980. }
  981. void
  982. Endpoint::scan_peer ( const char *name, const char *url )
  983. {
  984. Peer *p = add_peer(name,url);
  985. p->_scanning = true;
  986. p->_scanning_current = 0;
  987. DMESSAGE( "Scanning peer %s", name );
  988. send( p->addr, "/signal/list", p->_scanning_current );
  989. }
  990. void *
  991. Endpoint::osc_thread ( void * arg )
  992. {
  993. ((Endpoint*)arg)->osc_thread();
  994. return NULL;
  995. }
  996. void
  997. Endpoint::osc_thread ( void )
  998. {
  999. _thread.name( "OSC" );
  1000. DMESSAGE( "OSC Thread running" );
  1001. run();
  1002. }
  1003. void
  1004. Endpoint::start ( void )
  1005. {
  1006. if ( !_thread.clone( &Endpoint::osc_thread, this ) )
  1007. FATAL( "Could not create OSC thread" );
  1008. /* lo_server_thread_start( _st ); */
  1009. }
  1010. void
  1011. Endpoint::stop ( void )
  1012. {
  1013. _thread.join();
  1014. // lo_server_thread_stop( _st );
  1015. }
  1016. int
  1017. Endpoint::port ( void ) const
  1018. {
  1019. return lo_server_get_port( _server );
  1020. }
  1021. char *
  1022. Endpoint::url ( void ) const
  1023. {
  1024. return lo_server_get_url( _server );
  1025. }
  1026. /** Process any waiting events and return immediately */
  1027. void
  1028. Endpoint::check ( void ) const
  1029. {
  1030. wait( 0 );
  1031. }
  1032. /** Process any waiting events and return after timeout */
  1033. void
  1034. Endpoint::wait ( int timeout ) const
  1035. {
  1036. if ( lo_server_wait( _server, timeout ) )
  1037. while ( lo_server_recv_noblock( _server, 0 ) ) { }
  1038. }
  1039. /** Process events forever */
  1040. void
  1041. Endpoint::run ( void ) const
  1042. {
  1043. for ( ;; )
  1044. {
  1045. lo_server_recv( _server );
  1046. }
  1047. }
  1048. int
  1049. Endpoint::send ( lo_address to, const char *path, std::list< OSC_Value > values )
  1050. {
  1051. lo_message m = lo_message_new();
  1052. for ( std::list< OSC_Value >::const_iterator i = values.begin();
  1053. i != values.end();
  1054. ++i )
  1055. {
  1056. const OSC_Value *ov = &(*i);
  1057. switch ( ov->type() )
  1058. {
  1059. case 'f':
  1060. // DMESSAGE( "Adding float %f", ((OSC_Float*)ov)->value() );
  1061. lo_message_add_float( m, ((OSC_Float*)ov)->value() );
  1062. break;
  1063. case 'i':
  1064. // DMESSAGE( "Adding int %i", ((OSC_Int*)ov)->value() );
  1065. lo_message_add_int32( m, ((OSC_Int*)ov)->value() );
  1066. break;
  1067. case 's':
  1068. // DMESSAGE( "Adding string %s", ((OSC_String*)ov)->value() );
  1069. lo_message_add_string( m, ((OSC_String*)ov)->value() );
  1070. break;
  1071. default:
  1072. FATAL( "Unknown format: %c", ov->type() );
  1073. break;
  1074. }
  1075. }
  1076. // DMESSAGE( "Path: %s", path );
  1077. lo_bundle b = lo_bundle_new( LO_TT_IMMEDIATE );
  1078. lo_bundle_add_message(b, path, m );
  1079. int r = lo_send_bundle_from( to, _server, b );
  1080. // int r = lo_send_message_from( to, _server, path, m );
  1081. // lo_message_free( m );
  1082. return r;
  1083. }
  1084. int
  1085. Endpoint::send ( lo_address to, const char *path )
  1086. {
  1087. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "" );
  1088. }
  1089. int
  1090. Endpoint::send ( lo_address to, const char *path, int v )
  1091. {
  1092. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "i", v );
  1093. }
  1094. int
  1095. Endpoint::send ( lo_address to, const char *path, float v )
  1096. {
  1097. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "f", v );
  1098. }
  1099. int
  1100. Endpoint::send ( lo_address to, const char *path, double v )
  1101. {
  1102. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "d", v );
  1103. }
  1104. int
  1105. Endpoint::send ( lo_address to, const char *path, const char * v )
  1106. {
  1107. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "s", v );
  1108. }
  1109. int
  1110. Endpoint::send ( lo_address to, const char *path, const char * v1, float v2 )
  1111. {
  1112. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sf", v1, v2 );
  1113. }
  1114. int
  1115. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2 )
  1116. {
  1117. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ss", v1, v2 );
  1118. }
  1119. int
  1120. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2, const char *v3 )
  1121. {
  1122. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sss", v1, v2, v3 );
  1123. }
  1124. int
  1125. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, int v4 )
  1126. {
  1127. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siii", v1, v2, v3, v4 );
  1128. }
  1129. int
  1130. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, int v4, int v5 )
  1131. {
  1132. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssiii", v1, v2, v3, v4, v5 );
  1133. }
  1134. int
  1135. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, int v5, int v6 )
  1136. {
  1137. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssiii", v1, v2, v3, v4, v5, v6 );
  1138. }
  1139. int
  1140. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2 )
  1141. {
  1142. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "si", v1, v2 );
  1143. }
  1144. int
  1145. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2 )
  1146. {
  1147. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "is", v1, v2 );
  1148. }
  1149. int
  1150. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3 )
  1151. {
  1152. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sis", v1, v2, v3 );
  1153. }
  1154. int
  1155. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2, const char *v3, const char *v4 )
  1156. {
  1157. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "isss", v1, v2, v3, v4 );
  1158. }
  1159. int
  1160. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3, const char *v4, const char *v5 )
  1161. {
  1162. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sisss", v1, v2, v3, v4, v5 );
  1163. }
  1164. int
  1165. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4, const char *v5 )
  1166. {
  1167. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssss", v1, v2, v3, v4, v5 );
  1168. }
  1169. int
  1170. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4 )
  1171. {
  1172. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssss", v1, v2, v3, v4 );
  1173. }
  1174. int
  1175. Endpoint::send ( lo_address to, const char *path, lo_message msg )
  1176. {
  1177. return lo_send_message_from( to, _server, path, msg );
  1178. }
  1179. int
  1180. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, float v4, float v5, float v6 )
  1181. {
  1182. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssifff", v1, v2, v3, v4, v5, v6 );
  1183. }
  1184. int
  1185. 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 )
  1186. {
  1187. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssifff", v1, v2, v3, v4, v5, v6, v7 );
  1188. }
  1189. int
  1190. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, float v4, float v5, float v6 )
  1191. {
  1192. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssfff", v1, v2, v3, v4, v5, v6 );
  1193. }
  1194. int
  1195. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3 )
  1196. {
  1197. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sii", v1, v2, v3 );
  1198. }
  1199. int
  1200. Endpoint::send ( lo_address to, const char *path, int v1, int v2 )
  1201. {
  1202. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ii", v1, v2 );
  1203. }
  1204. int
  1205. Endpoint::send ( lo_address to, const char *path, int v1, float v2 )
  1206. {
  1207. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "if", v1, v2 );
  1208. }
  1209. int
  1210. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, float v4 )
  1211. {
  1212. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siif", v1, v2, v3, v4 );
  1213. }
  1214. int
  1215. Endpoint::send ( lo_address to, const char *path, int v1, int v2, float v3 )
  1216. {
  1217. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "iif", v1, v2, v3 );
  1218. }
  1219. }