OSC: Allow personal monitor to change output connection
authorLen Ovens <len@ovenwerks.net>
Tue, 18 Sep 2018 22:38:16 +0000 (15:38 -0700)
committerLen Ovens <len@ovenwerks.net>
Tue, 18 Sep 2018 22:39:14 +0000 (15:39 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h

index 689f2a67bf918e4b8c58e48b6872f1de2fce2533..c80b72ca198265ce37eb27f0f5d9dc8bbab155fd 100644 (file)
@@ -6360,6 +6360,16 @@ OSC::cue_parse (const char *path, const char* types, lo_arg **argv, int argc, lo
                        }
                }
        }
+       else if (!strncmp (path, X_("/cue/connect_aux"), 16)) {
+               // Create new Aux bus
+               string dest = "";
+               if (argc == 1 && types[0] == 's') {
+                       dest = &argv[0]->s;
+                       ret = cue_connect_aux (dest, msg);
+               } else {
+                       PBD::warning << "OSC: connect_aux has wrong number or type of parameters." << endmsg;
+               }
+       }
        else if (!strncmp (path, X_("/cue/connect"), 12)) {
                // Connect to default Aux bus
                if ((!argc) || argv[0]->f || argv[0]->i) {
@@ -6501,11 +6511,38 @@ OSC::cue_new_aux (string name, string dest, lo_message msg)
                aux->presentation_info().set_hidden (true);
 
                cue_set ((uint32_t) -1, msg);
+               session->set_dirty();
                return 0;
        }
        return -1;
 }
 
+int
+OSC::cue_connect_aux (std::string dest, lo_message msg)
+{
+       OSCSurface *sur = get_surface(get_address (msg), true);
+       int ret = 1;
+       if (sur->cue) {
+               boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (get_strip (sur->aux, get_address(msg)));
+               if (rt) {
+                       if (dest.size()) {
+                               rt->output()->disconnect (this);
+                               if (atoi( dest.c_str())) {
+                                       dest = string_compose ("system:playback_%1", dest);
+                               }
+                               PortSet& ports = rt->output()->ports ();
+                               rt->output ()->connect (*(ports.begin()), dest, this);
+                               session->set_dirty();
+                               ret = 0;
+                       }
+               }
+       }
+       if (ret) {
+               PBD::warning << "OSC: cannot connect, no Aux bus chosen." << endmsg;
+       }
+       return ret;
+}
+
 int
 OSC::cue_next (lo_message msg)
 {
index 41d0531617d16dbfdbe46ed40ad21f42878bd306..821543b6856043e35f5e51b84d5c05bba06afd9a 100644 (file)
@@ -344,6 +344,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int cue_set (uint32_t aux, lo_message msg);
        int _cue_set (uint32_t aux, lo_address addr);
        int cue_new_aux (std::string name, std::string dest, lo_message msg);
+       int cue_connect_aux (std::string dest, lo_message msg);
        int cue_next (lo_message msg);
        int cue_previous (lo_message msg);
        int cue_send_fader (uint32_t id, float position, lo_message msg);