diff options
-rw-r--r-- | libs/surfaces/osc/osc.cc | 21 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 2 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_cue_observer.cc | 1 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_global_observer.cc | 16 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_global_observer.h | 5 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_route_observer.cc | 6 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_route_observer.h | 1 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_select_observer.cc | 8 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_select_observer.h | 1 |
9 files changed, 43 insertions, 18 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index bc96db636f..cc13c48eee 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -1596,7 +1596,7 @@ OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, ui // set bank and strip feedback set_bank(s->bank, msg); - global_feedback (s->feedback, get_address (msg), s->gainmode); + global_feedback (*s, get_address (msg)); sel_send_pagesize (se_size, msg); sel_plug_pagesize (pi_size, msg); return 0; @@ -1640,7 +1640,7 @@ OSC::set_surface_feedback (uint32_t fb, lo_message msg) set_bank(s->bank, msg); // Set global/master feedback - global_feedback (s->feedback, get_address (msg), s->gainmode); + global_feedback (*s, get_address (msg)); return 0; } @@ -1654,7 +1654,7 @@ OSC::set_surface_gainmode (uint32_t gm, lo_message msg) set_bank(s->bank, msg); // Set global/master feedback - global_feedback (s->feedback, get_address (msg), s->gainmode); + global_feedback (*s, get_address (msg)); return 0; } @@ -1729,24 +1729,24 @@ OSC::get_surface (lo_address addr) _set_bank(s.bank, addr); // Set global/master feedback - global_feedback (s.feedback, addr, s.gainmode); + global_feedback (s, addr); return &_surface[_surface.size() - 1]; } // setup global feedback for a surface void -OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode) +OSC::global_feedback (OSCSurface sur, lo_address addr) { // first destroy global observer for this surface GlobalObservers::iterator x; for (x = global_observers.begin(); x != global_observers.end();) { - OSCGlobalObserver* ro; + OSCGlobalObserver* go; - if ((ro = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) { + if ((go = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) { - int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr)); + int res = strcmp(lo_address_get_url(go->address()), lo_address_get_url(addr)); if (res == 0) { delete *x; @@ -1758,9 +1758,10 @@ OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode) ++x; } } + std::bitset<32> feedback = sur.feedback; if (feedback[4] || feedback[3] || feedback[5] || feedback[6]) { // create a new Global Observer for this surface - OSCGlobalObserver* o = new OSCGlobalObserver (*session, addr, gainmode, /*s->*/feedback); + OSCGlobalObserver* o = new OSCGlobalObserver (*session, &sur); global_observers.push_back (o); } } @@ -4784,7 +4785,7 @@ OSC::periodic (void) for (uint32_t it = 0; it < _surface.size(); it++) { OSCSurface* sur = &_surface[it]; lo_address addr = lo_address_new_from_url (sur->remote_url.c_str()); - global_feedback (sur->feedback, addr, sur->gainmode); + global_feedback (*sur, addr); } global_init = false; tick = true; diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 99e8130544..20a7b96632 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -240,7 +240,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int check_surface (lo_message msg); uint32_t get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr); boost::shared_ptr<ARDOUR::Stripable> get_strip (uint32_t ssid, lo_address addr); - void global_feedback (std::bitset<32> feedback, lo_address addr, uint32_t gainmode); + void global_feedback (OSCSurface sur, lo_address addr); void send_current_value (const char* path, lo_arg** argv, int argc, lo_message msg); void current_value_query (const char* path, size_t len, lo_arg **argv, int argc, lo_message msg); diff --git a/libs/surfaces/osc/osc_cue_observer.cc b/libs/surfaces/osc/osc_cue_observer.cc index d36fdaf3a9..11d62073cf 100644 --- a/libs/surfaces/osc/osc_cue_observer.cc +++ b/libs/surfaces/osc/osc_cue_observer.cc @@ -60,6 +60,7 @@ OSCCueObserver::OSCCueObserver (boost::shared_ptr<Stripable> s, std::vector<boos OSCCueObserver::~OSCCueObserver () { + tick_enable = false; strip_connections.drop_connections (); send_end (); diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc index aa890e987f..a76463d467 100644 --- a/libs/surfaces/osc/osc_global_observer.cc +++ b/libs/surfaces/osc/osc_global_observer.cc @@ -36,12 +36,15 @@ using namespace PBD; using namespace ARDOUR; using namespace ArdourSurface; -OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std::bitset<32> fb) - : gainmode (gm) - ,feedback (fb) +OSCGlobalObserver::OSCGlobalObserver (Session& s, ArdourSurface::OSC::OSCSurface* su) + : sur (su) + ,_init (true) { - addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a)); + addr = lo_address_new_from_url (sur->remote_url.c_str()); + //addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a)); session = &s; + gainmode = sur->gainmode; + feedback = sur->feedback; _last_frame = -1; if (feedback[4]) { @@ -117,10 +120,12 @@ OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std * Maybe (many) more */ } + _init = false; } OSCGlobalObserver::~OSCGlobalObserver () { + _init = true; // need to add general zero everything messages strip_connections.drop_connections (); @@ -132,6 +137,9 @@ OSCGlobalObserver::~OSCGlobalObserver () void OSCGlobalObserver::tick () { + if (_init) { + return; + } framepos_t now_frame = session->transport_frame(); if (now_frame != _last_frame) { if (feedback[6]) { // timecode enabled diff --git a/libs/surfaces/osc/osc_global_observer.h b/libs/surfaces/osc/osc_global_observer.h index 9e0bef450a..9c4e0d6ddc 100644 --- a/libs/surfaces/osc/osc_global_observer.h +++ b/libs/surfaces/osc/osc_global_observer.h @@ -33,7 +33,7 @@ class OSCGlobalObserver { public: - OSCGlobalObserver (ARDOUR::Session& s, lo_address addr, uint32_t gainmode, std::bitset<32> feedback); + OSCGlobalObserver (ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* su); ~OSCGlobalObserver (); lo_address address() const { return addr; }; @@ -49,7 +49,8 @@ class OSCGlobalObserver Monitor, }; - + ArdourSurface::OSC::OSCSurface* sur; + bool _init; lo_address addr; std::string path; uint32_t gainmode; diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index bf1ec24953..506ad8aea6 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -43,6 +43,7 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, uint32_t ss, ,ssid (ss) ,sur (su) ,_last_gain (0.0) + ,_init (true) { addr = lo_address_new_from_url (sur->remote_url.c_str()); gainmode = sur->gainmode; @@ -109,11 +110,13 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, uint32_t ss, send_change_message ("/strip/pan_stereo_position", _strip->pan_azimuth_control()); } } + _init = false; tick(); } OSCRouteObserver::~OSCRouteObserver () { + _init = true; strip_connections.drop_connections (); if (sur->no_clear) { @@ -163,6 +166,9 @@ OSCRouteObserver::~OSCRouteObserver () void OSCRouteObserver::tick () { + if (_init) { + return; + } if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled // the only meter here is master float now_meter; diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h index a8e6828112..acf4a8744b 100644 --- a/libs/surfaces/osc/osc_route_observer.h +++ b/libs/surfaces/osc/osc_route_observer.h @@ -59,6 +59,7 @@ class OSCRouteObserver uint32_t gain_timeout; uint32_t trim_timeout; float _last_gain; + bool _init; ARDOUR::AutoState as; diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index dfc1a80319..092da95a5a 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -54,8 +54,9 @@ OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address ,sur (su) ,nsends (0) ,_last_gain (0.0) + ,_init (true) { - addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a)); + addr = lo_address_new_from_url (sur->remote_url.c_str()); gainmode = sur->gainmode; feedback = sur->feedback; as = ARDOUR::Off; @@ -173,12 +174,14 @@ OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address change_message ("/select/comp_makeup", _strip->comp_makeup_controllable()); } + _init = false; tick(); } OSCSelectObserver::~OSCSelectObserver () { + _init = true; strip_connections.drop_connections (); // all strip buttons should be off and faders 0 and etc. send_float ("/select/expand", 0); @@ -427,6 +430,9 @@ OSCSelectObserver::plugin_end () void OSCSelectObserver::tick () { + if (_init) { + return; + } if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled float now_meter; if (_strip->peak_meter()) { diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h index ea5ab5aeed..71640fd106 100644 --- a/libs/surfaces/osc/osc_select_observer.h +++ b/libs/surfaces/osc/osc_select_observer.h @@ -66,6 +66,7 @@ class OSCSelectObserver float _last_meter; uint32_t nsends; float _last_gain; + bool _init; float _comp_redux; ARDOUR::AutoState as; uint32_t send_size; |