OSC: Add value feedback to strip fader and trim
authorLen Ovens <len@ovenwerks.net>
Wed, 17 Aug 2016 15:24:57 +0000 (08:24 -0700)
committerLen Ovens <len@ovenwerks.net>
Wed, 17 Aug 2016 15:24:57 +0000 (08:24 -0700)
libs/surfaces/osc/osc_route_observer.cc
libs/surfaces/osc/osc_route_observer.h

index 7c9374aeb2bc3c94a404a3d0bb59c57675d9d7b5..e22444e4c557695928a6b177c34cce4263b2dee0 100644 (file)
@@ -104,18 +104,7 @@ OSCRouteObserver::~OSCRouteObserver ()
        // all strip buttons should be off and faders 0 and etc.
        clear_strip ("/strip/expand", 0);
        if (feedback[0]) { // buttons are separate feedback
-               lo_message msg = lo_message_new ();
-               // name is a string do it first
-               string path = "/strip/name";
-               if (feedback[2]) {
-                       path = set_path (path);
-               } else {
-                       lo_message_add_int32 (msg, ssid);
-               }
-               lo_message_add_string (msg, " ");
-
-               lo_send_message (addr, path.c_str(), msg);
-               lo_message_free (msg);
+               text_with_id ("/strip/name", ssid, " ");
                clear_strip ("/strip/mute", 0);
                clear_strip ("/strip/solo", 0);
                clear_strip ("/strip/recenable", 0);
@@ -207,6 +196,20 @@ OSCRouteObserver::tick ()
                _last_meter = now_meter;
 
        }
+       if (feedback[1]) {
+               if (gain_timeout) {
+                       if (gain_timeout == 1) {
+                               text_with_id ("/strip/name", ssid, _strip->name());
+                       }
+                       gain_timeout--;
+               }
+               if (trim_timeout) {
+                       if (trim_timeout == 1) {
+                               text_with_id ("/strip/name", ssid, _strip->name());
+                       }
+                       trim_timeout--;
+               }
+       }
 
 }
 
@@ -220,35 +223,37 @@ OSCRouteObserver::name_changed (const PBD::PropertyChange& what_changed)
        if (!_strip) {
                return;
        }
+       text_with_id ("/strip/name", ssid, _strip->name());
+}
 
+void
+OSCRouteObserver::send_change_message (string path, boost::shared_ptr<Controllable> controllable)
+{
        lo_message msg = lo_message_new ();
 
-       // ssid is the strip on the surface this observer refers to
-       // not part of the internal ordering.
-       string path = "/strip/name";
        if (feedback[2]) {
                path = set_path (path);
        } else {
                lo_message_add_int32 (msg, ssid);
        }
-       lo_message_add_string (msg, _strip->name().c_str());
+       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::send_change_message (string path, boost::shared_ptr<Controllable> controllable)
+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, ssid);
+               lo_message_add_int32 (msg, id);
        }
-       float val = controllable->get_value();
-       lo_message_add_float (msg, (float) controllable->internal_to_interface (val));
+
+       lo_message_add_string (msg, name.c_str());
 
        lo_send_message (addr, path.c_str(), msg);
        lo_message_free (msg);
@@ -300,6 +305,11 @@ OSCRouteObserver::send_monitor_status (boost::shared_ptr<Controllable> controlla
 void
 OSCRouteObserver::send_trim_message (string path, boost::shared_ptr<Controllable> controllable)
 {
+       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())));
+               trim_timeout = 8;
+       }
+
        lo_message msg = lo_message_new ();
 
        if (feedback[2]) {
@@ -327,6 +337,8 @@ OSCRouteObserver::send_gain_message (string path, boost::shared_ptr<Controllable
 
        if (gainmode) {
                lo_message_add_float (msg, gain_to_slider_position (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())));
+               gain_timeout = 8;
        } else {
                if (controllable->get_value() < 1e-15) {
                        lo_message_add_float (msg, -200);
@@ -343,9 +355,7 @@ string
 OSCRouteObserver::set_path (string path)
 {
        if (feedback[2]) {
-  ostringstream os;
-  os << path << "/" << ssid;
-  path = os.str();
+               path = string_compose ("%1/%2", path, ssid);
        }
        return path;
 }
index 7a0213d1d862a7c6c5744a539b96035baecfac40..321dc7ce21e879e9a2ed4dbf4e75b5d48347a59f 100644 (file)
@@ -53,10 +53,13 @@ class OSCRouteObserver
        uint32_t gainmode;
        std::bitset<32> feedback;
        float _last_meter;
+       uint32_t gain_timeout;
+       uint32_t trim_timeout;
 
 
        void name_changed (const PBD::PropertyChange& what_changed);
        void send_change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
+       void text_with_id (std::string path, uint32_t id, std::string name);
        void send_monitor_status (boost::shared_ptr<PBD::Controllable> controllable);
        void send_gain_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);
        void send_trim_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);