diff options
author | David Robillard <d@drobilla.net> | 2008-08-17 01:34:53 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-08-17 01:34:53 +0000 |
commit | 694b31089c8060fc6b908b146b12c0e340d004c7 (patch) | |
tree | 48b0e0195de5e7b297e65be15eda35639585ef8a /src/libs/engine/OSCClientSender.cpp | |
parent | 3dc90cc95df35e5c786857336f22856c6373b00f (diff) | |
download | ingen-694b31089c8060fc6b908b146b12c0e340d004c7.tar.gz ingen-694b31089c8060fc6b908b146b12c0e340d004c7.tar.bz2 ingen-694b31089c8060fc6b908b146b12c0e340d004c7.zip |
Cloooser...
Bundling of OSC communication both ways (previous was just engine->client).
Factor out common OSC*Sender functionality (bundling stuff).
Fully type-safe and polyphony-aware port value setting/getting, from RDF through OSC through engine and back again.
git-svn-id: http://svn.drobilla.net/lad/ingen@1409 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/OSCClientSender.cpp')
-rw-r--r-- | src/libs/engine/OSCClientSender.cpp | 111 |
1 files changed, 23 insertions, 88 deletions
diff --git a/src/libs/engine/OSCClientSender.cpp b/src/libs/engine/OSCClientSender.cpp index c9b156db..60edbe07 100644 --- a/src/libs/engine/OSCClientSender.cpp +++ b/src/libs/engine/OSCClientSender.cpp @@ -35,90 +35,6 @@ using namespace std; namespace Ingen { -void -OSCClientSender::bundle_begin() -{ - assert(!_transfer); - _transfer = lo_bundle_new(LO_TT_IMMEDIATE); - _send_state = SendingBundle; - -} - -void -OSCClientSender::bundle_end() -{ - transfer_end(); -} - - -void -OSCClientSender::transfer_begin() -{ - //cerr << "TRANSFER {" << endl; - assert(!_transfer); - _transfer = lo_bundle_new(LO_TT_IMMEDIATE); - _send_state = SendingTransfer; -} - - -void -OSCClientSender::transfer_end() -{ - //cerr << "} TRANSFER" << endl; - assert(_transfer); - lo_send_bundle(_address, _transfer); - lo_bundle_free(_transfer); - _transfer = NULL; - _send_state = Immediate; -} - - -int -OSCClientSender::send(const char *path, const char *types, ...) -{ - if (!_enabled) - return 0; - - va_list args; - va_start(args, types); - - lo_message msg = lo_message_new(); - int ret = lo_message_add_varargs(msg, types, args); - - if (!ret) - send_message(path, msg); - - va_end(args); - - return ret; -} - - -void -OSCClientSender::send_message(const char* path, lo_message msg) -{ - // FIXME: size? liblo doesn't export this. - // Don't want to exceed max UDP packet size (1500 bytes?) - static const size_t MAX_BUNDLE_SIZE = 1500 - 32*5; - - if (!_enabled) - return; - - if (_transfer) { - if (lo_bundle_length(_transfer) + lo_message_length(msg, path) > MAX_BUNDLE_SIZE) { - if (_send_state == SendingBundle) - cerr << "WARNING: Maximum bundle size reached, bundle split" << endl; - lo_send_bundle(_address, _transfer); - _transfer = lo_bundle_new(LO_TT_IMMEDIATE); - } - lo_bundle_add_message(_transfer, path, msg); - - } else { - lo_send_message(_address, path, msg); - } -} - - /*! \page client_osc_namespace Client OSC Namespace Documentation * @@ -460,14 +376,33 @@ OSCClientSender::set_variable(const std::string& path, const std::string& key, c /** \page client_osc_namespace - * <p> \b /ingen/control_change - Notification the value of a port has changed + * <p> \b /ingen/set_port_value - Notification the value of a port has changed + * \arg \b path (string) - Path of port + * \arg \b value (any) - New value of port </p> \n \n + */ +void +OSCClientSender::set_port_value(const std::string& port_path, const Raul::Atom& value) +{ + lo_message m = lo_message_new(); + lo_message_add_string(m, port_path.c_str()); + Raul::AtomLiblo::lo_message_add_atom(m, value); + send_message("/ingen/set_port_value", m); +} + + +/** \page client_osc_namespace + * <p> \b /ingen/set_port_value - Notification the value of a port has changed * \arg \b path (string) - Path of port - * \arg \b value (float) - New value of port </p> \n \n + * \arg \b voice (int) - Voice which is set to this value + * \arg \b value (any) - New value of port </p> \n \n */ void -OSCClientSender::control_change(const std::string& port_path, float value) +OSCClientSender::set_voice_value(const std::string& port_path, uint32_t voice, const Raul::Atom& value) { - send("/ingen/control_change", "sf", port_path.c_str(), value, LO_ARGS_END); + lo_message m = lo_message_new(); + lo_message_add_string(m, port_path.c_str()); + Raul::AtomLiblo::lo_message_add_atom(m, value); + send_message("/ingen/set_port_value", m); } |