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.

1426 lines
39KB

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