summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2018-03-07 10:41:07 -0800
committerLen Ovens <len@ovenwerks.net>2018-03-10 13:07:13 -0800
commite4da386eb506e0f561e3a4be49d02f5b9d490922 (patch)
tree2caa3293fc5b4f6c0ca8b296d86fc6544ac8c53c /libs
parent30533cd43a57570e8b38e4798372f581ad5e8b42 (diff)
OSC: add set VCA for slavable strip
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/osc/osc.cc68
-rw-r--r--libs/surfaces/osc/osc.h3
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);