diff options
author | Len Ovens <len@ovenwerks.net> | 2018-02-16 13:08:09 -0800 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2018-02-16 13:10:20 -0800 |
commit | dffecfa4c671fac830a3c5fb0e013c96bdc4f38b (patch) | |
tree | f9657b16911fd5668c8c3907f5ab1f9da5bf4127 /libs | |
parent | 3504ecff5f7475fc799fa1f52a8517231118a60d (diff) |
OSC: added group join, switch, remove function
Diffstat (limited to 'libs')
-rw-r--r-- | libs/surfaces/osc/osc.cc | 99 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 17 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_route_observer.cc | 6 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_select_observer.cc | 6 |
4 files changed, 113 insertions, 15 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 diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 36824c78e4..ec75c5d920 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -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); diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc index 42504728d5..f676e3964e 100644 --- a/libs/surfaces/osc/osc_route_observer.cc +++ b/libs/surfaces/osc/osc_route_observer.cc @@ -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); } } diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index a50588a20f..724bf818a8 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -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); } } |