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.

804 lines
22KB

  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. void
  47. Signal::value ( float f )
  48. {
  49. for ( std::list<Target*>::const_iterator i = _outgoing.begin();
  50. i != _outgoing.end();
  51. ++i )
  52. {
  53. // DMESSAGE( "Sending signal value %i %f", (*i)->signal_id, f );
  54. if ( (*i)->value != f )
  55. {
  56. (*i)->value = f;
  57. _endpoint->send( (*i)->peer->addr,
  58. "/signal/change",
  59. (*i)->signal_id,
  60. f );
  61. }
  62. }
  63. }
  64. void
  65. Endpoint::error_handler(int num, const char *msg, const char *path)
  66. {
  67. WARNING( "LibLO server error %d in path %s: %s\n", num, path, msg);
  68. }
  69. Endpoint::Endpoint ( )
  70. {
  71. }
  72. int
  73. Endpoint::init ( const char *port )
  74. {
  75. DMESSAGE( "Creating OSC server" );
  76. _server = lo_server_new( port, error_handler );
  77. if ( ! _server )
  78. {
  79. WARNING( "Error creating OSC server" );
  80. return -1;
  81. }
  82. add_method( "/signal/change", "if", &Endpoint::osc_sig_handler, this, "" );
  83. add_method( NULL, "", &Endpoint::osc_generic, this, "" );
  84. add_method( NULL, NULL, &Endpoint::osc_signal_lister, this, "" );
  85. add_method( "/reply", NULL, &Endpoint::osc_reply, this, "" );
  86. return 0;
  87. }
  88. Endpoint::~Endpoint ( )
  89. {
  90. // lo_server_thread_free( _st );
  91. lo_server_free( _server );
  92. }
  93. OSC::Target *
  94. Endpoint::find_target_by_peer_address ( std::list<Target*> *l, lo_address addr )
  95. {
  96. for ( std::list<Target*>::iterator i = l->begin();
  97. i != l->end();
  98. ++i )
  99. {
  100. if ( address_matches( addr, (*i)->peer->addr ) )
  101. {
  102. return *i;
  103. }
  104. }
  105. return NULL;
  106. }
  107. OSC::Signal *
  108. Endpoint::find_signal_by_id ( int id )
  109. {
  110. for ( std::list<Signal*>::iterator i = _signals.begin();
  111. i != _signals.end();
  112. ++i )
  113. {
  114. if ( (*i)->id() == id )
  115. return *i;
  116. }
  117. }
  118. int
  119. Endpoint::osc_sig_handler ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  120. {
  121. Signal *o;
  122. float f = 0.0;
  123. if ( !strcmp( path, "/signal/change" ) && !strcmp( types, "if" ) )
  124. {
  125. /* accept a value for numbered signal */
  126. int id = argv[0]->i;
  127. f = argv[1]->f;
  128. o = ((Endpoint*)user_data)->find_signal_by_id( id );
  129. if ( ! o )
  130. {
  131. WARNING( "Unknown signal id %i", id );
  132. return 0;
  133. }
  134. }
  135. else if ( ! strcmp( types, "f" ) )
  136. {
  137. /* accept a value for signal named in path */
  138. o = (Signal*)user_data;
  139. f = argv[0]->f;
  140. }
  141. else if ( ! types || 0 == types[0] )
  142. {
  143. /* reply with current value */
  144. o = (Signal*)user_data;
  145. o->_endpoint->send( lo_message_get_source( msg ), "/reply", path, o->value() );
  146. }
  147. else
  148. {
  149. return -1;
  150. }
  151. Target *t = NULL;
  152. if ( 0 == o->_incoming.size() ||
  153. ! ( t = find_target_by_peer_address( &o->_incoming, lo_message_get_source( msg ) ) ) )
  154. {
  155. /* message came from an unconnected peer, just set the value exactly */
  156. }
  157. else
  158. {
  159. /* message is from a connected source, do mixing. */
  160. t->value = f;
  161. f = 0.0;
  162. for ( std::list<Target*>::const_iterator i = o->_incoming.begin();
  163. i != o->_incoming.end();
  164. ++i )
  165. {
  166. f += (*i)->value;
  167. }
  168. }
  169. o->_value = f;
  170. o->_handler( f, o->_user_data );
  171. return 0;
  172. }
  173. int
  174. Endpoint::osc_generic ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  175. {
  176. // OSC_DMSG();
  177. if ( path[ strlen(path) - 1 ] != '/' )
  178. return -1;
  179. Endpoint *ep = (Endpoint*)user_data;
  180. for ( std::list<Method*>::const_iterator i = ep->_methods.begin(); i != ep->_methods.end(); ++i )
  181. {
  182. if ( ! (*i)->path() )
  183. continue;
  184. if (! strncmp( (*i)->path(), path, strlen(path) ) )
  185. {
  186. /* asprintf( &stored_path, "%s (%s); %s", path, typespec, argument_description ); */
  187. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path, (*i)->path() );
  188. }
  189. }
  190. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path );
  191. return 0;
  192. }
  193. int
  194. Endpoint::osc_signal_lister ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  195. {
  196. // OSC_DMSG();
  197. Signal::Direction dir;
  198. if ( ! strcmp( path, "/signal/list_inputs" ) )
  199. {
  200. dir = Signal::Input;
  201. }
  202. else if ( ! strcmp( path, "/signal/list_outputs" ) )
  203. {
  204. dir = Signal::Output;
  205. }
  206. else
  207. return -1;
  208. const char *prefix = NULL;
  209. if ( argc )
  210. prefix = &argv[0]->s;
  211. Endpoint *ep = (Endpoint*)user_data;
  212. for ( std::list<Signal*>::const_iterator i = ep->_signals.begin(); i != ep->_signals.end(); ++i )
  213. {
  214. Signal *o = *i;
  215. if ( dir == Signal::Bidirectional ||
  216. dir == o->_direction )
  217. {
  218. if ( ! prefix || ! strncmp( o->path(), prefix, strlen(prefix) ) )
  219. {
  220. ep->send( lo_message_get_source( msg ),
  221. "/reply",
  222. path,
  223. o->path(),
  224. o->id(),
  225. o->parameter_limits().min,
  226. o->parameter_limits().max,
  227. o->parameter_limits().default_value
  228. );
  229. }
  230. }
  231. }
  232. ep->send( lo_message_get_source( msg ), "/reply", path );
  233. return 0;
  234. }
  235. bool
  236. Endpoint::address_matches ( lo_address addr1, lo_address addr2 )
  237. {
  238. char *purl = strdup( lo_address_get_port( addr1 ) );
  239. char *url = strdup( lo_address_get_port( addr2 ) );
  240. bool r = !strcmp( purl, url );
  241. free( purl );
  242. free( url );
  243. return r;
  244. }
  245. void
  246. Endpoint::list_peers ( void (*callback) (const char *, const char *, int, void * ), void *v )
  247. {
  248. for ( std::list<Peer*>::iterator i = _peers.begin();
  249. i != _peers.end();
  250. ++i )
  251. {
  252. for ( std::list<Signal*>::iterator j = (*i)->_signals.begin();
  253. j != (*i)->_signals.end();
  254. ++j )
  255. {
  256. // DMESSAGE( "Running callback" );
  257. callback( (*i)->name, (*j)->path(), (*j)->id(), v );
  258. }
  259. }
  260. }
  261. Peer *
  262. Endpoint::find_peer_by_address ( lo_address addr )
  263. {
  264. char *url = strdup( lo_address_get_port( addr ) );
  265. Peer *p = NULL;
  266. for ( std::list<Peer*>::iterator i = _peers.begin();
  267. i != _peers.end();
  268. ++i )
  269. {
  270. char *purl = strdup( lo_address_get_port( (*i)->addr ) );
  271. if ( !strcmp( purl, url ) )
  272. {
  273. free( purl );
  274. p = *i;
  275. break;
  276. }
  277. free(purl);
  278. }
  279. free( url );
  280. return p;
  281. }
  282. Peer *
  283. Endpoint::find_peer_by_name ( const char *name )
  284. {
  285. for ( std::list<Peer*>::iterator i = _peers.begin();
  286. i != _peers.end();
  287. ++i )
  288. {
  289. if ( !strcmp( name, (*i)->name ) )
  290. {
  291. return *i;
  292. }
  293. }
  294. return NULL;
  295. }
  296. /* First part of 'to' is a peer name */
  297. bool
  298. Endpoint::connect_signal( OSC::Signal *s, const char *peer_name, int signal_id )
  299. {
  300. if ( s->_direction == Signal::Output )
  301. {
  302. Peer *p = find_peer_by_name( peer_name );
  303. MESSAGE( "Connecting signal output \"%s\" to %s:%i", s->path(), peer_name, signal_id );
  304. if ( p )
  305. {
  306. Target *t = new Target();
  307. t->peer = p;
  308. t->signal_id = signal_id;
  309. s->_outgoing.push_back( t );
  310. send( p->addr, "/signal/connect",
  311. 0, /* FIXME: our signal id */
  312. 0 /* FIXME: their signal id */ );
  313. return true;
  314. }
  315. }
  316. return false;
  317. }
  318. int
  319. Endpoint::osc_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  320. {
  321. Endpoint *ep = (Endpoint*)user_data;
  322. if ( argc && !strcmp( &argv[0]->s, "/signal/list_inputs" ) )
  323. {
  324. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  325. if ( ! p )
  326. {
  327. WARNING( "Got input list reply from unknown peer." );
  328. return 0;
  329. }
  330. if ( argc == 1 )
  331. {
  332. p->_scanning = false;
  333. DMESSAGE( "Done scanning %s", p->name );
  334. }
  335. else if ( p->_scanning )
  336. {
  337. DMESSAGE( "Peer %s has signal %s", p->name, &argv[1]->s );
  338. Signal *s = new Signal( &argv[1]->s, Signal::Input );
  339. s->_id = argv[2]->i;
  340. s->parameter_limits().min = argv[3]->f;
  341. s->parameter_limits().max = argv[4]->f;
  342. s->parameter_limits().default_value = argv[4]->f;
  343. p->_signals.push_back( s );
  344. }
  345. return 0;
  346. }
  347. else
  348. return -1;
  349. }
  350. Method *
  351. Endpoint::add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description )
  352. {
  353. // DMESSAGE( "Added OSC method %s (%s)", path, typespec );
  354. lo_server_add_method( _server, path, typespec, handler, user_data );
  355. Method *md = new Method;
  356. if ( path )
  357. md->_path = strdup( path );
  358. if ( typespec )
  359. md->_typespec = strdup( typespec );
  360. if ( argument_description )
  361. md->_documentation = strdup( argument_description );
  362. if ( typespec )
  363. md->_parameter_limits = new Parameter_Limits[strlen(typespec)];
  364. _methods.push_back( md );
  365. return md;
  366. }
  367. Signal *
  368. Endpoint::add_signal ( const char *path, Signal::Direction dir, signal_handler handler, void *user_data )
  369. {
  370. Signal *md = new Signal( path, dir );
  371. if ( path )
  372. md->_path = strdup( path );
  373. md->_handler = handler;
  374. md->_user_data = user_data;
  375. md->_endpoint = this;
  376. _signals.push_back( md );
  377. if ( dir == Signal::Input )
  378. {
  379. lo_server_add_method( _server, path, NULL, osc_sig_handler, md );
  380. }
  381. return md;
  382. }
  383. void
  384. Endpoint::del_method ( const char *path, const char *typespec )
  385. {
  386. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  387. lo_server_del_method( _server, path, typespec );
  388. for ( std::list<Method *>::iterator i = _methods.begin(); i != _methods.end(); ++i )
  389. {
  390. if ( ! (*i)->path() )
  391. continue;
  392. if ( ! strcmp( path, (*i)->path() ) &&
  393. ! strcmp( typespec, (*i)->typespec() ) )
  394. {
  395. delete *i;
  396. i = _methods.erase( i );
  397. break;
  398. }
  399. }
  400. }
  401. void
  402. Endpoint::del_method ( Method *meth )
  403. {
  404. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  405. lo_server_del_method( _server, meth->path(), meth->typespec() );
  406. delete meth;
  407. _methods.remove( meth );
  408. }
  409. void
  410. Endpoint::del_signal ( Signal *o )
  411. {
  412. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  413. lo_server_del_method( _server, o->path(), "f" );
  414. delete o;
  415. _signals.remove( o );
  416. }
  417. void
  418. Endpoint::scan_peer ( const char *name, const char *url )
  419. {
  420. Peer *p = new Peer;
  421. p->name = strdup( name );
  422. p->addr = lo_address_new_from_url( url );
  423. p->_scanning = true;
  424. _peers.push_back( p );
  425. send( p->addr, "/signal/list_inputs" );
  426. }
  427. void *
  428. Endpoint::osc_thread ( void * arg )
  429. {
  430. ((Endpoint*)arg)->osc_thread();
  431. return NULL;
  432. }
  433. void
  434. Endpoint::osc_thread ( void )
  435. {
  436. _thread.name( "OSC" );
  437. DMESSAGE( "OSC Thread running" );
  438. run();
  439. }
  440. void
  441. Endpoint::start ( void )
  442. {
  443. if ( !_thread.clone( &Endpoint::osc_thread, this ) )
  444. FATAL( "Could not create OSC thread" );
  445. /* lo_server_thread_start( _st ); */
  446. }
  447. void
  448. Endpoint::stop ( void )
  449. {
  450. _thread.join();
  451. // lo_server_thread_stop( _st );
  452. }
  453. int
  454. Endpoint::port ( void ) const
  455. {
  456. return lo_server_get_port( _server );
  457. }
  458. char *
  459. Endpoint::url ( void ) const
  460. {
  461. return lo_server_get_url( _server );
  462. }
  463. /** Process any waiting events and return immediately */
  464. void
  465. Endpoint::check ( void ) const
  466. {
  467. wait( 0 );
  468. }
  469. /** Process any waiting events and return after timeout */
  470. void
  471. Endpoint::wait ( int timeout ) const
  472. {
  473. if ( lo_server_wait( _server, timeout ) )
  474. while ( lo_server_recv_noblock( _server, 0 ) ) { }
  475. }
  476. /** Process events forever */
  477. void
  478. Endpoint::run ( void ) const
  479. {
  480. for ( ;; )
  481. {
  482. lo_server_recv( _server );
  483. }
  484. }
  485. int
  486. Endpoint::send ( lo_address to, const char *path, std::list< OSC_Value > values )
  487. {
  488. lo_message m = lo_message_new();
  489. for ( std::list< OSC_Value >::const_iterator i = values.begin();
  490. i != values.end();
  491. ++i )
  492. {
  493. const OSC_Value *ov = &(*i);
  494. switch ( ov->type() )
  495. {
  496. case 'f':
  497. DMESSAGE( "Adding float %f", ((OSC_Float*)ov)->value() );
  498. lo_message_add_float( m, ((OSC_Float*)ov)->value() );
  499. break;
  500. case 'i':
  501. DMESSAGE( "Adding int %i", ((OSC_Int*)ov)->value() );
  502. lo_message_add_int32( m, ((OSC_Int*)ov)->value() );
  503. break;
  504. case 's':
  505. DMESSAGE( "Adding string %s", ((OSC_String*)ov)->value() );
  506. lo_message_add_string( m, ((OSC_String*)ov)->value() );
  507. break;
  508. default:
  509. FATAL( "Unknown format: %c", ov->type() );
  510. break;
  511. }
  512. }
  513. DMESSAGE( "Path: %s", path );
  514. lo_bundle b = lo_bundle_new( LO_TT_IMMEDIATE );
  515. lo_bundle_add_message(b, path, m );
  516. int r = lo_send_bundle_from( to, _server, b );
  517. // int r = lo_send_message_from( to, _server, path, m );
  518. // lo_message_free( m );
  519. return r;
  520. }
  521. int
  522. Endpoint::send ( lo_address to, const char *path )
  523. {
  524. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "" );
  525. }
  526. int
  527. Endpoint::send ( lo_address to, const char *path, int v )
  528. {
  529. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "i", v );
  530. }
  531. int
  532. Endpoint::send ( lo_address to, const char *path, float v )
  533. {
  534. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "f", v );
  535. }
  536. int
  537. Endpoint::send ( lo_address to, const char *path, double v )
  538. {
  539. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "d", v );
  540. }
  541. int
  542. Endpoint::send ( lo_address to, const char *path, const char * v )
  543. {
  544. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "s", v );
  545. }
  546. int
  547. Endpoint::send ( lo_address to, const char *path, const char * v1, float v2 )
  548. {
  549. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sf", v1, v2 );
  550. }
  551. int
  552. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2 )
  553. {
  554. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ss", v1, v2 );
  555. }
  556. int
  557. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2, const char *v3 )
  558. {
  559. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sss", v1, v2, v3 );
  560. }
  561. int
  562. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, int v4 )
  563. {
  564. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siii", v1, v2, v3, v4 );
  565. }
  566. int
  567. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, int v4, int v5 )
  568. {
  569. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssiii", v1, v2, v3, v4, v5 );
  570. }
  571. int
  572. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, int v5, int v6 )
  573. {
  574. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssiii", v1, v2, v3, v4, v5, v6 );
  575. }
  576. int
  577. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2 )
  578. {
  579. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "si", v1, v2 );
  580. }
  581. int
  582. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2 )
  583. {
  584. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "is", v1, v2 );
  585. }
  586. int
  587. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3 )
  588. {
  589. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sis", v1, v2, v3 );
  590. }
  591. int
  592. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2, const char *v3, const char *v4 )
  593. {
  594. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "isss", v1, v2, v3, v4 );
  595. }
  596. int
  597. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3, const char *v4, const char *v5 )
  598. {
  599. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sisss", v1, v2, v3, v4, v5 );
  600. }
  601. int
  602. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4, const char *v5 )
  603. {
  604. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssss", v1, v2, v3, v4, v5 );
  605. }
  606. int
  607. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4 )
  608. {
  609. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssss", v1, v2, v3, v4 );
  610. }
  611. int
  612. Endpoint::send ( lo_address to, const char *path, lo_message msg )
  613. {
  614. return lo_send_message_from( to, _server, path, msg );
  615. }
  616. int
  617. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, float v4, float v5, float v6 )
  618. {
  619. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssifff", v1, v2, v3, v4, v5, v6 );
  620. }
  621. int
  622. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3 )
  623. {
  624. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sii", v1, v2, v3 );
  625. }
  626. int
  627. Endpoint::send ( lo_address to, const char *path, int v1, int v2 )
  628. {
  629. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ii", v1, v2 );
  630. }
  631. int
  632. Endpoint::send ( lo_address to, const char *path, int v1, float v2 )
  633. {
  634. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "if", v1, v2 );
  635. }
  636. }