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.

961 lines
25KB

  1. /*******************************************************************************/
  2. /* Copyright (C) 2010 Jonathan Moore Liles */
  3. /* */
  4. /* This program is free software; you can redistribute it and/or modify it */
  5. /* under the terms of the GNU General Public License as published by the */
  6. /* Free Software Foundation; either version 2 of the License, or (at your */
  7. /* option) any later version. */
  8. /* */
  9. /* This program is distributed in the hope that it will be useful, but WITHOUT */
  10. /* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
  11. /* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
  12. /* more details. */
  13. /* */
  14. /* You should have received a copy of the GNU General Public License along */
  15. /* with This program; see the file COPYING. If not,write to the Free Software */
  16. /* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
  17. /*******************************************************************************/
  18. #include <lo/lo.h>
  19. #include "debug.h"
  20. #include <stdlib.h>
  21. #include <stdio.h>
  22. #include <string.h>
  23. #include <assert.h>
  24. #include "Endpoint.H"
  25. #include "Thread.H"
  26. namespace OSC
  27. {
  28. /**********/
  29. /* Method */
  30. /**********/
  31. Method::Method ( )
  32. {
  33. _path = _typespec = _documentation = 0;
  34. }
  35. Method::~Method ( )
  36. {
  37. if ( _path )
  38. free( _path );
  39. if ( _typespec )
  40. free( _typespec );
  41. }
  42. /**********/
  43. /* Signal */
  44. /**********/
  45. int Signal::next_id = 0;
  46. Signal::~Signal ( )
  47. {
  48. if ( _endpoint )
  49. {
  50. _endpoint->del_signal( this );
  51. }
  52. free( _path );
  53. _path = NULL;
  54. _endpoint = NULL;
  55. }
  56. void
  57. Signal::rename ( const char *path )
  58. {
  59. for ( std::list<Target*>::const_iterator i = _incoming.begin();
  60. i != _incoming.end();
  61. ++i )
  62. {
  63. _endpoint->send( (*i)->peer->addr,
  64. "/signal/renamed",
  65. (*i)->signal_id,
  66. path );
  67. }
  68. free( _path );
  69. _path = strdup( path );
  70. }
  71. void
  72. Signal::value ( float f )
  73. {
  74. for ( std::list<Target*>::const_iterator i = _outgoing.begin();
  75. i != _outgoing.end();
  76. ++i )
  77. {
  78. // DMESSAGE( "Sending signal value %i %f", (*i)->signal_id, f );
  79. if ( (*i)->value != f )
  80. {
  81. (*i)->value = f;
  82. _endpoint->send( (*i)->peer->addr,
  83. "/signal/change",
  84. (*i)->signal_id,
  85. f );
  86. }
  87. }
  88. }
  89. void
  90. Signal::get_connected_peer_name_and_path ( char **peer_name, char **path )
  91. {
  92. Target *t = _outgoing.back();
  93. Signal *s = get_peer_signal_by_id( t->peer, t->signal_id );
  94. *peer_name = strdup( t->peer->name );
  95. *path = strdup( s->path() );
  96. }
  97. void
  98. Endpoint::error_handler(int num, const char *msg, const char *path)
  99. {
  100. WARNING( "LibLO server error %d in path %s: %s\n", num, path, msg);
  101. }
  102. Endpoint::Endpoint ( )
  103. {
  104. }
  105. int
  106. Endpoint::init ( int proto, const char *port )
  107. {
  108. DMESSAGE( "Creating OSC server" );
  109. _server = lo_server_new_with_proto( port, proto, error_handler );
  110. if ( ! _server )
  111. {
  112. WARNING( "Error creating OSC server" );
  113. return -1;
  114. }
  115. add_method( "/signal/renamed", "is", &Endpoint::osc_sig_renamed, this, "" );
  116. add_method( "/signal/change", "if", &Endpoint::osc_sig_handler, this, "" );
  117. add_method( NULL, "", &Endpoint::osc_generic, this, "" );
  118. add_method( NULL, NULL, &Endpoint::osc_signal_lister, this, "" );
  119. add_method( "/reply", NULL, &Endpoint::osc_reply, this, "" );
  120. return 0;
  121. }
  122. Endpoint::~Endpoint ( )
  123. {
  124. // lo_server_thread_free( _st );
  125. lo_server_free( _server );
  126. }
  127. OSC::Target *
  128. Endpoint::find_target_by_peer_address ( std::list<Target*> *l, lo_address addr )
  129. {
  130. for ( std::list<Target*>::iterator i = l->begin();
  131. i != l->end();
  132. ++i )
  133. {
  134. if ( address_matches( addr, (*i)->peer->addr ) )
  135. {
  136. return *i;
  137. }
  138. }
  139. return NULL;
  140. }
  141. OSC::Signal *
  142. Endpoint::find_signal_by_id ( int id )
  143. {
  144. for ( std::list<Signal*>::iterator i = _signals.begin();
  145. i != _signals.end();
  146. ++i )
  147. {
  148. if ( (*i)->id() == id )
  149. return *i;
  150. }
  151. return NULL;
  152. }
  153. OSC::Signal *
  154. Endpoint::find_peer_signal_by_path ( Peer *p, const char *path )
  155. {
  156. for ( std::list<Signal*>::iterator i = p->_signals.begin();
  157. i != p->_signals.end();
  158. ++i )
  159. {
  160. if ( !strcmp( (*i)->path(), path ) )
  161. return *i;
  162. }
  163. return NULL;
  164. }
  165. OSC::Signal *
  166. Endpoint::find_peer_signal_by_id ( Peer *p, int id )
  167. {
  168. for ( std::list<Signal*>::iterator i = p->_signals.begin();
  169. i != p->_signals.end();
  170. ++i )
  171. {
  172. if ( id == (*i)->id() )
  173. return *i;
  174. }
  175. return NULL;
  176. }
  177. int
  178. Endpoint::osc_sig_renamed ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  179. {
  180. int id = argv[0]->i;
  181. char *new_name = &argv[1]->s;
  182. Endpoint *ep = (Endpoint*)user_data;
  183. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  184. if ( ! p )
  185. {
  186. WARNING( "Got signal rename notification from unknown peer." );
  187. return 0;
  188. }
  189. Signal *o = ep->find_peer_signal_by_id( p, id );
  190. if ( ! o )
  191. {
  192. WARNING( "Unknown signal id %i", id );
  193. return 0;
  194. }
  195. DMESSAGE( "Signal %s was renamed to %s" );
  196. free( o->_path );
  197. o->_path = strdup( new_name );
  198. return 0;
  199. }
  200. int
  201. Endpoint::osc_sig_handler ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  202. {
  203. Signal *o;
  204. float f = 0.0;
  205. if ( !strcmp( path, "/signal/change" ) && !strcmp( types, "if" ) )
  206. {
  207. /* accept a value for numbered signal */
  208. int id = argv[0]->i;
  209. f = argv[1]->f;
  210. o = ((Endpoint*)user_data)->find_signal_by_id( id );
  211. if ( ! o )
  212. {
  213. WARNING( "Unknown signal id %i", id );
  214. return 0;
  215. }
  216. }
  217. else if ( ! strcmp( types, "f" ) )
  218. {
  219. /* accept a value for signal named in path */
  220. o = (Signal*)user_data;
  221. f = argv[0]->f;
  222. }
  223. else if ( ! types || 0 == types[0] )
  224. {
  225. /* reply with current value */
  226. o = (Signal*)user_data;
  227. o->_endpoint->send( lo_message_get_source( msg ), "/reply", path, o->value() );
  228. }
  229. else
  230. {
  231. return -1;
  232. }
  233. Target *t = NULL;
  234. if ( 0 == o->_incoming.size() ||
  235. ! ( t = find_target_by_peer_address( &o->_incoming, lo_message_get_source( msg ) ) ) )
  236. {
  237. /* message came from an unconnected peer, just set the value exactly */
  238. }
  239. else
  240. {
  241. /* message is from a connected source, do mixing. */
  242. t->value = f;
  243. f = 0.0;
  244. for ( std::list<Target*>::const_iterator i = o->_incoming.begin();
  245. i != o->_incoming.end();
  246. ++i )
  247. {
  248. f += (*i)->value;
  249. }
  250. }
  251. o->_value = f;
  252. o->_handler( f, o->_user_data );
  253. return 0;
  254. }
  255. int
  256. Endpoint::osc_generic ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  257. {
  258. // OSC_DMSG();
  259. if ( argc || path[ strlen(path) - 1 ] != '/' )
  260. return -1;
  261. Endpoint *ep = (Endpoint*)user_data;
  262. for ( std::list<Method*>::const_iterator i = ep->_methods.begin(); i != ep->_methods.end(); ++i )
  263. {
  264. if ( ! (*i)->path() )
  265. continue;
  266. if (! strncmp( (*i)->path(), path, strlen(path) ) )
  267. {
  268. /* asprintf( &stored_path, "%s (%s); %s", path, typespec, argument_description ); */
  269. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path, (*i)->path() );
  270. }
  271. }
  272. ((Endpoint*)user_data)->send( lo_message_get_source( msg ), "/reply", path );
  273. return 0;
  274. }
  275. int
  276. Endpoint::osc_signal_lister ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  277. {
  278. // OSC_DMSG();
  279. Signal::Direction dir;
  280. if ( ! strcmp( path, "/signal/list_inputs" ) )
  281. {
  282. dir = Signal::Input;
  283. }
  284. else if ( ! strcmp( path, "/signal/list_outputs" ) )
  285. {
  286. dir = Signal::Output;
  287. }
  288. else
  289. return -1;
  290. const char *prefix = NULL;
  291. if ( argc )
  292. prefix = &argv[0]->s;
  293. Endpoint *ep = (Endpoint*)user_data;
  294. for ( std::list<Signal*>::const_iterator i = ep->_signals.begin(); i != ep->_signals.end(); ++i )
  295. {
  296. Signal *o = *i;
  297. if ( dir == Signal::Bidirectional ||
  298. dir == o->_direction )
  299. {
  300. if ( ! prefix || ! strncmp( o->path(), prefix, strlen(prefix) ) )
  301. {
  302. ep->send( lo_message_get_source( msg ),
  303. "/reply",
  304. path,
  305. o->path(),
  306. o->id(),
  307. o->parameter_limits().min,
  308. o->parameter_limits().max,
  309. o->parameter_limits().default_value
  310. );
  311. }
  312. }
  313. }
  314. ep->send( lo_message_get_source( msg ), "/reply", path );
  315. return 0;
  316. }
  317. bool
  318. Endpoint::address_matches ( lo_address addr1, lo_address addr2 )
  319. {
  320. char *purl = strdup( lo_address_get_port( addr1 ) );
  321. char *url = strdup( lo_address_get_port( addr2 ) );
  322. bool r = !strcmp( purl, url );
  323. free( purl );
  324. free( url );
  325. return r;
  326. }
  327. void
  328. Endpoint::list_peers ( void (*callback) (const char *, const OSC::Signal *, void * ), void *v )
  329. {
  330. for ( std::list<Peer*>::iterator i = _peers.begin();
  331. i != _peers.end();
  332. ++i )
  333. {
  334. for ( std::list<Signal*>::iterator j = (*i)->_signals.begin();
  335. j != (*i)->_signals.end();
  336. ++j )
  337. {
  338. // DMESSAGE( "Running callback" );
  339. callback( (*i)->name, *j, v );
  340. }
  341. }
  342. }
  343. Peer *
  344. Endpoint::find_peer_by_address ( lo_address addr )
  345. {
  346. char *url = strdup( lo_address_get_port( addr ) );
  347. Peer *p = NULL;
  348. for ( std::list<Peer*>::iterator i = _peers.begin();
  349. i != _peers.end();
  350. ++i )
  351. {
  352. char *purl = strdup( lo_address_get_port( (*i)->addr ) );
  353. if ( !strcmp( purl, url ) )
  354. {
  355. free( purl );
  356. p = *i;
  357. break;
  358. }
  359. free(purl);
  360. }
  361. free( url );
  362. return p;
  363. }
  364. Peer *
  365. Endpoint::find_peer_by_name ( const char *name )
  366. {
  367. for ( std::list<Peer*>::iterator i = _peers.begin();
  368. i != _peers.end();
  369. ++i )
  370. {
  371. if ( !strcmp( name, (*i)->name ) )
  372. {
  373. return *i;
  374. }
  375. }
  376. return NULL;
  377. }
  378. bool
  379. Endpoint::connect_signal( OSC::Signal *s, const char *peer_name, const char *signal_path )
  380. {
  381. if ( s->_direction == Signal::Output )
  382. {
  383. Peer *p = find_peer_by_name( peer_name );
  384. if ( ! p )
  385. return false;
  386. Signal *ps = find_peer_signal_by_path( p, signal_path );
  387. if ( ! ps )
  388. return false;
  389. MESSAGE( "Connecting signal output \"%s\" to %s:%i", s->path(), peer_name, s->_id );
  390. if ( p )
  391. {
  392. Target *t = new Target();
  393. t->peer = p;
  394. t->signal_id = ps->_id;
  395. s->_outgoing.push_back( t );
  396. send( p->addr, "/signal/connect",
  397. s->_id, /* our signal id */
  398. t->signal_id /* their signal id */ );
  399. return true;
  400. }
  401. }
  402. return false;
  403. }
  404. bool
  405. Endpoint::connect_signal( OSC::Signal *s, const char *peer_name, int signal_id )
  406. {
  407. if ( s->_direction == Signal::Output )
  408. {
  409. Peer *p = find_peer_by_name( peer_name );
  410. if ( !p )
  411. return false;
  412. MESSAGE( "Connecting signal output \"%s\" to %s:%i", s->path(), peer_name, signal_id );
  413. if ( p )
  414. {
  415. Target *t = new Target();
  416. t->peer = p;
  417. t->signal_id = signal_id;
  418. s->_outgoing.push_back( t );
  419. send( p->addr, "/signal/connect",
  420. s->_id, /* our signal id */
  421. t->signal_id /* their signal id */ );
  422. return true;
  423. }
  424. }
  425. return false;
  426. }
  427. Signal *
  428. Signal::get_peer_signal_by_id ( Peer *p, int signal_id )
  429. {
  430. for ( std::list<Signal *>::iterator i = p->_signals.begin();
  431. i != p->_signals.end();
  432. ++i )
  433. {
  434. if ( (*i)->_id == signal_id )
  435. return *i;
  436. }
  437. return NULL;
  438. }
  439. int
  440. Endpoint::osc_reply ( const char *path, const char *types, lo_arg **argv, int argc, lo_message msg, void *user_data )
  441. {
  442. Endpoint *ep = (Endpoint*)user_data;
  443. if ( argc && !strcmp( &argv[0]->s, "/signal/list_inputs" ) )
  444. {
  445. Peer *p = ep->find_peer_by_address( lo_message_get_source( msg ) );
  446. if ( ! p )
  447. {
  448. WARNING( "Got input list reply from unknown peer." );
  449. return 0;
  450. }
  451. if ( argc == 1 )
  452. {
  453. p->_scanning = false;
  454. DMESSAGE( "Done scanning %s", p->name );
  455. }
  456. else if ( p->_scanning )
  457. {
  458. DMESSAGE( "Peer %s has signal %s", p->name, &argv[1]->s );
  459. Signal *s = new Signal( &argv[1]->s, Signal::Input );
  460. s->_id = argv[2]->i;
  461. s->parameter_limits().min = argv[3]->f;
  462. s->parameter_limits().max = argv[4]->f;
  463. s->parameter_limits().default_value = argv[4]->f;
  464. p->_signals.push_back( s );
  465. }
  466. return 0;
  467. }
  468. else
  469. return -1;
  470. }
  471. Method *
  472. Endpoint::add_method ( const char *path, const char *typespec, lo_method_handler handler, void *user_data, const char *argument_description )
  473. {
  474. // DMESSAGE( "Added OSC method %s (%s)", path, typespec );
  475. lo_server_add_method( _server, path, typespec, handler, user_data );
  476. Method *md = new Method;
  477. if ( path )
  478. md->_path = strdup( path );
  479. if ( typespec )
  480. md->_typespec = strdup( typespec );
  481. if ( argument_description )
  482. md->_documentation = strdup( argument_description );
  483. if ( typespec )
  484. md->_parameter_limits = new Parameter_Limits[strlen(typespec)];
  485. _methods.push_back( md );
  486. return md;
  487. }
  488. Signal *
  489. Endpoint::add_signal ( const char *path, Signal::Direction dir, signal_handler handler, void *user_data )
  490. {
  491. Signal *md = new Signal( path, dir );
  492. if ( path )
  493. md->_path = strdup( path );
  494. md->_handler = handler;
  495. md->_user_data = user_data;
  496. md->_endpoint = this;
  497. _signals.push_back( md );
  498. if ( dir == Signal::Input )
  499. {
  500. lo_server_add_method( _server, path, NULL, osc_sig_handler, md );
  501. }
  502. return md;
  503. }
  504. void
  505. Endpoint::del_method ( const char *path, const char *typespec )
  506. {
  507. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  508. lo_server_del_method( _server, path, typespec );
  509. for ( std::list<Method *>::iterator i = _methods.begin(); i != _methods.end(); ++i )
  510. {
  511. if ( ! (*i)->path() )
  512. continue;
  513. if ( ! strcmp( path, (*i)->path() ) &&
  514. ! strcmp( typespec, (*i)->typespec() ) )
  515. {
  516. delete *i;
  517. i = _methods.erase( i );
  518. break;
  519. }
  520. }
  521. }
  522. void
  523. Endpoint::del_method ( Method *meth )
  524. {
  525. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  526. lo_server_del_method( _server, meth->path(), meth->typespec() );
  527. delete meth;
  528. _methods.remove( meth );
  529. }
  530. void
  531. Endpoint::del_signal ( Signal *o )
  532. {
  533. // DMESSAGE( "Deleted OSC method %s (%s)", path, typespec );
  534. lo_server_del_method( _server, o->path(), "f" );
  535. // delete o;
  536. _signals.remove( o );
  537. }
  538. void
  539. Endpoint::scan_peer ( const char *name, const char *url )
  540. {
  541. Peer *p = new Peer;
  542. p->name = strdup( name );
  543. p->addr = lo_address_new_from_url( url );
  544. p->_scanning = true;
  545. _peers.push_back( p );
  546. send( p->addr, "/signal/list_inputs" );
  547. }
  548. void *
  549. Endpoint::osc_thread ( void * arg )
  550. {
  551. ((Endpoint*)arg)->osc_thread();
  552. return NULL;
  553. }
  554. void
  555. Endpoint::osc_thread ( void )
  556. {
  557. _thread.name( "OSC" );
  558. DMESSAGE( "OSC Thread running" );
  559. run();
  560. }
  561. void
  562. Endpoint::start ( void )
  563. {
  564. if ( !_thread.clone( &Endpoint::osc_thread, this ) )
  565. FATAL( "Could not create OSC thread" );
  566. /* lo_server_thread_start( _st ); */
  567. }
  568. void
  569. Endpoint::stop ( void )
  570. {
  571. _thread.join();
  572. // lo_server_thread_stop( _st );
  573. }
  574. int
  575. Endpoint::port ( void ) const
  576. {
  577. return lo_server_get_port( _server );
  578. }
  579. char *
  580. Endpoint::url ( void ) const
  581. {
  582. return lo_server_get_url( _server );
  583. }
  584. /** Process any waiting events and return immediately */
  585. void
  586. Endpoint::check ( void ) const
  587. {
  588. wait( 0 );
  589. }
  590. /** Process any waiting events and return after timeout */
  591. void
  592. Endpoint::wait ( int timeout ) const
  593. {
  594. if ( lo_server_wait( _server, timeout ) )
  595. while ( lo_server_recv_noblock( _server, 0 ) ) { }
  596. }
  597. /** Process events forever */
  598. void
  599. Endpoint::run ( void ) const
  600. {
  601. for ( ;; )
  602. {
  603. lo_server_recv( _server );
  604. }
  605. }
  606. int
  607. Endpoint::send ( lo_address to, const char *path, std::list< OSC_Value > values )
  608. {
  609. lo_message m = lo_message_new();
  610. for ( std::list< OSC_Value >::const_iterator i = values.begin();
  611. i != values.end();
  612. ++i )
  613. {
  614. const OSC_Value *ov = &(*i);
  615. switch ( ov->type() )
  616. {
  617. case 'f':
  618. DMESSAGE( "Adding float %f", ((OSC_Float*)ov)->value() );
  619. lo_message_add_float( m, ((OSC_Float*)ov)->value() );
  620. break;
  621. case 'i':
  622. DMESSAGE( "Adding int %i", ((OSC_Int*)ov)->value() );
  623. lo_message_add_int32( m, ((OSC_Int*)ov)->value() );
  624. break;
  625. case 's':
  626. DMESSAGE( "Adding string %s", ((OSC_String*)ov)->value() );
  627. lo_message_add_string( m, ((OSC_String*)ov)->value() );
  628. break;
  629. default:
  630. FATAL( "Unknown format: %c", ov->type() );
  631. break;
  632. }
  633. }
  634. DMESSAGE( "Path: %s", path );
  635. lo_bundle b = lo_bundle_new( LO_TT_IMMEDIATE );
  636. lo_bundle_add_message(b, path, m );
  637. int r = lo_send_bundle_from( to, _server, b );
  638. // int r = lo_send_message_from( to, _server, path, m );
  639. // lo_message_free( m );
  640. return r;
  641. }
  642. int
  643. Endpoint::send ( lo_address to, const char *path )
  644. {
  645. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "" );
  646. }
  647. int
  648. Endpoint::send ( lo_address to, const char *path, int v )
  649. {
  650. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "i", v );
  651. }
  652. int
  653. Endpoint::send ( lo_address to, const char *path, float v )
  654. {
  655. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "f", v );
  656. }
  657. int
  658. Endpoint::send ( lo_address to, const char *path, double v )
  659. {
  660. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "d", v );
  661. }
  662. int
  663. Endpoint::send ( lo_address to, const char *path, const char * v )
  664. {
  665. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "s", v );
  666. }
  667. int
  668. Endpoint::send ( lo_address to, const char *path, const char * v1, float v2 )
  669. {
  670. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sf", v1, v2 );
  671. }
  672. int
  673. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2 )
  674. {
  675. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ss", v1, v2 );
  676. }
  677. int
  678. Endpoint::send ( lo_address to, const char *path, const char * v1, const char *v2, const char *v3 )
  679. {
  680. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sss", v1, v2, v3 );
  681. }
  682. int
  683. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3, int v4 )
  684. {
  685. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "siii", v1, v2, v3, v4 );
  686. }
  687. int
  688. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, int v4, int v5 )
  689. {
  690. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssiii", v1, v2, v3, v4, v5 );
  691. }
  692. int
  693. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, int v4, int v5, int v6 )
  694. {
  695. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssiii", v1, v2, v3, v4, v5, v6 );
  696. }
  697. int
  698. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2 )
  699. {
  700. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "si", v1, v2 );
  701. }
  702. int
  703. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2 )
  704. {
  705. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "is", v1, v2 );
  706. }
  707. int
  708. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3 )
  709. {
  710. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sis", v1, v2, v3 );
  711. }
  712. int
  713. Endpoint::send ( lo_address to, const char *path, int v1, const char *v2, const char *v3, const char *v4 )
  714. {
  715. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "isss", v1, v2, v3, v4 );
  716. }
  717. int
  718. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, const char *v3, const char *v4, const char *v5 )
  719. {
  720. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sisss", v1, v2, v3, v4, v5 );
  721. }
  722. int
  723. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4, const char *v5 )
  724. {
  725. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sssss", v1, v2, v3, v4, v5 );
  726. }
  727. int
  728. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, const char *v3, const char *v4 )
  729. {
  730. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssss", v1, v2, v3, v4 );
  731. }
  732. int
  733. Endpoint::send ( lo_address to, const char *path, lo_message msg )
  734. {
  735. return lo_send_message_from( to, _server, path, msg );
  736. }
  737. int
  738. Endpoint::send ( lo_address to, const char *path, const char *v1, const char *v2, int v3, float v4, float v5, float v6 )
  739. {
  740. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ssifff", v1, v2, v3, v4, v5, v6 );
  741. }
  742. int
  743. Endpoint::send ( lo_address to, const char *path, const char *v1, int v2, int v3 )
  744. {
  745. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "sii", v1, v2, v3 );
  746. }
  747. int
  748. Endpoint::send ( lo_address to, const char *path, int v1, int v2 )
  749. {
  750. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "ii", v1, v2 );
  751. }
  752. int
  753. Endpoint::send ( lo_address to, const char *path, int v1, float v2 )
  754. {
  755. return lo_send_from( to, _server, LO_TT_IMMEDIATE, path, "if", v1, v2 );
  756. }
  757. }