summaryrefslogtreecommitdiff
path: root/libs/surfaces/osc/osc.cc
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2018-02-16 13:08:09 -0800
committerLen Ovens <len@ovenwerks.net>2018-02-16 13:10:20 -0800
commitdffecfa4c671fac830a3c5fb0e013c96bdc4f38b (patch)
treef9657b16911fd5668c8c3907f5ab1f9da5bf4127 /libs/surfaces/osc/osc.cc
parent3504ecff5f7475fc799fa1f52a8517231118a60d (diff)
OSC: added group join, switch, remove function
Diffstat (limited to 'libs/surfaces/osc/osc.cc')
-rw-r--r--libs/surfaces/osc/osc.cc99
1 files changed, 90 insertions, 9 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index 6612b0da50..28923b149f 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -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