OSC: Add /select/vca/toggle
authorLen Ovens <len@ovenwerks.net>
Wed, 20 Jun 2018 19:30:08 +0000 (12:30 -0700)
committerLen Ovens <len@ovenwerks.net>
Wed, 20 Jun 2018 19:39:34 +0000 (12:39 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc_select_observer.cc

index 8e7351e3f87b9b87247afca9780ab900cee3f1e4..27a342dca30699ba3c1b1a4956a9a9ca1ea7bac8 100644 (file)
@@ -2743,6 +2743,7 @@ OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc
        s = sur->select;
        int ret = 1; /* unhandled */
        if (s) {
+               boost::shared_ptr<Slavable> slv = boost::dynamic_pointer_cast<Slavable> (s);
                string svalue = "";
                uint32_t ivalue = 1024;
                if (strcmp (path, X_("/select/vca")) == 0) {
@@ -2758,7 +2759,6 @@ OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc
                                        }
                                        boost::shared_ptr<VCA> vca = get_vca_by_name (svalue);
                                        if (vca) {
-                                               boost::shared_ptr<Slavable> slv = boost::dynamic_pointer_cast<Slavable> (s);
                                                if (ivalue) {
                                                        slv->assign (vca);
                                                } else {
@@ -2771,6 +2771,26 @@ OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc
                                PBD::warning << "OSC: setting a vca needs both the vca name and it's state" << endmsg;
                        }
                }
+               else if (!strncmp (path, X_("/select/vca/toggle"), 18)) {
+                       if (argc == 1) {
+                               if (types[0] == 's') {
+                                       svalue = &argv[0]->s;
+                                       string v_name = svalue.substr (0, svalue.rfind (" ["));
+                                       boost::shared_ptr<VCA> vca = get_vca_by_name (v_name);
+                                       if (s->slaved_to (vca)) {
+                                               slv->unassign (vca);
+                                       } else {
+                                               slv->assign (vca);
+                                       }
+                                       ret = 0;
+                               } else {
+                                       PBD::warning << "OSC: toggling needs the vca name as a string" << endmsg;
+                               }
+                       } else {
+                               PBD::warning << "OSC: toggling a vca needs the vca name" << endmsg;
+                       }
+
+               }
                else if (!strncmp (path, X_("/select/vca/only"), 16)) {
                        if (argc == 1) {
                                if (types[0] == 'f') {
index 4ab8e3c0afcd10777bf6362f90882d78da300dce..62c11be30d85d073e11e2500baab2ade1686251b 100644 (file)
@@ -1100,12 +1100,13 @@ OSCSelectObserver::slaved_changed (boost::shared_ptr<VCA> vca, bool state)
                // we only want VCAs
                boost::shared_ptr<VCA> v = boost::dynamic_pointer_cast<VCA> (s);
                if (v) {
-                       lo_message_add_string (reply, v->name().c_str());
+                       string name;
                        if (_strip->slaved_to (v)) {
-                               lo_message_add_int32 (reply, 1);
+                               name = string_compose ("%1 [X]", v->name());
                        } else {
-                               lo_message_add_int32 (reply, 0);
+                               name = string_compose ("%1 [_]", v->name());
                        }
+                       lo_message_add_string (reply, name.c_str());
                }
        }
        lo_send_message (addr, X_("/select/vcas"), reply);