diff options
author | Len Ovens <len@ovenwerks.net> | 2018-03-07 10:41:07 -0800 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2018-03-10 13:07:13 -0800 |
commit | e4da386eb506e0f561e3a4be49d02f5b9d490922 (patch) | |
tree | 2caa3293fc5b4f6c0ca8b296d86fc6544ac8c53c /libs/surfaces/osc | |
parent | 30533cd43a57570e8b38e4798372f581ad5e8b42 (diff) |
OSC: add set VCA for slavable strip
Diffstat (limited to 'libs/surfaces/osc')
-rw-r--r-- | libs/surfaces/osc/osc.cc | 68 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 3 |
2 files changed, 70 insertions, 1 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 1a9d737159..0ba42253d5 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -983,6 +983,9 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_ else if (strstr (path, X_("/select/group"))) { ret = parse_sel_group (path, types, argv, argc, msg); } + else if (strstr (path, X_("/select/vca"))) { + ret = parse_sel_vca (path, types, argv, argc, msg); + } else if (strstr (path, X_("/select")) && (argc != 1)) { // All of the select commands below require 1 parameter PBD::warning << "OSC: Wrong number of parameters." << endmsg; @@ -2629,6 +2632,71 @@ OSC::parse_sel_group (const char *path, const char* types, lo_arg **argv, int ar return ret; } +// this gets called for anything that starts with /select/vca +int +OSC::parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg) +{ + 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; + } + int ret = 1; /* unhandled */ + if (s) { + string svalue = ""; + uint32_t ivalue = 1024; + if (!strncmp (path, X_("/select/vca"), 11)) { + if (argc == 2) { + if (types[0] == 's') { + svalue = &argv[0]->s; + if (types[1] == 'i') { + ivalue = argv[1]->i; + } else if (types[1] == 'f') { + ivalue = (uint32_t) argv[1]->f; + } else { + return 1; + } + 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 { + slv->unassign (vca); + } + ret = 0; + } + } + } else { + PBD::warning << "OSC: setting a vca needs both the vca name and it's state" << endmsg; + } + } + //boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s); + } + return ret; +} + +boost::shared_ptr<VCA> +OSC::get_vca_by_name (std::string vname) +{ + StripableList stripables; + session->get_stripables (stripables); + for (StripableList::iterator it = stripables.begin(); it != stripables.end(); ++it) { + boost::shared_ptr<Stripable> s = *it; + + // we only want VCAs + boost::shared_ptr<VCA> v = boost::dynamic_pointer_cast<VCA> (s); + if (v) { + if (vname == v->name()) { + return v; + } + } + } + return boost::shared_ptr<VCA>(); +} + int OSC::name_session (char *n, lo_message msg) { diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 4c53bcbda0..87d1c4f20f 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -496,7 +496,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> PATH_CALLBACK1_MSG(bank_delta,f); PATH_CALLBACK1_MSG(use_group,f); PATH_CALLBACK1_MSG_s(name_session,s); - PATH_CALLBACK1_MSG_s(sel_group,s); PATH_CALLBACK1_MSG_s(sel_rename,s); PATH_CALLBACK1_MSG_s(sel_comment,s); PATH_CALLBACK1_MSG(sel_recenable,i); @@ -765,6 +764,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int sel_eq_q (int id, float val, lo_message msg); int sel_eq_shape (int id, float val, lo_message msg); int parse_sel_group (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); + int parse_sel_vca (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg); + boost::shared_ptr<ARDOUR::VCA> get_vca_by_name (std::string vname); void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address); |