OSC: added solo isolate and solo safe/lock.
authorLen Ovens <len@ovenwerks.net>
Sat, 11 Jun 2016 19:09:15 +0000 (12:09 -0700)
committerLen Ovens <len@ovenwerks.net>
Sat, 11 Jun 2016 19:09:15 +0000 (12:09 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_select_observer.cc

index 8507869235ae1082c5319c79bba1786ead43d075..d68e52b59b53007e3c69d96f0e9dda0da21cae96 100644 (file)
@@ -47,6 +47,8 @@
 #include "ardour/presentation_info.h"
 #include "ardour/send.h"
 #include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
 
 #include "osc_select_observer.h"
 #include "osc.h"
@@ -519,6 +521,8 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, "/select/record_safe", "i", sel_recsafe);
                REGISTER_CALLBACK (serv, "/select/mute", "i", sel_mute);
                REGISTER_CALLBACK (serv, "/select/solo", "i", sel_solo);
+               REGISTER_CALLBACK (serv, "/select/solo_iso", "i", sel_solo_iso);
+               REGISTER_CALLBACK (serv, "/select/solo_safe", "i", sel_solo_safe);
                REGISTER_CALLBACK (serv, "/select/monitor_input", "i", sel_monitor_input);
                REGISTER_CALLBACK (serv, "/select/monitor_disk", "i", sel_monitor_disk);
                REGISTER_CALLBACK (serv, "/select/polarity", "i", sel_phase);
@@ -533,6 +537,8 @@ OSC::register_callbacks()
                /* 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);
                REGISTER_CALLBACK (serv, "/strip/solo", "ii", route_solo);
+               REGISTER_CALLBACK (serv, "/strip/solo_iso", "ii", route_solo_iso);
+               REGISTER_CALLBACK (serv, "/strip/solo_safe", "ii", route_solo_safe);
                REGISTER_CALLBACK (serv, "/strip/recenable", "ii", route_recenable);
                REGISTER_CALLBACK (serv, "/strip/record_safe", "ii", route_recsafe);
                REGISTER_CALLBACK (serv, "/strip/monitor_input", "ii", route_monitor_input);
@@ -1574,6 +1580,42 @@ OSC::route_solo (int ssid, int yn, lo_message msg)
        return route_send_fail ("solo", ssid, 0, lo_message_get_source (msg));
 }
 
+int
+OSC::route_solo_iso (int ssid, int yn, 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) {
+               if (s->solo_isolate_control()) {
+                       s->solo_isolate_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+                       return 0;
+               }
+       }
+
+       return route_send_fail ("solo_iso", ssid, 0, lo_message_get_source (msg));
+}
+
+int
+OSC::route_solo_safe (int ssid, int yn, 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) {
+               if (s->solo_safe_control()) {
+                       s->solo_safe_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
+                       return 0;
+               }
+       }
+
+       return route_send_fail ("solo_safe", ssid, 0, lo_message_get_source (msg));
+}
+
 int
 OSC::sel_solo (uint32_t yn, lo_message msg)
 {
@@ -1585,6 +1627,28 @@ OSC::sel_solo (uint32_t yn, lo_message msg)
        }
 }
 
+int
+OSC::sel_solo_iso (uint32_t yn, lo_message msg)
+{
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       if (sur->surface_sel) {
+               return route_solo_iso(sur->surface_sel, yn, msg);
+       } else { 
+               return route_send_fail ("solo_iso", 0, 0, lo_message_get_source (msg));
+       }
+}
+
+int
+OSC::sel_solo_safe (uint32_t yn, lo_message msg)
+{
+       OSCSurface *sur = get_surface(lo_message_get_source (msg));
+       if (sur->surface_sel) {
+               return route_solo_safe(sur->surface_sel, yn, msg);
+       } else { 
+               return route_send_fail ("solo_safe", 0, 0, lo_message_get_source (msg));
+       }
+}
+
 int
 OSC::sel_recenable (uint32_t yn, lo_message msg)
 {
index 4d277fb8220b8f679d29832f666053dc17e5739c..0ff427ecf06659cf367d297364c539e80f3a1f63 100644 (file)
@@ -333,6 +333,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK1_MSG(sel_recsafe,i);
        PATH_CALLBACK1_MSG(sel_mute,i);
        PATH_CALLBACK1_MSG(sel_solo,i);
+       PATH_CALLBACK1_MSG(sel_solo_iso,i);
+       PATH_CALLBACK1_MSG(sel_solo_safe,i);
        PATH_CALLBACK1_MSG(sel_monitor_input,i);
        PATH_CALLBACK1_MSG(sel_monitor_disk,i);
        PATH_CALLBACK1_MSG(sel_phase,i);
@@ -398,6 +400,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2(loop_location,i,i);
        PATH_CALLBACK2_MSG(route_mute,i,i);
        PATH_CALLBACK2_MSG(route_solo,i,i);
+       PATH_CALLBACK2_MSG(route_solo_iso,i,i);
+       PATH_CALLBACK2_MSG(route_solo_safe,i,i);
        PATH_CALLBACK2_MSG(route_recenable,i,i);
        PATH_CALLBACK2_MSG(route_recsafe,i,i);
        PATH_CALLBACK2_MSG(route_monitor_input,i,i);
@@ -419,6 +423,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
 
        int route_mute (int rid, int yn, lo_message msg);
        int route_solo (int rid, int yn, lo_message msg);
+       int route_solo_iso (int rid, int yn, lo_message msg);
+       int route_solo_safe (int rid, int yn, lo_message msg);
        int route_recenable (int rid, int yn, lo_message msg);
        int route_recsafe (int ssid, int yn, lo_message msg);
        int route_monitor_input (int rid, int yn, lo_message msg);
@@ -461,6 +467,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int sel_recsafe (uint32_t state, lo_message msg);
        int sel_mute (uint32_t state, lo_message msg);
        int sel_solo (uint32_t state, lo_message msg);
+       int sel_solo_iso (uint32_t state, lo_message msg);
+       int sel_solo_safe (uint32_t state, lo_message msg);
        int sel_monitor_input (uint32_t state, lo_message msg);
        int sel_monitor_disk (uint32_t state, lo_message msg);
        int sel_phase (uint32_t state, lo_message msg);
index 3e675fb97b67541423ffb1394c3f390aabcec2d1..a51f9e702aba38570cc7b307bf613f1021a5927c 100644 (file)
@@ -25,6 +25,8 @@
 #include "ardour/dB.h"
 #include "ardour/meter.h"
 #include "ardour/phase_control.h"
+#include "ardour/solo_isolate_control.h"
+#include "ardour/solo_safe_control.h"
 
 #include "osc.h"
 #include "osc_select_observer.h"
@@ -55,6 +57,12 @@ OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address
                _strip->solo_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo"), _strip->solo_control()), OSC::instance());
                change_message ("/select/solo", _strip->solo_control());
 
+               _strip->solo_isolate_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_iso"), _strip->solo_isolate_control()), OSC::instance());
+               change_message ("/select/solo_iso", _strip->solo_isolate_control());
+
+               _strip->solo_safe_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::change_message, this, X_("/select/solo_safe"), _strip->solo_safe_control()), OSC::instance());
+               change_message ("/select/solo_safe", _strip->solo_safe_control());
+
                boost::shared_ptr<Track> track = boost::dynamic_pointer_cast<Track> (_strip);
                if (track) {
                track->monitoring_control()->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::monitor_status, this, track->monitoring_control()), OSC::instance());