From ba383b4726ea1b35c0d977d6cf0e39f7eb9a6372 Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Tue, 7 Nov 2017 09:31:14 -0800 Subject: [PATCH] OSC link: Clean up link not ready and surface refresh --- libs/surfaces/osc/osc.cc | 37 +++++++--- libs/surfaces/osc/osc.h | 1 + libs/surfaces/osc/osc_route_observer.cc | 94 ++++++++++++++----------- libs/surfaces/osc/osc_route_observer.h | 3 +- 4 files changed, 86 insertions(+), 49 deletions(-) diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 65ea48aa62..8e3d80fb0f 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -1406,15 +1406,16 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l } else { // User expects this surface to be removed from any sets - int oldset = sur->linkset; + uint32_t oldset = sur->linkset; if (oldset) { - int oldid = sur->linkid; + uint32_t oldid = sur->linkid; sur->linkid = 1; sur->linkset = 0; - ls = &link_sets[oldid]; + ls = &link_sets[oldset]; if (ls) { - ls->not_ready = 1; - ls->urls[(uint32_t) data] = ""; + ls->not_ready = oldid; + ls->urls[oldid] = ""; + surface_link_state (ls); } } return 0; @@ -1440,7 +1441,7 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l ls->urls[(uint32_t) data] = sur->remote_url; ls->not_ready = link_check (set); if (ls->not_ready) { - strip_feedback (sur, true); + surface_link_state (ls); } else { _set_bank (1, get_address (msg)); } @@ -1450,6 +1451,22 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l return ret; } +void +OSC::surface_link_state (LinkSet * set) +{ + for (uint32_t dv = 1; dv < set->urls.size(); dv++) { + OSCSurface *sur; + + if (set->urls[dv] != "") { + string url = set->urls[dv]; + sur = get_surface (lo_address_new_from_url (url.c_str())); + for (uint32_t i = 0; i < sur->observers.size(); i++) { + sur->observers[i]->set_link_ready (set->not_ready); + } + } + } +} + int OSC::link_check (uint32_t set) { @@ -1862,7 +1879,6 @@ OSC::global_feedback (OSCSurface* sur) void OSC::strip_feedback (OSCSurface* sur, bool new_bank_size) { - new_bank_size = true; sur->strips = get_sorted_stripables(sur->strip_types, sur->cue); sur->nstrips = sur->strips.size(); if (new_bank_size || (!sur->feedback[0] && !sur->feedback[1])) { @@ -1889,7 +1905,8 @@ OSC::strip_feedback (OSCSurface* sur, bool new_bank_size) } else { if (sur->feedback[0] || sur->feedback[1]) { for (uint32_t i = 0; i < sur->observers.size(); i++) { - sur->observers[i]->refresh_strip(true); + boost::shared_ptr str = get_strip (i + 1, lo_address_new_from_url (sur->remote_url.c_str())); + sur->observers[i]->refresh_strip(str, true); } } } @@ -2023,6 +2040,10 @@ OSC::_set_bank (uint32_t bank_start, lo_address addr) bank_leds (sur); lo_address_free (sur_addr); } + if (not_ready) { + surface_link_state (set); + } + } else { s->bank = bank_limits_check (bank_start, s->bank_size, nstrips); diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index b1b5611499..d4a0128743 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -277,6 +277,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI boost::shared_ptr get_strip (uint32_t ssid, lo_address addr); void global_feedback (OSCSurface* sur); void strip_feedback (OSCSurface* sur, bool new_bank_size); + void surface_link_state (LinkSet * sur); void surface_destroy (OSCSurface* sur); uint32_t bank_limits_check (uint32_t bank, uint32_t size, uint32_t total); void bank_leds (OSCSurface* sur); diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index 3db6e20f1d..48c5a24ec3 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -49,16 +49,30 @@ OSCRouteObserver::OSCRouteObserver (OSC& o, uint32_t ss, ArdourSurface::OSC::OSC ,_init (true) ,_expand (2048) { - addr = lo_address_new_from_url (sur->remote_url.c_str()); + addr = lo_address_new_from_url (sur->remote_url.c_str()); gainmode = sur->gainmode; feedback = sur->feedback; in_line = feedback[2]; + uint32_t sid = sur->bank + ssid - 2; + uint32_t not_ready = 0; + if (sur->linkset) { + not_ready = _osc.link_sets[sur->linkset].not_ready; + } + if (not_ready) { + set_link_ready (not_ready); + } else if (sid >= sur->strips.size ()) { + // this _should_ only occure if the number of strips is less than banksize + _strip = boost::shared_ptr(); + clear_strip (); + } else { + _strip = sur->strips[sid]; + refresh_strip (_strip, true); + } if (sur->expand_enable) { set_expand (sur->expand); } else { set_expand (0); } - refresh_strip (true); } OSCRouteObserver::~OSCRouteObserver () @@ -85,7 +99,7 @@ OSCRouteObserver::no_strip () } void -OSCRouteObserver::refresh_strip (bool force) +OSCRouteObserver::refresh_strip (boost::shared_ptr new_strip, bool force) { _init = true; if (_tick_busy) { @@ -93,51 +107,22 @@ OSCRouteObserver::refresh_strip (bool force) } _last_gain =-1.0; _last_trim =-1.0; - uint32_t sid = sur->bank + ssid - 2; - if (sid >= sur->strips.size ()) { - // this _should_ only occure if the number of strips is less than banksize - if (_strip) { - _strip = boost::shared_ptr(); - clear_strip (); - } - return; - } - if (sur->linkset) { - uint32_t not_ready = _osc.link_sets[sur->linkset].not_ready; - if (not_ready) { - clear_strip (); - switch (ssid) { - case 1: - _osc.text_message_with_id ("/strip/name", ssid, "Device", in_line, addr); - break; - case 2: - _osc.text_message_with_id ("/strip/name", ssid, string_compose ("%1", not_ready), in_line, addr); - break; - case 3: - _osc.text_message_with_id ("/strip/name", ssid, "Missing", in_line, addr); - break; - case 4: - _osc.text_message_with_id ("/strip/name", ssid, "from", in_line, addr); - break; - case 5: - _osc.text_message_with_id ("/strip/name", ssid, "Linkset", in_line, addr); - break; - default: - break; - } - return; - } - } send_select_status (ARDOUR::Properties::selected); - boost::shared_ptr new_strip = sur->strips[sur->bank + ssid - 2]; - if (_strip && (new_strip == _strip) && !force) { + if ((new_strip == _strip) && !force) { + // no change don't send feedback _init = false; return; } strip_connections.drop_connections (); _strip = new_strip; + if (!_strip) { + // this strip is blank and should be cleared + clear_strip (); + _init = false; + return; + } _strip->DropReferences.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCRouteObserver::no_strip, this), OSC::instance()); as = ARDOUR::Off; @@ -217,6 +202,35 @@ OSCRouteObserver::set_expand (uint32_t expand) } } +void +OSCRouteObserver::set_link_ready (uint32_t not_ready) +{ + if (not_ready) { + clear_strip (); + switch (ssid) { + case 1: + _osc.text_message_with_id ("/strip/name", ssid, "Device", in_line, addr); + break; + case 2: + _osc.text_message_with_id ("/strip/name", ssid, string_compose ("%1", not_ready), in_line, addr); + break; + case 3: + _osc.text_message_with_id ("/strip/name", ssid, "Missing", in_line, addr); + break; + case 4: + _osc.text_message_with_id ("/strip/name", ssid, "from", in_line, addr); + break; + case 5: + _osc.text_message_with_id ("/strip/name", ssid, "Linkset", in_line, addr); + break; + default: + break; + } + } else { + refresh_strip (_strip, true); + } +} + void OSCRouteObserver::clear_strip () { diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h index f51f722eee..f47099ef53 100644 --- a/libs/surfaces/osc/osc_route_observer.h +++ b/libs/surfaces/osc/osc_route_observer.h @@ -44,8 +44,9 @@ class OSCRouteObserver lo_address address () const { return addr; }; void tick (void); void send_select_status (const PBD::PropertyChange&); - void refresh_strip (bool force); + void refresh_strip (boost::shared_ptr strip, bool force); void set_expand (uint32_t expand); + void set_link_ready (uint32_t not_ready); void clear_strip (); private: