From 514c43278bb03150a1f4c5afc5808ba81adb00d5 Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Sat, 7 Oct 2017 20:23:34 -0700 Subject: OSC clean up route observer --- libs/surfaces/osc/osc.cc | 66 ++++++- libs/surfaces/osc/osc.h | 10 +- libs/surfaces/osc/osc_route_observer.cc | 319 ++++++++------------------------ libs/surfaces/osc/osc_route_observer.h | 15 +- 4 files changed, 149 insertions(+), 261 deletions(-) (limited to 'libs') diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 1ca0dff146..bcf364ad9d 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -719,7 +719,7 @@ OSC::listen_to_route (boost::shared_ptr strip, lo_address addr) OSCSurface *s = get_surface(addr); uint32_t ssid = get_sid (strip, addr); - OSCRouteObserver* o = new OSCRouteObserver (strip, ssid, s); + OSCRouteObserver* o = new OSCRouteObserver (*this, ssid, s); route_observers.push_back (o); strip->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::route_lost, this, boost::weak_ptr (strip)), this); @@ -3929,7 +3929,7 @@ OSC::sel_master_send_enable (int state, lo_message msg) return 0; } } - return cue_float_message ("/select/master_send_enable", 0, get_address(msg)); + return float_message ("/select/master_send_enable", 0, get_address(msg)); } int @@ -5299,7 +5299,7 @@ OSC::cue_aux_fader (float position, lo_message msg) } } } - cue_float_message ("/cue/fader", 0, get_address (msg)); + float_message ("/cue/fader", 0, get_address (msg)); return -1; } @@ -5320,7 +5320,7 @@ OSC::cue_aux_mute (float state, lo_message msg) } } } - cue_float_message ("/cue/mute", 0, get_address (msg)); + float_message ("/cue/mute", 0, get_address (msg)); return -1; } @@ -5337,7 +5337,7 @@ OSC::cue_send_fader (uint32_t id, float val, lo_message msg) return 0; } } - cue_float_message (string_compose ("/cue/send/fader/%1", id), 0, get_address (msg)); + float_message (string_compose ("/cue/send/fader/%1", id), 0, get_address (msg)); return -1; } @@ -5355,12 +5355,13 @@ OSC::cue_send_enable (uint32_t id, float state, lo_message msg) } return 0; } - cue_float_message (string_compose ("/cue/send/enable/%1", id), 0, get_address (msg)); + float_message (string_compose ("/cue/send/enable/%1", id), 0, get_address (msg)); return -1; } +// generic send message int -OSC::cue_float_message (string path, float val, lo_address addr) +OSC::float_message (string path, float val, lo_address addr) { lo_message reply; @@ -5373,6 +5374,40 @@ OSC::cue_float_message (string path, float val, lo_address addr) return 0; } +int +OSC::float_message_with_id (std::string path, uint32_t ssid, float value, lo_address addr) +{ + OSCSurface *sur = get_surface(addr); + lo_message msg = lo_message_new (); + if (sur->feedback[2]) { + path = string_compose ("%1/%2", path, ssid); + } else { + lo_message_add_int32 (msg, ssid); + } + lo_message_add_float (msg, value); + + lo_send_message (addr, path.c_str(), msg); + lo_message_free (msg); + return 0; +} + +int +OSC::int_message_with_id (std::string path, uint32_t ssid, int value, lo_address addr) +{ + OSCSurface *sur = get_surface(addr); + lo_message msg = lo_message_new (); + if (sur->feedback[2]) { + path = string_compose ("%1/%2", path, ssid); + } else { + lo_message_add_int32 (msg, ssid); + } + lo_message_add_int32 (msg, value); + + lo_send_message (addr, path.c_str(), msg); + lo_message_free (msg); + return 0; +} + int OSC::text_message (string path, string val, lo_address addr) { @@ -5387,6 +5422,23 @@ OSC::text_message (string path, string val, lo_address addr) return 0; } +int +OSC::text_message_with_id (std::string path, uint32_t ssid, std::string val, lo_address addr) +{ + OSCSurface *sur = get_surface(addr); + lo_message msg = lo_message_new (); + if (sur->feedback[2]) { + path = string_compose ("%1/%2", path, ssid); + } else { + lo_message_add_int32 (msg, ssid); + } + + lo_message_add_string (msg, val.c_str()); + + lo_send_message (addr, path.c_str(), msg); + lo_message_free (msg); + return 0; +} // we have to have a sorted list of stripables that have sends pointed at our aux // we can use the one in osc.cc to get an aux list diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 0c19cea7b6..cb2d027267 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -87,6 +87,14 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI int set_active (bool yn); bool get_active () const; + // generic osc send + + int float_message (std::string, float value, lo_address addr); + int text_message (std::string path, std::string val, lo_address addr); + int float_message_with_id (std::string, uint32_t ssid, float value, lo_address addr); + int int_message_with_id (std::string, uint32_t ssid, int value, lo_address addr); + int text_message_with_id (std::string path, uint32_t ssid, std::string val, lo_address addr); + int start (); int stop (); @@ -273,8 +281,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI int cue_aux_fader (float position, lo_message msg); int cue_aux_mute (float state, lo_message msg); void cue_set_aux (uint32_t aux, lo_message msg); - int cue_float_message (std::string, float value, lo_address addr); - int text_message (std::string path, std::string val, lo_address addr); boost::shared_ptr cue_get_send (uint32_t id, lo_address addr); // end cue diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index 03e2578022..a960cf0003 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -38,8 +38,8 @@ using namespace PBD; using namespace ARDOUR; using namespace ArdourSurface; -OSCRouteObserver::OSCRouteObserver (boost::shared_ptr s, uint32_t ss, ArdourSurface::OSC::OSCSurface* su) - : _strip (s) +OSCRouteObserver::OSCRouteObserver (OSC& o, uint32_t ss, ArdourSurface::OSC::OSCSurface* su) + : _osc (o) ,ssid (ss) ,sur (su) ,_last_gain (-1.0) @@ -47,11 +47,27 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr s, uint32_t ss, ,_init (true) { addr = lo_address_new_from_url (sur->remote_url.c_str()); - gainmode = sur->gainmode; - feedback = sur->feedback; + refresh_strip (true); +} + +OSCRouteObserver::~OSCRouteObserver () +{ + _init = true; + + strip_connections.drop_connections (); + + lo_address_free (addr); +} + +void +OSCRouteObserver::refresh_strip (bool force) +{ + _init = true; + + _strip = sur->strips[sur->bank + ssid - 2]; as = ARDOUR::Off; - if (feedback[0]) { // buttons are separate feedback + if (sur->feedback[0]) { // buttons are separate feedback _strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::name_changed, this, boost::lambda::_1), OSC::instance()); name_changed (ARDOUR::Properties::name); @@ -91,22 +107,16 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr s, uint32_t ss, send_select_status (ARDOUR::Properties::selected); } - if (feedback[1]) { // level controls + if (sur->feedback[1]) { // level controls boost::shared_ptr gain_cont = _strip->gain_control(); - if (gainmode) { - gain_cont->alist()->automation_state_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::gain_automation, this, X_("/strip/fader")), OSC::instance()); - gain_cont->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/fader"), gain_cont), OSC::instance()); - gain_automation ("/strip/fader"); - } else { - gain_cont->alist()->automation_state_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::gain_automation, this, X_("/strip/gain")), OSC::instance()); - gain_cont->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_gain_message, this, X_("/strip/gain"), gain_cont), OSC::instance()); - gain_automation ("/strip/gain"); - } + gain_cont->alist()->automation_state_changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::gain_automation, this), OSC::instance()); + gain_cont->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_gain_message, this), OSC::instance()); + gain_automation (); boost::shared_ptr trim_controllable = boost::dynamic_pointer_cast(_strip->trim_control()); if (trim_controllable) { - trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_trim_message, this, X_("/strip/trimdB"), _strip->trim_control()), OSC::instance()); - send_trim_message ("/strip/trimdB", _strip->trim_control()); + trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::send_trim_message, this), OSC::instance()); + send_trim_message (); } boost::shared_ptr pan_controllable = boost::dynamic_pointer_cast(_strip->pan_azimuth_control()); @@ -117,55 +127,7 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr s, uint32_t ss, } _init = false; tick(); -} - -OSCRouteObserver::~OSCRouteObserver () -{ - _init = true; - - strip_connections.drop_connections (); - if (sur->no_clear) { - // some surfaces destroy their own strips and don't need the extra noise - lo_address_free (addr); - return; - } - - // all strip buttons should be off and faders 0 and etc. - clear_strip ("/strip/expand", 0); - if (feedback[0]) { // buttons are separate feedback - text_with_id ("/strip/name", ssid, " "); - clear_strip ("/strip/mute", 0); - clear_strip ("/strip/solo", 0); - clear_strip ("/strip/recenable", 0); - clear_strip ("/strip/record_safe", 0); - clear_strip ("/strip/monitor_input", 0); - clear_strip ("/strip/monitor_disk", 0); - clear_strip ("/strip/gui_select", 0); - clear_strip ("/strip/select", 0); - } - if (feedback[1]) { // level controls - if (gainmode) { - clear_strip ("/strip/fader", 0); - } else { - clear_strip ("/strip/gain", -193); - } - clear_strip ("/strip/trimdB", 0); - clear_strip ("/strip/pan_stereo_position", 0.5); - } - if (feedback[9]) { - clear_strip ("/strip/signal", 0); - } - if (feedback[7]) { - if (gainmode) { - clear_strip ("/strip/meter", 0); - } else { - clear_strip ("/strip/meter", -193); - } - }else if (feedback[8]) { - clear_strip ("/strip/meter", 0); - } - lo_address_free (addr); } void @@ -174,7 +136,7 @@ OSCRouteObserver::tick () if (_init) { return; } - if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled + if (sur->feedback[7] || sur->feedback[8] || sur->feedback[9]) { // meters enabled // the only meter here is master float now_meter; if (_strip->peak_meter()) { @@ -184,72 +146,47 @@ OSCRouteObserver::tick () } if (now_meter < -120) now_meter = -193; if (_last_meter != now_meter) { - if (feedback[7] || feedback[8]) { - string path = "/strip/meter"; - lo_message msg = lo_message_new (); - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - if (gainmode && feedback[7]) { - lo_message_add_float (msg, ((now_meter + 94) / 100)); - lo_send_message (addr, path.c_str(), msg); - } else if ((!gainmode) && feedback[7]) { - lo_message_add_float (msg, now_meter); - lo_send_message (addr, path.c_str(), msg); - } else if (feedback[8]) { + if (sur->feedback[7] || sur->feedback[8]) { + if (sur->gainmode && sur->feedback[7]) { + _osc.float_message_with_id ("/strip/meter", ssid, ((now_meter + 94) / 100), addr); + } else if ((!sur->gainmode) && sur->feedback[7]) { + _osc.float_message_with_id ("/strip/meter", ssid, now_meter, addr); + } else if (sur->feedback[8]) { uint32_t ledlvl = (uint32_t)(((now_meter + 54) / 3.75)-1); uint16_t ledbits = ~(0xfff<feedback[9]) { float signal; if (now_meter < -40) { signal = 0; } else { signal = 1; } - lo_message_add_float (msg, signal); - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); + _osc.float_message_with_id ("/strip/signal", ssid, signal, addr); } } _last_meter = now_meter; } - if (feedback[1]) { + if (sur->feedback[1]) { if (gain_timeout) { if (gain_timeout == 1) { - text_with_id ("/strip/name", ssid, _strip->name()); + _osc.text_message_with_id ("/strip/name", ssid, _strip->name(), addr); } gain_timeout--; } if (trim_timeout) { if (trim_timeout == 1) { - text_with_id ("/strip/name", ssid, _strip->name()); + _osc.text_message_with_id ("/strip/name", ssid, _strip->name(), addr); } trim_timeout--; } if (as == ARDOUR::Play || as == ARDOUR::Touch) { if(_last_gain != _strip->gain_control()->get_value()) { _last_gain = _strip->gain_control()->get_value(); - if (gainmode) { - send_gain_message ("/strip/fader", _strip->gain_control()); - gain_timeout = 8; - } else { - send_gain_message ("/strip/gain", _strip->gain_control()); - } + send_gain_message (); } } } @@ -263,43 +200,16 @@ OSCRouteObserver::name_changed (const PBD::PropertyChange& what_changed) return; } - if (!_strip) { - return; + if (_strip) { + _osc.text_message_with_id ("/strip/name", ssid, _strip->name(), addr); } - text_with_id ("/strip/name", ssid, _strip->name()); } void OSCRouteObserver::send_change_message (string path, boost::shared_ptr controllable) { - lo_message msg = lo_message_new (); - - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } float val = controllable->get_value(); - lo_message_add_float (msg, (float) controllable->internal_to_interface (val)); - - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); -} - -void -OSCRouteObserver::text_with_id (string path, uint32_t id, string name) -{ - lo_message msg = lo_message_new (); - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, id); - } - - lo_message_add_string (msg, name.c_str()); - - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); + _osc.float_message_with_id (path, ssid, (float) controllable->internal_to_interface (val), addr); } void @@ -316,110 +226,67 @@ OSCRouteObserver::send_monitor_status (boost::shared_ptr controlla disk = 1; input = 0; break; + case 3: + disk = 1; + input = 1; + break; default: disk = 0; input = 0; } - - lo_message msg = lo_message_new (); - string path = "/strip/monitor_input"; - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - lo_message_add_int32 (msg, (float) input); - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); - - msg = lo_message_new (); - path = "/strip/monitor_disk"; - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - lo_message_add_int32 (msg, (float) disk); - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); + _osc.int_message_with_id ("/strip/monitor_input", ssid, input, addr); + _osc.int_message_with_id ("/strip/monitor_disk", ssid, disk, addr); } void -OSCRouteObserver::send_trim_message (string path, boost::shared_ptr controllable) +OSCRouteObserver::send_trim_message () { - if (_last_trim != controllable->get_value()) { - _last_trim = controllable->get_value(); + if (_last_trim != _strip->trim_control()->get_value()) { + _last_trim = _strip->trim_control()->get_value(); } else { return; } - if (gainmode) { - text_with_id ("/strip/name", ssid, string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (controllable->get_value()))); + if (sur->gainmode) { + _osc.text_message_with_id ("/strip/name", ssid, string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (_last_trim)), addr); trim_timeout = 8; } - lo_message msg = lo_message_new (); - - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - - lo_message_add_float (msg, (float) accurate_coefficient_to_dB (controllable->get_value())); - - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); + _osc.float_message_with_id ("/strip/trimdB", ssid, (float) accurate_coefficient_to_dB (_last_trim), addr); } void -OSCRouteObserver::send_gain_message (string path, boost::shared_ptr controllable) +OSCRouteObserver::send_gain_message () { + boost::shared_ptr controllable = _strip->gain_control(); if (_last_gain != controllable->get_value()) { _last_gain = controllable->get_value(); } else { return; } - lo_message msg = lo_message_new (); - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - - if (gainmode) { - lo_message_add_float (msg, controllable->internal_to_interface (controllable->get_value())); - text_with_id ("/strip/name", ssid, string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (controllable->get_value()))); + if (sur->gainmode) { + _osc.float_message_with_id ("/strip/fader", ssid, controllable->internal_to_interface (_last_gain), addr); + _osc.text_message_with_id ("/strip/name", ssid, string_compose ("%1%2%3", std::fixed, std::setprecision(2), accurate_coefficient_to_dB (controllable->get_value())), addr); gain_timeout = 8; } else { if (controllable->get_value() < 1e-15) { - lo_message_add_float (msg, -200); + _osc.float_message_with_id ("/strip/gain", ssid, -200, addr); } else { - lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value())); + _osc.float_message_with_id ("/strip/gain", ssid, accurate_coefficient_to_dB (_last_gain), addr); } } - - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); } void -OSCRouteObserver::gain_automation (string path) +OSCRouteObserver::gain_automation () { - lo_message msg = lo_message_new (); - string apath = string_compose ("%1/automation", path); - string npath = string_compose ("%1/automation_name", path); - - if (feedback[2]) { - apath = set_path (apath); - } else { - lo_message_add_int32 (msg, ssid); + string path = "/strip/gain"; + if (sur->gainmode) { + path = "/strip/fader"; } - - boost::shared_ptr control = _strip->gain_control(); - send_gain_message (path, control); - as = control->alist()->automation_state(); + send_gain_message (); + as = _strip->gain_control()->alist()->automation_state(); string auto_name; float output = 0; switch (as) { @@ -439,39 +306,15 @@ OSCRouteObserver::gain_automation (string path) output = 3; auto_name = "Touch"; break; + case ARDOUR::Latch: + output = 4; + auto_name = "Latch"; + break; default: break; } - - lo_message_add_float (msg, output); - lo_send_message (addr, apath.c_str(), msg); - lo_message_free (msg); - text_with_id (npath, ssid, auto_name); -} - -string -OSCRouteObserver::set_path (string path) -{ - if (feedback[2]) { - path = string_compose ("%1/%2", path, ssid); - } - return path; -} - -void -OSCRouteObserver::clear_strip (string path, float val) -{ - lo_message msg = lo_message_new (); - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - lo_message_add_float (msg, val); - - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); - + _osc.float_message_with_id (string_compose ("%1/automation", path), ssid, output, addr); + _osc.text_message_with_id (string_compose ("%1/automation_name", path), ssid, auto_name, addr); } void @@ -479,17 +322,7 @@ OSCRouteObserver::send_select_status (const PropertyChange& what) { if (what == PropertyChange(ARDOUR::Properties::selected)) { if (_strip) { - string path = "/strip/select"; - - lo_message msg = lo_message_new (); - if (feedback[2]) { - path = set_path (path); - } else { - lo_message_add_int32 (msg, ssid); - } - lo_message_add_float (msg, _strip->is_selected()); - lo_send_message (addr, path.c_str(), msg); - lo_message_free (msg); + _osc.float_message_with_id ("/strip/select", ssid, _strip->is_selected(), addr); } } } diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h index 7c80dae936..be7dd27a4e 100644 --- a/libs/surfaces/osc/osc_route_observer.h +++ b/libs/surfaces/osc/osc_route_observer.h @@ -36,24 +36,24 @@ class OSCRouteObserver { public: - OSCRouteObserver (boost::shared_ptr, uint32_t sid, ArdourSurface::OSC::OSCSurface* sur); + OSCRouteObserver (ArdourSurface::OSC& o, uint32_t sid, ArdourSurface::OSC::OSCSurface* sur); ~OSCRouteObserver (); boost::shared_ptr strip () const { return _strip; } lo_address address() const { return addr; }; void tick (void); void send_select_status (const PBD::PropertyChange&); + void refresh_strip (bool force); private: boost::shared_ptr _strip; PBD::ScopedConnectionList strip_connections; + ArdourSurface::OSC& _osc; lo_address addr; std::string path; uint32_t ssid; - uint32_t gainmode; - std::bitset<32> feedback; ArdourSurface::OSC::OSCSurface* sur; float _last_meter; uint32_t gain_timeout; @@ -66,13 +66,10 @@ class OSCRouteObserver void name_changed (const PBD::PropertyChange& what_changed); void send_change_message (std::string path, boost::shared_ptr controllable); - void text_with_id (std::string path, uint32_t id, std::string name); void send_monitor_status (boost::shared_ptr controllable); - void send_gain_message (std::string path, boost::shared_ptr controllable); - void gain_automation (std::string path); - void send_trim_message (std::string path, boost::shared_ptr controllable); - std::string set_path (std::string path); - void clear_strip (std::string path, float val); + void send_gain_message (); + void gain_automation (); + void send_trim_message (); }; #endif /* __osc_oscrouteobserver_h__ */ -- cgit v1.2.3