OSC: Add send enable control.
authorLen Ovens <len@ovenwerks.net>
Sat, 11 Jun 2016 20:57:27 +0000 (13:57 -0700)
committerLen Ovens <len@ovenwerks.net>
Sat, 11 Jun 2016 20:57:27 +0000 (13:57 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h

index d68e52b59b53007e3c69d96f0e9dda0da21cae96..edaf5b76b4c8f525722aae0d68e254b7ec1c65cc 100644 (file)
@@ -533,6 +533,7 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/select/pan_stereo_width", "f", sel_pan_width);
                REGISTER_CALLBACK (serv, "/select/send_gain", "if", sel_sendgain);
                REGISTER_CALLBACK (serv, "/select/send_fader", "if", sel_sendfader);
+               REGISTER_CALLBACK (serv, "/select/send_enable", "if", sel_sendenable);
 
                /* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these  */ 
                REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute);
@@ -557,6 +558,7 @@ OSC::register_callbacks()
                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);
 
                /* still not-really-standardized query interface */
                //REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
@@ -1881,8 +1883,7 @@ OSC::strip_gui_select (int ssid, int yn, lo_message msg)
        int rid = get_rid (ssid, lo_message_get_source (msg));
        boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
        if (s) {
-       //SetStripableSelection ((*s)->presentation_info().order());
-               SetStripableSelection (rid); //alt above may end up being better
+               SetStripableSelection (rid); 
        } else {
                route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg));
        }
@@ -2102,13 +2103,7 @@ OSC::route_set_send_gain_abs (int ssid, int sid, float val, lo_message msg)
 int
 OSC::route_set_send_gain_dB (int ssid, int sid, float val, lo_message msg)
 {
-       int ret;
-       ret = route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg);
-       if (ret != 0) {
-               return route_send_fail ("send/gain", ssid, -193, lo_message_get_source (msg));
-       }
-
-return 0;
+       return route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg);
 }
 
 int
@@ -2117,39 +2112,94 @@ OSC::route_set_send_fader (int ssid, int sid, float pos, lo_message msg)
        if (!session) {
                return -1;
        }
-       int ret;
        if ((pos > 799.5) && (pos < 800.5)) {
-               ret = route_set_send_gain_abs (ssid, sid, 1.0, msg);
+               return route_set_send_gain_abs (ssid, sid, 1.0, msg);
        } else {
-               ret = route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
-       }
-       if (ret != 0) {
-               return route_send_fail ("send/fader", ssid, -193, lo_message_get_source (msg));
+               return route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
        }
-
-       return ret;
 }
 
 int
 OSC::sel_sendgain (int id, float val, lo_message msg)
 {
        OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       int ret;
        if (sur->surface_sel) {
-               return route_set_send_gain_dB(sur->surface_sel, id, val, msg);
-       } else {
-               return route_send_fail ("send_gain", 0, -193, lo_message_get_source (msg));
+               ret = route_set_send_gain_dB(sur->surface_sel, id, val, msg);
        }
+       if (!ret) {
+               return ret;
+       }
+       return sel_send_fail ("send_gain", id, -193, lo_message_get_source (msg));
 }
 
 int
 OSC::sel_sendfader (int id, float val, lo_message msg)
 {
        OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       int ret;
        if (sur->surface_sel) {
-               return route_set_send_fader(sur->surface_sel, id, val, msg);
-       } else {
-               return route_send_fail ("send_gain", 0, -193, lo_message_get_source (msg));
+               ret = route_set_send_fader(sur->surface_sel, id, val, msg);
+       }
+       if (!ret) {
+               return ret;
        }
+       return sel_send_fail ("send_gain", id, 0, lo_message_get_source (msg));
+
+}
+
+int
+OSC::route_set_send_enable (int ssid, int sid, float val, lo_message msg)
+{
+       if (!session) {
+               return -1;
+       }
+       int rid = get_rid (ssid, lo_message_get_source (msg));
+
+       boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
+
+       if (s) {
+
+               /* revert to zero-based counting */
+
+               if (sid > 0) {
+                       --sid;
+               }
+
+               if (s->send_enable_controllable (sid)) {
+                       s->send_enable_controllable (sid)->set_value (val, PBD::Controllable::NoGroup);
+                       return 0;
+               }
+
+               if (s->send_level_controllable (sid)) {
+                       return 1;
+               }
+
+       }
+
+       return -1;
+}
+
+int
+OSC::sel_sendenable (int id, float val, lo_message msg)
+{
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       int ret;
+       if (sur->surface_sel) {
+               ret = route_set_send_enable(sur->surface_sel, id, val, msg);
+       }
+       switch (ret) {
+               case 0:
+                       return ret;
+               case 1:
+                       return sel_send_fail ("send_enable", id, 1, lo_message_get_source (msg));
+               default:
+                       sel_send_fail ("send_enable", id, 0, lo_message_get_source (msg));
+                       return -1;
+       }
+       return -1;
+
+
 }
 
 int
@@ -2348,6 +2398,29 @@ OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr)
        return 0;
 }
 
+int
+OSC::sel_send_fail (string path, uint32_t id, float val, lo_address addr)
+{
+       OSCSurface *sur = get_surface(addr);
+
+       ostringstream os;
+       lo_message reply;
+       reply = lo_message_new ();
+       if (sur->feedback[2]) {
+               os << "/select/" << path << "/" << id;
+       } else {
+               os << "/select/" << path;
+               lo_message_add_int32 (reply, id);
+       }
+       string str_pth = os.str();
+       lo_message_add_float (reply, (float) val);
+
+       lo_send_message (addr, str_pth.c_str(), reply);
+       lo_message_free (reply);
+
+       return 0;
+}
+
 XMLNode&
 OSC::get_state ()
 {
index 0ff427ecf06659cf367d297364c539e80f3a1f63..7ef4b5aaf5dbc66bc063a49e99d0b4f48f9d2aa4 100644 (file)
@@ -394,6 +394,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 
        PATH_CALLBACK2_MSG(sel_sendgain,i,f);
        PATH_CALLBACK2_MSG(sel_sendfader,i,f);
+       PATH_CALLBACK2_MSG(sel_sendenable,i,f);
 
        PATH_CALLBACK4(set_surface,i,i,i,i);
        PATH_CALLBACK2(locate,i,i);
@@ -418,6 +419,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        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);
        PATH_CALLBACK4(route_plugin_parameter,i,i,i,f);
        PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
 
@@ -443,6 +445,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        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);
        int route_plugin_parameter (int rid, int piid,int par, float val, lo_message msg);
        int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg);
 
@@ -479,6 +482,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int sel_pan_width (float val, lo_message msg);
        int sel_sendgain (int id, float dB, lo_message msg);
        int sel_sendfader (int id, float pos, lo_message msg);
+       int sel_sendenable (int id, float pos, lo_message msg);
 
        void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
        void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
@@ -493,6 +497,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PBD::ScopedConnectionList session_connections;
 
        int route_send_fail (std::string path, uint32_t ssid, float val, lo_address addr);
+       int sel_send_fail (std::string path, uint32_t id, float val, lo_address addr);
 
        typedef std::list<OSCRouteObserver*> RouteObservers;