OSC: Feedback was not making it to surface
authorLen Ovens <len@ovenwerks.net>
Tue, 17 Apr 2018 20:10:59 +0000 (13:10 -0700)
committerLen Ovens <len@ovenwerks.net>
Tue, 19 Jun 2018 16:46:29 +0000 (09:46 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_global_observer.h
libs/surfaces/osc/osc_route_observer.cc

index 2cb1857487b3d062857bfe9b8aa092e23ea87c99..b82c442957e965e356fc8a73a9872bfb1bfe7161 100644 (file)
@@ -1737,6 +1737,7 @@ OSC::surface_parse (const char *path, const char* types, lo_arg **argv, int argc
        int se_page = sur->send_page_size;
        int fadermode = sur->gainmode;
        int feedback = sur->feedback.to_ulong();
+       sur->feedback = 0;
        int strip_types = sur->strip_types.to_ulong();
        int bank_size = sur->bank_size;
        int linkset = sur->linkset;
@@ -2129,7 +2130,9 @@ OSC::set_surface_port (uint32_t po, lo_message msg)
                                                it++;
                                        }
                                }
-                               refresh_surface (msg);
+                               if (sur->feedback.to_ulong()) {
+                                       refresh_surface (msg);
+                               }
                                return 0;
                        }
                }
@@ -2215,7 +2218,9 @@ void
 OSC::global_feedback (OSCSurface* sur)
 {
        OSCGlobalObserver* o = sur->global_obs;
-       delete o;
+       if (o) {
+               delete o;
+       }
        if (sur->feedback[4] || sur->feedback[3] || sur->feedback[5] || sur->feedback[6]) {
 
                // create a new Global Observer for this surface
@@ -2850,7 +2855,6 @@ OSC::_sel_bus_only (lo_address addr)
 {
        OSCSurface *sur = get_surface(addr);
        boost::shared_ptr<Stripable> s = sur->select;
-       std::cout << string_compose ("bus_only for: %1\n", s->name());
        if (s) {
                boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s);
                if (rt) {
@@ -4482,7 +4486,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
                _select = s;
        }
        if (s != old_sel) {
-               std::cout << string_compose ("new Select: %1\n", s->name());
                sur->select = s;
 
 /*
@@ -4507,7 +4510,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
        OSCSelectObserver* so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs);
        if (sur->feedback[13]) {
                if (so != 0) {
-                       std::cout << string_compose ("refreshing select: %1\n", s->name());
                        so->refresh_strip (s, nsends, sur->gainmode, true);
                } else {
                        OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, *session, sur);
@@ -4531,7 +4533,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
                }
        }
        if (s != old_sel) {
-               std::cout << string_compose ("new Select2: %1\n", s->name());
                sur->select = s;
                if (sur->temp_mode == GroupOnly) {
                        boost::shared_ptr<Route> ort = boost::dynamic_pointer_cast<Route> (old_sel);
@@ -4577,7 +4578,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
                                _set_bank (1, addr);
                        }
                } else if (sur->temp_mode == BusOnly) {
-                       std::cout << string_compose ("bus only select: %1\n", s->name());
                        boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s);
                        if (rt) {
                                if (!rt->is_track () && rt->can_solo ()) {
@@ -4705,9 +4705,7 @@ OSC::sel_delta (int delta, lo_message msg)
        boost::weak_ptr<Stripable> o_sel = sur->select;
        boost::shared_ptr<Stripable> old_sel= o_sel.lock ();
        for (uint32_t i = 0; i < nstps; i++) {
-               std::cout << string_compose ("try strip %1 - %2\n", i, sel_strips[i]->name());
                if (old_sel == sel_strips[i]) {
-                       std::cout << string_compose ("got strip %1 - %2\n", i, sel_strips[i]->name());
                        if (i && delta < 0) {
                                new_sel = sel_strips[i - 1];
                        } else if ((i + 1) < nstps && delta > 0) {
@@ -4720,7 +4718,6 @@ OSC::sel_delta (int delta, lo_message msg)
                                // should not happen
                                return -1;
                        }
-                       std::cout << string_compose ("New strip %1\n",new_sel->name());
                }
        }
        if (!new_sel) {
@@ -6577,13 +6574,16 @@ OSC::cue_send_enable (uint32_t id, float state, lo_message msg)
 int
 OSC::float_message (string path, float val, lo_address addr)
 {
+       _lo_lock.lock ();
 
        lo_message reply;
        reply = lo_message_new ();
        lo_message_add_float (reply, (float) val);
 
        lo_send_message (addr, path.c_str(), reply);
+       Glib::usleep(1);
        lo_message_free (reply);
+       _lo_lock.unlock ();
 
        return 0;
 }
@@ -6591,6 +6591,7 @@ OSC::float_message (string path, float val, lo_address addr)
 int
 OSC::float_message_with_id (std::string path, uint32_t ssid, float value, bool in_line, lo_address addr)
 {
+       _lo_lock.lock ();
        lo_message msg = lo_message_new ();
        if (in_line) {
                path = string_compose ("%1/%2", path, ssid);
@@ -6600,20 +6601,25 @@ OSC::float_message_with_id (std::string path, uint32_t ssid, float value, bool i
        lo_message_add_float (msg, value);
 
        lo_send_message (addr, path.c_str(), msg);
+       Glib::usleep(1);
        lo_message_free (msg);
+       _lo_lock.unlock ();
        return 0;
 }
 
 int
 OSC::int_message (string path, int val, lo_address addr)
 {
+       _lo_lock.lock ();
 
        lo_message reply;
        reply = lo_message_new ();
        lo_message_add_int32 (reply, (float) val);
 
        lo_send_message (addr, path.c_str(), reply);
+       Glib::usleep(1);
        lo_message_free (reply);
+       _lo_lock.unlock ();
 
        return 0;
 }
@@ -6621,6 +6627,7 @@ OSC::int_message (string path, int val, lo_address addr)
 int
 OSC::int_message_with_id (std::string path, uint32_t ssid, int value, bool in_line, lo_address addr)
 {
+       _lo_lock.lock ();
        lo_message msg = lo_message_new ();
        if (in_line) {
                path = string_compose ("%1/%2", path, ssid);
@@ -6630,20 +6637,25 @@ OSC::int_message_with_id (std::string path, uint32_t ssid, int value, bool in_li
        lo_message_add_int32 (msg, value);
 
        lo_send_message (addr, path.c_str(), msg);
+       Glib::usleep(1);
        lo_message_free (msg);
+       _lo_lock.unlock ();
        return 0;
 }
 
 int
 OSC::text_message (string path, string val, lo_address addr)
 {
+       _lo_lock.lock ();
 
        lo_message reply;
        reply = lo_message_new ();
        lo_message_add_string (reply, val.c_str());
 
        lo_send_message (addr, path.c_str(), reply);
+       Glib::usleep(1);
        lo_message_free (reply);
+       _lo_lock.unlock ();
 
        return 0;
 }
@@ -6651,6 +6663,7 @@ OSC::text_message (string path, string val, lo_address addr)
 int
 OSC::text_message_with_id (std::string path, uint32_t ssid, std::string val, bool in_line, lo_address addr)
 {
+       _lo_lock.lock ();
        lo_message msg = lo_message_new ();
        if (in_line) {
                path = string_compose ("%1/%2", path, ssid);
@@ -6661,7 +6674,9 @@ OSC::text_message_with_id (std::string path, uint32_t ssid, std::string val, boo
        lo_message_add_string (msg, val.c_str());
 
        lo_send_message (addr, path.c_str(), msg);
+       Glib::usleep(1);
        lo_message_free (msg);
+       _lo_lock.unlock ();
        return 0;
 }
 
index 41e1fb6a2e39807246f1cf22f2f6a4582f044b03..fb721f2b1c16ed636b024c4e31866c8264e6b01c 100644 (file)
@@ -88,7 +88,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        bool get_active () const;
 
        // generic osc send
-
+       Glib::Threads::Mutex _lo_lock;
        int float_message (std::string, float value, lo_address addr);
        int int_message (std::string, int value, lo_address addr);
        int text_message (std::string path, std::string val, lo_address addr);
index 0917ce3761e7b10272853e874a39b00fe8817536..01d16c2e6a709d831d12a821254ea850dcbfaff0 100644 (file)
@@ -41,9 +41,9 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
        : _osc (o)
        ,sur (su)
        ,_init (true)
-       ,_last_master_gain (0.0)
-       ,_last_master_trim (0.0)
-       ,_last_monitor_gain (0.0)
+       ,_last_master_gain (-1.0)
+       ,_last_master_trim (-1.0)
+       ,_last_monitor_gain (-1.0)
        ,_jog_mode (1024)
        ,last_punchin (4)
        ,last_punchout (4)
@@ -55,6 +55,7 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
        feedback = sur->feedback;
        uint32_t jogmode = sur->jogmode;
        _last_sample = -1;
+       mark_text = "";
        if (feedback[4]) {
 
                // connect to all the things we want to send feed back from
@@ -70,21 +71,21 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
 
                boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
                mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
-               send_change_message (X_("/master/mute"), strip->mute_control());
+               send_change_message (X_("/master/mute"), mute_controllable);
 
                boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
                trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
-               send_trim_message (X_("/master/trimdB"), strip->trim_control());
+               send_trim_message (X_("/master/trimdB"), trim_controllable);
 
                boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
                if (pan_controllable) {
                        pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
-                       send_change_message (X_("/master/pan_stereo_position"), strip->pan_azimuth_control());
+                       send_change_message (X_("/master/pan_stereo_position"), pan_controllable);
                }
 
                boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
                gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/"), strip->gain_control()), OSC::instance());
-               send_gain_message (X_("/master/"), strip->gain_control());
+               send_gain_message (X_("/master/"), gain_controllable);
 
                // monitor stuff next
                strip = session->monitor_out();
@@ -104,8 +105,8 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
                        send_change_message (X_("/monitor/mono"), mon_mono_cont);
 
                        gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
-                               gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/"), strip->gain_control()), OSC::instance());
-                               send_gain_message (X_("/monitor/"), strip->gain_control());
+                       gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/"), strip->gain_control()), OSC::instance());
+                       send_gain_message (X_("/monitor/"), gain_controllable);
                }
 
                //Transport feedback
@@ -361,6 +362,7 @@ void
 OSCGlobalObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
 {
        bool ismaster = false;
+
        if (path.find(X_("master")) != std::string::npos) {
                ismaster = true;
                if (_last_master_gain != controllable->get_value()) {
@@ -443,34 +445,36 @@ OSCGlobalObserver::marks_changed ()
 void
 OSCGlobalObserver::mark_update ()
 {
-       if (!lm.size()) {
-               _osc.text_message (X_("/marker"), "No Marks", addr);
-               return;
-       }
-       uint32_t prev = 0;
-       uint32_t next = lm.size() - 1;
-       for (uint32_t i = 0; i < lm.size (); i++) {
-               if ((lm[i].when <= _last_sample) && (i > prev)) {
-                       prev = i;
+       string send_str = "No Marks";
+       if (lm.size()) {
+               uint32_t prev = 0;
+               uint32_t next = lm.size() - 1;
+               for (uint32_t i = 0; i < lm.size (); i++) {
+                       if ((lm[i].when <= _last_sample) && (i > prev)) {
+                               prev = i;
+                       }
+                       if ((lm[i].when >= _last_sample) && (i < next)) {
+                               next = i;
+                               break;
+                       }
                }
-               if ((lm[i].when >= _last_sample) && (i < next)) {
-                       next = i;
-                       break;
+               if ((prev_mark != lm[prev].when) || (next_mark != lm[next].when)) {
+                       string send_str = lm[prev].label;
+                       prev_mark = lm[prev].when;
+                       next_mark = lm[next].when;
+                       if (prev != next) {
+                               send_str = string_compose ("%1 <-> %2", lm[prev].label, lm[next].label);
+                       }
+                       if (_last_sample > lm[lm.size() - 1].when) {
+                               send_str = string_compose ("%1 <-", lm[lm.size() - 1].label);
+                       }
+                       if (_last_sample < lm[0].when) {
+                               send_str = string_compose ("-> %1", lm[0].label);
+                       }
                }
        }
-       if ((prev_mark != lm[prev].when) || (next_mark != lm[next].when)) {
-               string send_str = lm[prev].label;
-               prev_mark = lm[prev].when;
-               next_mark = lm[next].when;
-               if (prev != next) {
-                       send_str = string_compose ("%1 <-> %2", lm[prev].label, lm[next].label);
-               }
-               if (_last_sample > lm[lm.size() - 1].when) {
-                       send_str = string_compose ("%1 <-", lm[lm.size() - 1].label);
-               }
-               if (_last_sample < lm[0].when) {
-                       send_str = string_compose ("-> %1", lm[0].label);
-               }
+       if (send_str != mark_text) {
+               mark_text = send_str;
                _osc.text_message (X_("/marker"), send_str, addr);
        }
 
index 04403d0328b5551409213411e2ba54954a312f74..2f6972fce089914bdad2489150ef2fa5d5dd28dd 100644 (file)
@@ -59,6 +59,7 @@ class OSCGlobalObserver
        float _last_monitor_gain;
        lo_address addr;
        std::string path;
+       std::string mark_text;
        uint32_t gainmode;
        std::bitset<32> feedback;
        ARDOUR::Session* session;
index 840142f4a6b18138a0f9a088d389154e4a4de0a9..a519635586f77ca2ee095e1636323c09d6250308 100644 (file)
@@ -107,7 +107,7 @@ OSCRouteObserver::no_strip ()
         * that does not exist... Crash
         */
  }
-       
+
 void
 OSCRouteObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip, bool force)
 {