OSC: make sure initialization is complete before we allow periodic to run
authorLen Ovens <len@ovenwerks.net>
Mon, 24 Jul 2017 03:07:01 +0000 (20:07 -0700)
committerLen Ovens <len@ovenwerks.net>
Mon, 24 Jul 2017 03:08:02 +0000 (20:08 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_cue_observer.cc
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_global_observer.h
libs/surfaces/osc/osc_route_observer.cc
libs/surfaces/osc/osc_route_observer.h
libs/surfaces/osc/osc_select_observer.cc
libs/surfaces/osc/osc_select_observer.h

index bc96db636f1151423e4e05f50b2bced1ee4de9cb..cc13c48eeef349066ecf964475c7e63ae46c1c5d 100644 (file)
@@ -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;
index 99e8130544e1c35c7409f398823477207e6440a8..20a7b966329060c4e54cc027efa24f7b86a37a05 100644 (file)
@@ -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);
index d36fdaf3a9f790ea4ee0e7178293421b6f196bc0..11d62073cf8fd4e3746d05b6c399dacbbe348146 100644 (file)
@@ -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 ();
index aa890e987fbacfa4571eeac5ad5d10ae3a0d6730..a76463d467e5ee92eda72a65a5e0267cc62274cc 100644 (file)
@@ -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
index 9e0bef450a9ae3e23175fbf8f097fd8492ed4031..9c4e0d6ddcb370dc6fe3e41b4c94fbb1008be386 100644 (file)
@@ -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;
index bf1ec249535bb0e508e4c4e6e711b35cf42f50ce..506ad8aea660622ded99437fb72c83fa34e87345 100644 (file)
@@ -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;
index a8e682811235616d1990a2c2a9f60ebe024a16af..acf4a8744b69485a98d3f7020a1efa0827b05099 100644 (file)
@@ -59,6 +59,7 @@ class OSCRouteObserver
        uint32_t gain_timeout;
        uint32_t trim_timeout;
        float _last_gain;
+       bool _init;
        ARDOUR::AutoState as;
 
 
index dfc1a803198e63d881b9ac7e38f00dd3b67be811..092da95a5a358b9ba965a82e94b53cb710ac04cb 100644 (file)
@@ -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()) {
index ea5ab5aeedf5f9529166b57002ef4bb972a9df88..71640fd106f84eea39b210a580d804215a5248ef 100644 (file)
@@ -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;