OSC: Make sends work for MB. Add pan to /path/strip
authorLen Ovens <len@ovenwerks.net>
Tue, 26 Jul 2016 21:11:06 +0000 (14:11 -0700)
committerLen Ovens <len@ovenwerks.net>
Tue, 26 Jul 2016 21:11:06 +0000 (14:11 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_route_observer.cc
libs/surfaces/osc/osc_select_observer.cc

index 71e0dd55384e7eec4a15fbdeb1c56305bce3efc7..a696ea884b2769aaaeced822af3ac28bfbfd2caf 100644 (file)
@@ -524,12 +524,12 @@ OSC::register_callbacks()
 
                // controls for "special" strips
                REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain);
-               REGISTER_CALLBACK (serv, "/master/fader", "i", master_set_fader);
+               REGISTER_CALLBACK (serv, "/master/fader", "f", master_set_fader);
                REGISTER_CALLBACK (serv, "/master/mute", "i", master_set_mute);
                REGISTER_CALLBACK (serv, "/master/trimdB", "f", master_set_trim);
                REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
                REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
-               REGISTER_CALLBACK (serv, "/monitor/fader", "i", monitor_set_fader);
+               REGISTER_CALLBACK (serv, "/monitor/fader", "f", monitor_set_fader);
 
                // Controls for the Selected strip
                REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
@@ -585,7 +585,6 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/strip/plugin/parameter", "iiif", route_plugin_parameter);
                // prints to cerr only
                REGISTER_CALLBACK (serv, "/strip/plugin/parameter/print", "iii", route_plugin_parameter_print);
-               REGISTER_CALLBACK (serv, "/strip/send/gainabs", "iif", route_set_send_gain_abs);
                REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB);
                REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader);
                REGISTER_CALLBACK (serv, "/strip/send/enable", "iif", route_set_send_enable);
@@ -895,6 +894,11 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
                        route_set_trim_dB (ssid, argv[0]->f, msg);
                        ret = 0;
                }
+               else if (!strncmp (path, "/strip/pan_stereo_position/", 27) && strlen (path) > 27) {
+                       int ssid = atoi (&path[27]);
+                       route_set_pan_stereo_position (ssid, argv[0]->f, msg);
+                       ret = 0;
+               }
                else if (!strncmp (path, "/strip/mute/", 12) && strlen (path) > 12) {
                        int ssid = atoi (&path[12]);
                        route_mute (ssid, argv[0]->f == 1.0, msg);
@@ -937,12 +941,17 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
                }
                else if (!strncmp (path, "/select/send_gain/", 18) && strlen (path) > 18) {
                        int ssid = atoi (&path[18]);
-                       route_mute (ssid, argv[0]->f == 1.0, msg);
+                       sel_sendgain (ssid, argv[0]->f, msg);
                        ret = 0;
                }
                else if (!strncmp (path, "/select/send_fader/", 19) && strlen (path) > 19) {
                        int ssid = atoi (&path[19]);
-                       route_solo (ssid, argv[0]->f == 1.0, msg);
+                       sel_sendfader (ssid, argv[0]->f, msg);
+                       ret = 0;
+               }
+               else if (!strncmp (path, "/select/send_enable/", 20) && strlen (path) > 20) {
+                       int ssid = atoi (&path[20]);
+                       sel_sendenable (ssid, argv[0]->f, msg);
                        ret = 0;
                }
                else if (!strncmp (path, "/select/eq_gain/", 16) && strlen (path) > 16) {
@@ -1324,14 +1333,14 @@ OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode)
 void
 OSC::notify_routes_added (ARDOUR::RouteList &)
 {
-       // not sure if we need this
+       // not sure if we need this PI change seems to cover
        //recalcbanks();
 }
 
 void
 OSC::notify_vca_added (ARDOUR::VCAList &)
 {
-       // not sure if we need this
+       // not sure if we need this PI change seems to cover
        //recalcbanks();
 }
 
@@ -1594,16 +1603,12 @@ OSC::master_set_gain (float dB)
 }
 
 int
-OSC::master_set_fader (uint32_t position)
+OSC::master_set_fader (float position)
 {
        if (!session) return -1;
        boost::shared_ptr<Stripable> s = session->master_out();
        if (s) {
-               if ((position > 799.5) && (position < 800.5)) {
-                       s->gain_control()->set_value (1.0, PBD::Controllable::NoGroup);
-               } else {
-                       s->gain_control()->set_value (slider_position_to_gain_with_max (((float)position/1023), 2.0), PBD::Controllable::NoGroup);
-               }
+               s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
        }
        return 0;
 }
@@ -1679,16 +1684,12 @@ OSC::monitor_set_gain (float dB)
 }
 
 int
-OSC::monitor_set_fader (uint32_t position)
+OSC::monitor_set_fader (float position)
 {
        if (!session) return -1;
        boost::shared_ptr<Stripable> s = session->monitor_out();
        if (s) {
-               if ((position > 799.5) && (position < 800.5)) {
-                       s->gain_control()->set_value (1.0, PBD::Controllable::NoGroup);
-               } else {
-                       s->gain_control()->set_value (slider_position_to_gain_with_max (((float)position/1023), 2.0), PBD::Controllable::NoGroup);
-               }
+               s->gain_control()->set_value (slider_position_to_gain_with_max (position, 2.0), PBD::Controllable::NoGroup);
        }
        return 0;
 }
@@ -2220,11 +2221,7 @@ OSC::route_set_gain_fader (int ssid, float pos, lo_message msg)
                return -1;
        }
        int ret;
-       if ((pos > 799.5) && (pos < 800.5)) {
-               ret = route_set_gain_abs (ssid, 1.0, msg);
-       } else {
-               ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
-       }
+       ret = route_set_gain_abs (ssid, slider_position_to_gain_with_max (pos, 2.0), msg);
        if (ret != 0) {
                return route_send_fail ("fader", ssid, 0, lo_message_get_source (msg));
        }
@@ -2243,11 +2240,7 @@ OSC::sel_fader (float val, lo_message msg)
        }
        if (s) {
                float abs;
-               if ((val > 799.5) && (val < 800.5)) {
-                       abs = 1.0;
-               } else {
-                       abs = slider_position_to_gain_with_max ((val/1023), 2.0);
-               }
+               abs = slider_position_to_gain_with_max (val, 2.0);
                if (s->gain_control()) {
                        s->gain_control()->set_value (abs, PBD::Controllable::NoGroup);
                        return 0;
@@ -2376,48 +2369,59 @@ OSC::route_set_pan_stereo_width (int ssid, float pos, lo_message msg)
 }
 
 int
-OSC::route_set_send_gain_abs (int ssid, int sid, float val, lo_message msg)
+OSC::route_set_send_gain_dB (int ssid, int id, float val, lo_message msg)
 {
        if (!session) {
                return -1;
        }
        boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
-
-       if (!s) {
-               return -1;
-       }
-
-       /* revert to zero-based counting */
-
-       if (sid > 0) {
-               --sid;
-       }
-
-       if (s->send_level_controllable (sid)) {
-               s->send_level_controllable (sid)->set_value (val, PBD::Controllable::NoGroup);
-               return 0;
+       float abs;
+       if (s) {
+#ifdef MIXBUS
+               abs = val;
+#else
+               if (val < -192) {
+                       abs = 0;
+               } else {
+                       abs = dB_to_coefficient (val);
+               }
+               if (id > 0) {
+                       --id;
+               }
+#endif
+               if (s->send_level_controllable (id)) {
+                       s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+                       return 0;
+               }
        }
-
-       return -1;
-}
-
-int
-OSC::route_set_send_gain_dB (int ssid, int sid, float val, lo_message msg)
-{
-       return route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg);
+       return 0;
 }
 
 int
-OSC::route_set_send_fader (int ssid, int sid, float pos, lo_message msg)
+OSC::route_set_send_fader (int ssid, int id, float val, lo_message msg)
 {
        if (!session) {
                return -1;
        }
-       if ((pos > 799.5) && (pos < 800.5)) {
-               return route_set_send_gain_abs (ssid, sid, 1.0, msg);
-       } else {
-               return route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
+       boost::shared_ptr<Stripable> s = get_strip (ssid, lo_message_get_source (msg));
+       float abs;
+       if (s) {
+
+               if (id > 0) {
+                       --id;
+               }
+
+               if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+                       abs = s->send_level_control(id)->interface_to_internal (val);
+#else
+                       abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
+                       s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
+                       return 0;
+               }
        }
+       return 0;
 }
 
 int
@@ -2432,6 +2436,9 @@ OSC::sel_sendgain (int id, float val, lo_message msg)
        }
        float abs;
        if (s) {
+#ifdef MIXBUS
+               abs = val;
+#else
                if (val < -192) {
                        abs = 0;
                } else {
@@ -2440,7 +2447,7 @@ OSC::sel_sendgain (int id, float val, lo_message msg)
                if (id > 0) {
                        --id;
                }
-
+#endif
                if (s->send_level_controllable (id)) {
                        s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
                        return 0;
@@ -2461,21 +2468,22 @@ OSC::sel_sendfader (int id, float val, lo_message msg)
        }
        float abs;
        if (s) {
-               if ((val > 799.5) && (val < 800.5)) {
-                       abs = 1.0;
-               } else {
-                       abs = slider_position_to_gain_with_max ((val/1023), 2.0);
-               }
+
                if (id > 0) {
                        --id;
                }
 
                if (s->send_level_controllable (id)) {
+#ifdef MIXBUS
+                       abs = s->send_level_control(id)->interface_to_internal (val);
+#else
+                       abs = slider_position_to_gain_with_max (val, 2.0);
+#endif
                        s->send_level_controllable (id)->set_value (abs, PBD::Controllable::NoGroup);
                        return 0;
                }
        }
-       return sel_send_fail ("send_gain", id, 0, lo_message_get_source (msg));
+       return sel_send_fail ("send_fader", id, 0, lo_message_get_source (msg));
 }
 
 int
index 005cac2b5f847e8b5e9731e3332d581c899b9bd1..a30d84ee043ac8c897ae13782582e6288ef9ad62 100644 (file)
@@ -108,7 +108,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                std::bitset<32> strip_types;// what strip types are a part of this bank
                uint32_t nstrips;                       // how many strips are there for strip_types
                std::bitset<32> feedback;       // What is fed back? strips/meters/timecode/bar_beat/global
-               int gainmode;                           // what kind of faders do we have Gain db or position 0 to 1023?
+               int gainmode;                           // what kind of faders do we have Gain db or position 0 to 1?
                uint32_t expand;                        // Used by /select/select
                bool expand_enable;                     // use expand instead of select
                OSCSelectObserver* sel_obs;     // So we can sync select feedback with selected channel
@@ -301,11 +301,11 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK1(jump_by_bars,f,);
        PATH_CALLBACK1(jump_by_seconds,f,);
        PATH_CALLBACK1(master_set_gain,f,);
-       PATH_CALLBACK1(master_set_fader,i,);
+       PATH_CALLBACK1(master_set_fader,f,);
        PATH_CALLBACK1(master_set_trim,f,);
        PATH_CALLBACK1(master_set_mute,i,);
        PATH_CALLBACK1(monitor_set_gain,f,);
-       PATH_CALLBACK1(monitor_set_fader,i,);
+       PATH_CALLBACK1(monitor_set_fader,f,);
 
 #define PATH_CALLBACK1_MSG(name,arg1type)                      \
         static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -422,13 +422,11 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2_MSG(strip_phase,i,i);
        PATH_CALLBACK2_MSG(strip_expand,i,i);
        PATH_CALLBACK2_MSG(strip_gui_select,i,i);
-       PATH_CALLBACK2_MSG(route_set_gain_abs,i,f);
        PATH_CALLBACK2_MSG(route_set_gain_dB,i,f);
        PATH_CALLBACK2_MSG(route_set_gain_fader,i,f);
        PATH_CALLBACK2_MSG(route_set_trim_dB,i,f);
        PATH_CALLBACK2_MSG(route_set_pan_stereo_position,i,f);
        PATH_CALLBACK2_MSG(route_set_pan_stereo_width,i,f);
-       PATH_CALLBACK3(route_set_send_gain_abs,i,i,f);
        PATH_CALLBACK3(route_set_send_gain_dB,i,i,f);
        PATH_CALLBACK3(route_set_send_fader,i,i,f);
        PATH_CALLBACK3(route_set_send_enable,i,i,f);
@@ -454,7 +452,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int route_set_trim_dB (int rid, float dB, lo_message msg);
        int route_set_pan_stereo_position (int rid, float left_right_fraction, lo_message msg);
        int route_set_pan_stereo_width (int rid, float percent, lo_message msg);
-       int route_set_send_gain_abs (int rid, int sid, float val, lo_message msg);
        int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg);
        int route_set_send_fader (int rid, int sid, float val, lo_message msg);
        int route_set_send_enable (int rid, int sid, float val, lo_message msg);
@@ -473,12 +470,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int set_surface_gainmode (uint32_t gm, lo_message msg);
 
        int master_set_gain (float dB);
-       int master_set_fader (uint32_t position);
+       int master_set_fader (float position);
        int master_set_trim (float dB);
        int master_set_pan_stereo_position (float position, lo_message msg);
        int master_set_mute (uint32_t state);
        int monitor_set_gain (float dB);
-       int monitor_set_fader (uint32_t position);
+       int monitor_set_fader (float position);
        int sel_recenable (uint32_t state, lo_message msg);
        int sel_recsafe (uint32_t state, lo_message msg);
        int sel_mute (uint32_t state, lo_message msg);
index 721cb0e66b5e4c953f912dfc80c6a9fc69c39eb9..72928e310dc9f58010c8baa42a0823a9600b10e0 100644 (file)
@@ -232,13 +232,13 @@ OSCGlobalObserver::tick ()
        if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
                // the only meter here is master
                float now_meter = session->master_out()->peak_meter()->meter_level(0, MeterMCP);
-               if (now_meter < -120) now_meter = -193;
+               if (now_meter < -94) now_meter = -193;
                if (_last_meter != now_meter) {
                        if (feedback[7] || feedback[8]) {
                                lo_message msg = lo_message_new ();
                                if (gainmode && feedback[7]) {
-                                       uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05);
-                                       lo_message_add_int32 (msg, lev1023);
+                                       // change from db to 0-1
+                                       lo_message_add_float (msg, ((now_meter + 94) / 100));
                                        lo_send_message (addr, "/master/meter", msg);
                                } else if ((!gainmode) && feedback[7]) {
                                        lo_message_add_float (msg, now_meter);
@@ -287,11 +287,7 @@ OSCGlobalObserver::send_gain_message (string path, boost::shared_ptr<Controllabl
        lo_message msg = lo_message_new ();
 
        if (gainmode) {
-               if (controllable->get_value() == 1) {
-                       lo_message_add_int32 (msg, 800);
-               } else {
-                       lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023);
-               }
+               lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
        } else {
                if (controllable->get_value() < 1e-15) {
                        lo_message_add_float (msg, -200);
index dc981534dc1c1278ae5bd1761afe20fd5cd5f4d2..7c9374aeb2bc3c94a404a3d0bb59c57675d9d7b5 100644 (file)
@@ -161,7 +161,7 @@ OSCRouteObserver::tick ()
                } else {
                        now_meter = -193;
                }
-               if (now_meter < -144) now_meter = -193;
+               if (now_meter < -120) now_meter = -193;
                if (_last_meter != now_meter) {
                        if (feedback[7] || feedback[8]) {
                                string path = "/strip/meter";
@@ -172,8 +172,7 @@ OSCRouteObserver::tick ()
                                        lo_message_add_int32 (msg, ssid);
                                }
                                if (gainmode && feedback[7]) {
-                                       uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05);
-                                       lo_message_add_int32 (msg, lev1023);
+                                       lo_message_add_float (msg, ((now_meter + 94) / 100));
                                        lo_send_message (addr, path.c_str(), msg);
                                } else if ((!gainmode) && feedback[7]) {
                                        lo_message_add_float (msg, now_meter);
@@ -327,11 +326,7 @@ OSCRouteObserver::send_gain_message (string path, boost::shared_ptr<Controllable
        }
 
        if (gainmode) {
-               if (controllable->get_value() == 1) {
-                       lo_message_add_int32 (msg, 800);
-               } else {
-                       lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023);
-               }
+               lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
        } else {
                if (controllable->get_value() < 1e-15) {
                        lo_message_add_float (msg, -200);
index 2a42f0346c2796c9f1f5820ab53151c68acc0463..7f50c7110627b7be8ec0085f8461d898dd143b82 100644 (file)
@@ -302,8 +302,7 @@ OSCSelectObserver::tick ()
                                string path = "/select/meter";
                                lo_message msg = lo_message_new ();
                                if (gainmode && feedback[7]) {
-                                       uint32_t lev1023 = (uint32_t)((now_meter + 54) * 17.05);
-                                       lo_message_add_int32 (msg, lev1023);
+                                       lo_message_add_float (msg, ((now_meter + 94) / 100));
                                        lo_send_message (addr, path.c_str(), msg);
                                } else if ((!gainmode) && feedback[7]) {
                                        lo_message_add_float (msg, now_meter);
@@ -439,17 +438,21 @@ OSCSelectObserver::gain_message (string path, boost::shared_ptr<Controllable> co
        lo_message msg = lo_message_new ();
 
        if (gainmode) {
-               if (controllable->get_value() == 1) {
-                       lo_message_add_int32 (msg, 800);
-               } else {
-                       lo_message_add_int32 (msg, gain_to_slider_position (controllable->get_value()) * 1023);
-               }
+#ifdef MIXBUS
+               lo_message_add_float (msg, controllable->internal_to_interface (val));
+#else
+               lo_message_add_float (msg, gain_to_slider_position (controllable->get_value()));
+#endif
        } else {
+#ifdef MIXBUS
+               lo_message_add_float (msg, val);
+#else
                if (controllable->get_value() < 1e-15) {
                        lo_message_add_float (msg, -200);
                } else {
                        lo_message_add_float (msg, accurate_coefficient_to_dB (controllable->get_value()));
                }
+#endif
        }
 
        lo_send_message (addr, path.c_str(), msg);
@@ -465,11 +468,7 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable>
 
        if (gainmode) {
                path = "/select/send_fader";
-               if (controllable->get_value() == 1) {
-                       value = 800;
-               } else {
-                       value = gain_to_slider_position (controllable->get_value());
-               }
+               value = gain_to_slider_position (controllable->get_value());
        } else {
                path = "/select/send_gain";
                if (controllable->get_value() < 1e-15) {