+ return float_message_with_id ("/select/send_enable", id, 0, sur->feedback[2], get_address (msg));
+}
+
+int
+OSC::sel_master_send_enable (int state, 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;
+ }
+ if (s) {
+ if (s->master_send_enable_controllable ()) {
+ s->master_send_enable_controllable()->set_value (state, PBD::Controllable::NoGroup);
+ return 0;
+ }
+ }
+ return float_message ("/select/master_send_enable", 0, get_address(msg));
+}
+
+int
+OSC::select_plugin_parameter (const char *path, const char* types, lo_arg **argv, int argc, lo_message msg) {
+ OSCSurface *sur = get_surface(get_address (msg));
+ int paid;
+ uint32_t piid = sur->plugin_id;
+ float value = 0;
+ if (argc > 1) {
+ // no inline args
+ if (argc == 2) {
+ // change parameter in already selected plugin
+ if (types[0] == 'f') {
+ paid = (int) argv[0]->f;
+ } else {
+ paid = argv[0]->i;
+ }
+ value = argv[1]->f;
+ } else if (argc == 3) {
+ if (types[0] == 'f') {
+ piid = (int) argv[0]->f;
+ } else {
+ piid = argv[0]->i;
+ }
+ _sel_plugin (piid, get_address (msg));
+ if (types[1] == 'f') {
+ paid = (int) argv[1]->f;
+ } else {
+ paid = argv[1]->i;
+ }
+ value = argv[2]->f;
+ } else if (argc > 3) {
+ PBD::warning << "OSC: Too many parameters: " << argc << endmsg;
+ return -1;
+ }
+ } else if (argc) {
+ const char * par = strstr (&path[25], "/");
+ if (par) {
+ piid = atoi (&path[25]);
+ _sel_plugin (piid, msg);
+ paid = atoi (&par[1]);
+ value = argv[0]->f;
+ // we have plugin id too
+ } else {
+ // just parameter
+ paid = atoi (&path[25]);
+ value = argv[0]->f;
+ }
+ } else {
+ PBD::warning << "OSC: Must have parameters." << endmsg;
+ return -1;
+ }
+ if (!piid || piid > sur->plugins.size ()) {
+ return float_message_with_id ("/select/plugin/parameter", paid, 0, sur->feedback[2], get_address (msg));
+ }
+ if (sur->plug_page_size && (paid > (int)sur->plug_page_size)) {
+ return float_message_with_id ("/select/plugin/parameter", paid, 0, sur->feedback[2], get_address (msg));
+ }
+ boost::shared_ptr<Stripable> s;
+ if (sur->expand_enable) {
+ s = get_strip (sur->expand, get_address (msg));
+ } else {
+ s = _select;
+ }
+ boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(s);
+ if (!r) {
+ return 1;
+ }
+
+ boost::shared_ptr<Processor> proc = r->nth_plugin (sur->plugins[sur->plugin_id - 1]);
+ boost::shared_ptr<PluginInsert> pi;
+ if (!(pi = boost::dynamic_pointer_cast<PluginInsert>(proc))) {
+ return 1;
+ }
+ boost::shared_ptr<ARDOUR::Plugin> pip = pi->plugin();
+ // paid is paged parameter convert to absolute
+ int parid = paid + (int)(sur->plug_page_size * (sur->plug_page - 1));
+ if (parid > (int) sur->plug_params.size ()) {
+ if (sur->feedback[13]) {
+ float_message_with_id ("/select/plugin/parameter", paid, 0, sur->feedback[2], get_address (msg));
+ }
+ return 0;
+ }
+
+ bool ok = false;
+ uint32_t controlid = pip->nth_parameter(sur->plug_params[parid - 1], ok);
+ if (!ok) {
+ return 1;
+ }
+ ParameterDescriptor pd;
+ pip->get_parameter_descriptor(controlid, pd);
+ if ( pip->parameter_is_input(controlid) || pip->parameter_is_control(controlid) ) {
+ boost::shared_ptr<AutomationControl> c = pi->automation_control(Evoral::Parameter(PluginAutomation, 0, controlid));
+ if (c) {
+ if (pd.integer_step && pd.upper == 1) {
+ if (c->get_value () && value < 1.0) {
+ c->set_value (0, PBD::Controllable::NoGroup);
+ } else if (!c->get_value () && value) {
+ c->set_value (1, PBD::Controllable::NoGroup);
+ }
+ } else {
+ c->set_value (c->interface_to_internal (value), PBD::Controllable::NoGroup);
+ }
+ return 0;
+ }
+ }
+ return 1;