summaryrefslogtreecommitdiff
path: root/libs/surfaces
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2016-11-25 10:10:49 -0800
committerLen Ovens <len@ovenwerks.net>2016-11-25 10:10:49 -0800
commit5bf8a5537b7771a7f523ab242f186e513c3a4c76 (patch)
treeea376a545f0eb7c8a250728f83c053e659aac5e1 /libs/surfaces
parent43b468aa1405365af2de68cb08db1fb48baaadb6 (diff)
OSC: Add patch from 7137 and make it work for manual port selection.
Diffstat (limited to 'libs/surfaces')
-rw-r--r--libs/surfaces/osc/osc.cc167
-rw-r--r--libs/surfaces/osc/osc.h6
2 files changed, 173 insertions, 0 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index 3d098da3c4..c93827f7e4 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -602,6 +602,9 @@ OSC::register_callbacks()
REGISTER_CALLBACK(serv, "/strip/name", "is", route_rename);
REGISTER_CALLBACK(serv, "/strip/sends", "i", route_get_sends);
REGISTER_CALLBACK(serv, "/strip/receives", "i", route_get_receives);
+ REGISTER_CALLBACK(serv, "/strip/plugin/list", "i", route_plugin_list);
+ REGISTER_CALLBACK(serv, "/strip/plugin/descriptor", "ii", route_plugin_descriptor);
+ REGISTER_CALLBACK(serv, "/strip/plugin/reset", "ii", route_plugin_reset);
/* still not-really-standardized query interface */
//REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value);
@@ -2790,6 +2793,170 @@ OSC::sel_sendenable (int id, float val, lo_message msg)
}
int
+OSC::route_plugin_list(int ssid, lo_message msg) {
+ if (!session) {
+ return -1;
+ }
+
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (get_strip(ssid, get_address(msg)));
+
+ if (!r) {
+ PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg;
+ return -1;
+ }
+ int piid = 0;
+
+ lo_message reply = lo_message_new();
+ lo_message_add_int32(reply, ssid);
+
+
+ for(;;) {
+ boost::shared_ptr<Processor> redi = r->nth_plugin(piid);
+ if( !redi ) {
+ break;
+ }
+
+ boost::shared_ptr<PluginInsert> pi;
+
+ if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
+ PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg;
+ continue;
+ }
+ lo_message_add_int32(reply, piid);
+
+ boost::shared_ptr<ARDOUR::Plugin> pip = pi->plugin();
+ lo_message_add_string(reply, pip->name());
+
+ piid++;
+ }
+
+ lo_send_message(get_address (msg), "/strip/plugin/list", reply);
+ lo_message_free(reply);
+ return 0;
+}
+
+int
+OSC::route_plugin_descriptor(int ssid, int piid, lo_message msg) {
+ if (!session) {
+ return -1;
+ }
+
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (get_strip(ssid, get_address(msg)));
+
+ if (!r) {
+ PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg;
+ return -1;
+ }
+
+ boost::shared_ptr<Processor> redi = r->nth_plugin(piid);
+
+ if (!redi) {
+ PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg;
+ return -1;
+ }
+
+ boost::shared_ptr<PluginInsert> pi;
+
+ if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
+ PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg;
+ return -1;
+ }
+
+ boost::shared_ptr<ARDOUR::Plugin> pip = pi->plugin();
+ bool ok = false;
+
+ lo_message reply = lo_message_new();
+ lo_message_add_int32(reply, ssid);
+ lo_message_add_int32(reply, piid);
+ lo_message_add_string(reply, pip->name());
+ for( uint32_t ppi = 0; ppi < pip->parameter_count(); ppi++) {
+
+ uint32_t controlid = pip->nth_parameter(ppi, ok);
+ if (!ok) {
+ continue;
+ }
+ if( pip->parameter_is_input(controlid) || pip->parameter_is_control(controlid) ) {
+ boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid));
+
+ lo_message_add_int32(reply, ppi);
+ ParameterDescriptor pd;
+ pi->plugin()->get_parameter_descriptor(controlid, pd);
+ lo_message_add_string(reply, pd.label.c_str());
+
+ // I've combined those binary descriptor parts in a bit-field to reduce lilo message elements
+ int flags = 0;
+ flags |= pd.enumeration ? 1 : 0;
+ flags |= pd.integer_step ? 2 : 0;
+ flags |= pd.logarithmic ? 4 : 0;
+ flags |= pd.max_unbound ? 8 : 0;
+ flags |= pd.min_unbound ? 16 : 0;
+ flags |= pd.sr_dependent ? 32 : 0;
+ flags |= pd.toggled ? 64 : 0;
+ flags |= c != NULL ? 128 : 0; // bit 7 indicates in input control
+ lo_message_add_int32(reply, flags);
+
+ lo_message_add_int32(reply, pd.datatype);
+ lo_message_add_float(reply, pd.lower);
+ lo_message_add_float(reply, pd.upper);
+ lo_message_add_string(reply, pd.print_fmt.c_str());
+ if( pd.scale_points ) {
+ lo_message_add_int32(reply, pd.scale_points->size());
+ for( ARDOUR::ScalePoints::const_iterator i = pd.scale_points->begin(); i != pd.scale_points->end(); ++i) {
+ lo_message_add_int32(reply, i->second);
+ lo_message_add_string(reply, ((std::string)i->first).c_str());
+ }
+ }
+ else {
+ lo_message_add_int32(reply, 0);
+ }
+ if( c ) {
+ lo_message_add_double(reply, c->get_value());
+ }
+ else {
+ lo_message_add_double (reply, 0);
+ }
+ }
+ }
+
+ lo_send_message (get_address (msg), "/strip/plugin/descriptor", reply);
+ lo_message_free (reply);
+
+ return 0;
+}
+
+int
+OSC::route_plugin_reset(int ssid, int piid, lo_message msg) {
+ if (!session) {
+ return -1;
+ }
+
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (get_strip(ssid, get_address(msg)));
+
+ if (!r) {
+ PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg;
+ return -1;
+ }
+
+ boost::shared_ptr<Processor> redi = r->nth_plugin(piid);
+
+ if (!redi) {
+ PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg;
+ return -1;
+ }
+
+ boost::shared_ptr<PluginInsert> pi;
+
+ if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(redi))) {
+ PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg;
+ return -1;
+ }
+
+ pi->reset_parameters_to_default();
+
+ return 0;
+}
+
+int
OSC::route_plugin_parameter (int ssid, int piid, int par, float val, lo_message msg)
{
if (!session)
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index d581a43d7e..8249f54411 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -476,6 +476,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK3(route_plugin_parameter_print,i,i,i);
PATH_CALLBACK2_MSG(route_plugin_activate,i,i);
PATH_CALLBACK2_MSG(route_plugin_deactivate,i,i);
+ PATH_CALLBACK1_MSG(route_plugin_list,i);
+ PATH_CALLBACK2_MSG(route_plugin_descriptor,i,i);
+ PATH_CALLBACK2_MSG(route_plugin_reset,i,i);
int route_rename (int rid, char *s, lo_message msg);
int route_mute (int rid, int yn, lo_message msg);
@@ -504,6 +507,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg);
int route_plugin_activate (int rid, int piid, lo_message msg);
int route_plugin_deactivate (int rid, int piid, lo_message msg);
+ int route_plugin_list(int ssid, lo_message msg);
+ int route_plugin_descriptor(int ssid, int piid, lo_message msg);
+ int route_plugin_reset(int ssid, int piid, lo_message msg);
//banking functions
int set_bank (uint32_t bank_start, lo_message msg);