OSC: added group join, switch, remove function
authorLen Ovens <len@ovenwerks.net>
Fri, 16 Feb 2018 21:08:09 +0000 (13:08 -0800)
committerLen Ovens <len@ovenwerks.net>
Fri, 16 Feb 2018 21:10:20 +0000 (13:10 -0800)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_route_observer.cc
libs/surfaces/osc/osc_select_observer.cc

index 6612b0da50152ac51a7a99d28f5c853f4a90991c..28923b149ffe0fede02bd2f15eef8daca363abb3 100644 (file)
@@ -568,6 +568,7 @@ OSC::register_callbacks()
                // Controls for the Selected strip
                REGISTER_CALLBACK (serv, X_("/select/recenable"), "i", sel_recenable);
                REGISTER_CALLBACK (serv, X_("/select/record_safe"), "i", sel_recsafe);
+               REGISTER_CALLBACK (serv, X_("/select/group"), "s", sel_group);
                REGISTER_CALLBACK (serv, X_("/select/mute"), "i", sel_mute);
                REGISTER_CALLBACK (serv, X_("/select/solo"), "i", sel_solo);
                REGISTER_CALLBACK (serv, X_("/select/solo_iso"), "i", sel_solo_iso);
@@ -638,6 +639,7 @@ OSC::register_callbacks()
                REGISTER_CALLBACK (serv, X_("/strip/send/fader"), "iif", route_set_send_fader);
                REGISTER_CALLBACK (serv, X_("/strip/send/enable"), "iif", route_set_send_enable);
                REGISTER_CALLBACK (serv, X_("/strip/name"), "is", route_rename);
+               REGISTER_CALLBACK (serv, X_("/strip/group"), "is", strip_group);
                REGISTER_CALLBACK (serv, X_("/strip/sends"), "i", route_get_sends);
                REGISTER_CALLBACK (serv, X_("/strip/receives"), "i", route_get_receives);
                REGISTER_CALLBACK (serv, X_("/strip/plugin/list"), "i", route_plugin_list);
@@ -3688,18 +3690,97 @@ OSC::route_recenable (int ssid, int yn, lo_message msg)
 }
 
 int
-OSC::route_rename(int ssid, char *newname, lo_message msg) {
-    if (!session) {
-        return -1;
-    }
+OSC::route_rename (int ssid, char *newname, lo_message msg) {
+       if (!session) {
+               return -1;
+       }
+
+       boost::shared_ptr<Stripable> s = get_strip(ssid, get_address(msg));
+
+       if (s) {
+               s->set_name(std::string(newname));
+       }
 
-    boost::shared_ptr<Stripable> s = get_strip(ssid, get_address(msg));
+       return 0;
+}
+
+int
+OSC::strip_group (int ssid, char *group, lo_message msg) {
+       if (!session) {
+               return -1;
+       }
+       boost::shared_ptr<Stripable> s = get_strip(ssid, get_address(msg));
+       return strip_select_group (s, group);
+}
+
+int
+OSC::sel_group (char *group, lo_message msg) {
+       if (!session) {
+               return -1;
+       }
+       OSCSurface *sur = get_surface(get_address (msg));
+       boost::shared_ptr<Stripable> s;
+       if (sur->expand_enable) {
+               s = get_strip (sur->expand, get_address (msg));
+       } else {
+               s = _select;
+       }
+       return strip_select_group (s, group);
+}
 
-    if (s) {
-        s->set_name(std::string(newname));
-    }
+int
+OSC::strip_select_group (boost::shared_ptr<Stripable> s, char *group)
+{
+       string grp = group;
+       if (grp == "" || grp == " ") {
+                       grp = "none";
+               }
 
-    return 0;
+       if (s) {
+               boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s);
+               if (!rt) {
+                       return -1;
+               }
+               RouteGroup *rg = rt->route_group();
+               RouteGroup* new_rg = session->route_group_by_name (grp);
+               if (rg) {
+                       string old_group = rg->name();
+                       if (grp == "none") {
+                               if (rg->size () == 1) {
+                                       session->remove_route_group (*rg);
+                               } else {
+                                       rg->remove (rt);
+                               }
+                       } else if (grp != old_group) {
+                               if (new_rg) {
+                                       // group exists switch to it
+                                       if (rg->size () == 1) {
+                                               session->remove_route_group (rg);
+                                       } else {
+                                               rg->remove (rt);
+                                       }
+                                       new_rg->add (rt);
+                               } else {
+                                       rg->set_name (grp);
+                               }
+                       } else {
+                               // nothing to change
+                               return 0;
+                       }
+               } else {
+                       if (grp == "none") {
+                               return 0;
+                       } else if (new_rg) {
+                               new_rg->add (rt);
+                       } else {
+                               // create new group with this strip in it
+                               RouteGroup* new_rg = new RouteGroup (*session, grp);
+                               session->add_route_group (new_rg);
+                               new_rg->add (rt);
+                       }
+               }
+       }
+       return 0;
 }
 
 int
index 36824c78e4e305432612fa0790dcb136be5e7525..ec75c5d920fa12f14c4599deb5235b188e030fb2 100644 (file)
@@ -473,6 +473,18 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                return 0; \
        }
 
+#define PATH_CALLBACK1_MSG_s(name,arg1type) \
+       static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
+               return static_cast<OSC*>(user_data)->cb_ ## name (path, types, argv, argc, data); \
+       } \
+       int cb_ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data) { \
+               OSC_DEBUG; \
+               if (argc > 0) { \
+                       name (&argv[0]->arg1type, data); \
+               } \
+               return 0; \
+       }
+
        // pan position needs message info to send feedback
        PATH_CALLBACK1_MSG(master_set_pan_stereo_position,f);
 
@@ -481,6 +493,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK1_MSG(jog_mode,f);
        PATH_CALLBACK1_MSG(bank_delta,f);
        PATH_CALLBACK1_MSG(use_group,f);
+       PATH_CALLBACK1_MSG_s(sel_group,s);
        PATH_CALLBACK1_MSG(sel_recenable,i);
        PATH_CALLBACK1_MSG(sel_recsafe,i);
        PATH_CALLBACK1_MSG(sel_mute,i);
@@ -592,6 +605,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2(locate,i,i);
        PATH_CALLBACK2(loop_location,i,i);
        PATH_CALLBACK2_MSG_s(route_rename,i,s);
+       PATH_CALLBACK2_MSG_s(strip_group,i,s);
        PATH_CALLBACK2_MSG(route_mute,i,i);
        PATH_CALLBACK2_MSG(route_solo,i,i);
        PATH_CALLBACK2_MSG(route_solo_iso,i,i);
@@ -621,6 +635,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        PATH_CALLBACK2_MSG(route_plugin_reset,i,i);
 
        int route_rename (int rid, char *s, lo_message msg);
+       int strip_group (int ssid, char *g, lo_message msg);
+       int strip_select_group (boost::shared_ptr<ARDOUR::Stripable> s, char *g);
        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);
@@ -699,6 +715,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
        int monitor_set_mute (uint32_t state);
        int monitor_set_dim (uint32_t state);
        int monitor_set_mono (uint32_t state);
+       int sel_group (char *g, lo_message msg);
        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 42504728d519c9b7ae34cbcdf35df58bbb1d14a2..f676e3964e3324acafd76d109d1c8bdaae620153 100644 (file)
@@ -250,7 +250,7 @@ OSCRouteObserver::clear_strip ()
        _osc.float_message_with_id (X_("/strip/expand"), ssid, 0, in_line, addr);
        if (feedback[0]) { // buttons are separate feedback
                _osc.text_message_with_id (X_("/strip/name"), ssid, " ", in_line, addr);
-               _osc.text_message_with_id (X_("/strip/group/name"), ssid, " ", in_line, addr);
+               _osc.text_message_with_id (X_("/strip/group"), ssid, "none", in_line, addr);
                _osc.float_message_with_id (X_("/strip/mute"), ssid, 0, in_line, addr);
                _osc.float_message_with_id (X_("/strip/solo"), ssid, 0, in_line, addr);
                _osc.float_message_with_id (X_("/strip/recenable"), ssid, 0, in_line, addr);
@@ -361,9 +361,9 @@ OSCRouteObserver::group_name ()
 
        RouteGroup *rg = rt->route_group();
        if (rg) {
-               _osc.text_message_with_id (X_("/strip/group/name"), ssid, rg->name(), in_line, addr);
+               _osc.text_message_with_id (X_("/strip/group"), ssid, rg->name(), in_line, addr);
        } else {
-               _osc.text_message_with_id (X_("/strip/group/name"), ssid, " ", in_line, addr);
+               _osc.text_message_with_id (X_("/strip/group"), ssid, " ", in_line, addr);
        }
 }
 
index a50588a20f6e97165688292806b00200e45a7c15..724bf818a87248b819ad970f85e31509d67739b6 100644 (file)
@@ -276,7 +276,7 @@ OSCSelectObserver::clear_observer ()
        // all strip buttons should be off and faders 0 and etc.
        _osc.float_message (X_("/select/expand"), 0, addr);
        _osc.text_message (X_("/select/name"), " ", addr);
-       _osc.text_message (X_("/select/group/name"), " ", addr);
+       _osc.text_message (X_("/select/group"), " ", addr);
        _osc.text_message (X_("/select/comment"), " ", addr);
        _osc.float_message (X_("/select/mute"), 0, addr);
        _osc.float_message (X_("/select/solo"), 0, addr);
@@ -655,9 +655,9 @@ OSCSelectObserver::group_name ()
 
        RouteGroup *rg = rt->route_group();
        if (rg) {
-               _osc.text_message (X_("/select/group/name"), rg->name(), addr);
+               _osc.text_message (X_("/select/group"), rg->name(), addr);
        } else {
-               _osc.text_message (X_("/select/group/name"), " ", addr);
+               _osc.text_message (X_("/select/group"), " ", addr);
        }
 }