From 5bf8a5537b7771a7f523ab242f186e513c3a4c76 Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Fri, 25 Nov 2016 10:10:49 -0800 Subject: [PATCH] OSC: Add patch from 7137 and make it work for manual port selection. --- libs/surfaces/osc/osc.cc | 167 +++++++++++++++++++++++++++++++++++++++ libs/surfaces/osc/osc.h | 6 ++ 2 files changed, 173 insertions(+) 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); @@ -2789,6 +2792,170 @@ OSC::sel_sendenable (int id, float val, lo_message msg) return sel_send_fail ("send_enable", id + 1, 0, get_address (msg)); } +int +OSC::route_plugin_list(int ssid, lo_message msg) { + if (!session) { + return -1; + } + + boost::shared_ptr r = boost::dynamic_pointer_cast (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 redi = r->nth_plugin(piid); + if( !redi ) { + break; + } + + boost::shared_ptr pi; + + if (!(pi = boost::dynamic_pointer_cast(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 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 r = boost::dynamic_pointer_cast (get_strip(ssid, get_address(msg))); + + if (!r) { + PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg; + return -1; + } + + boost::shared_ptr redi = r->nth_plugin(piid); + + if (!redi) { + PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg; + return -1; + } + + boost::shared_ptr pi; + + if (!(pi = boost::dynamic_pointer_cast(redi))) { + PBD::error << "OSC: given processor # " << piid << " on RID '" << ssid << "' is not a Plugin." << endmsg; + return -1; + } + + boost::shared_ptr 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 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 r = boost::dynamic_pointer_cast (get_strip(ssid, get_address(msg))); + + if (!r) { + PBD::error << "OSC: Invalid Remote Control ID '" << ssid << "'" << endmsg; + return -1; + } + + boost::shared_ptr redi = r->nth_plugin(piid); + + if (!redi) { + PBD::error << "OSC: cannot find plugin # " << piid << " for RID '" << ssid << "'" << endmsg; + return -1; + } + + boost::shared_ptr pi; + + if (!(pi = boost::dynamic_pointer_cast(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) { 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 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 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); -- 2.30.2