diff options
author | Len Ovens <len@ovenwerks.net> | 2016-06-11 13:57:27 -0700 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2016-06-11 13:57:27 -0700 |
commit | 3d9517c22ff081b00faba119c6eee56796c39a62 (patch) | |
tree | c8c17b86dd838870c7db12794db598b6df286b00 | |
parent | 2c44225df2569bffe452fe2a84b698488f203cf0 (diff) |
OSC: Add send enable control.
-rw-r--r-- | libs/surfaces/osc/osc.cc | 119 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 5 |
2 files changed, 101 insertions, 23 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index d68e52b59b..edaf5b76b4 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -533,6 +533,7 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/select/pan_stereo_width", "f", sel_pan_width); REGISTER_CALLBACK (serv, "/select/send_gain", "if", sel_sendgain); REGISTER_CALLBACK (serv, "/select/send_fader", "if", sel_sendfader); + REGISTER_CALLBACK (serv, "/select/send_enable", "if", sel_sendenable); /* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */ REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute); @@ -557,6 +558,7 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/strip/send/gainabs", "iif", route_set_send_gain_abs); REGISTER_CALLBACK (serv, "/strip/send/gain", "iif", route_set_send_gain_dB); REGISTER_CALLBACK (serv, "/strip/send/fader", "iif", route_set_send_fader); + REGISTER_CALLBACK (serv, "/strip/send/enable", "iif", route_set_send_enable); /* still not-really-standardized query interface */ //REGISTER_CALLBACK (serv, "/ardour/*/#current_value", "", current_value); @@ -1881,8 +1883,7 @@ OSC::strip_gui_select (int ssid, int yn, lo_message msg) int rid = get_rid (ssid, lo_message_get_source (msg)); boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route); if (s) { - //SetStripableSelection ((*s)->presentation_info().order()); - SetStripableSelection (rid); //alt above may end up being better + SetStripableSelection (rid); } else { route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg)); } @@ -2102,13 +2103,7 @@ OSC::route_set_send_gain_abs (int ssid, int sid, float val, lo_message msg) int OSC::route_set_send_gain_dB (int ssid, int sid, float val, lo_message msg) { - int ret; - ret = route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg); - if (ret != 0) { - return route_send_fail ("send/gain", ssid, -193, lo_message_get_source (msg)); - } - -return 0; + return route_set_send_gain_abs (ssid, sid, dB_to_coefficient (val), msg); } int @@ -2117,39 +2112,94 @@ OSC::route_set_send_fader (int ssid, int sid, float pos, lo_message msg) if (!session) { return -1; } - int ret; if ((pos > 799.5) && (pos < 800.5)) { - ret = route_set_send_gain_abs (ssid, sid, 1.0, msg); + return route_set_send_gain_abs (ssid, sid, 1.0, msg); } else { - ret = route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg); - } - if (ret != 0) { - return route_send_fail ("send/fader", ssid, -193, lo_message_get_source (msg)); + return route_set_send_gain_abs (ssid, sid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg); } - - return ret; } int OSC::sel_sendgain (int id, float val, lo_message msg) { OSCSurface *sur = get_surface(lo_message_get_source (msg)); + int ret; if (sur->surface_sel) { - return route_set_send_gain_dB(sur->surface_sel, id, val, msg); - } else { - return route_send_fail ("send_gain", 0, -193, lo_message_get_source (msg)); + ret = route_set_send_gain_dB(sur->surface_sel, id, val, msg); } + if (!ret) { + return ret; + } + return sel_send_fail ("send_gain", id, -193, lo_message_get_source (msg)); } int OSC::sel_sendfader (int id, float val, lo_message msg) { OSCSurface *sur = get_surface(lo_message_get_source (msg)); + int ret; if (sur->surface_sel) { - return route_set_send_fader(sur->surface_sel, id, val, msg); - } else { - return route_send_fail ("send_gain", 0, -193, lo_message_get_source (msg)); + ret = route_set_send_fader(sur->surface_sel, id, val, msg); + } + if (!ret) { + return ret; } + return sel_send_fail ("send_gain", id, 0, lo_message_get_source (msg)); + +} + +int +OSC::route_set_send_enable (int ssid, int sid, float val, lo_message msg) +{ + if (!session) { + return -1; + } + int rid = get_rid (ssid, lo_message_get_source (msg)); + + boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route); + + if (s) { + + /* revert to zero-based counting */ + + if (sid > 0) { + --sid; + } + + if (s->send_enable_controllable (sid)) { + s->send_enable_controllable (sid)->set_value (val, PBD::Controllable::NoGroup); + return 0; + } + + if (s->send_level_controllable (sid)) { + return 1; + } + + } + + return -1; +} + +int +OSC::sel_sendenable (int id, float val, lo_message msg) +{ + OSCSurface *sur = get_surface(lo_message_get_source (msg)); + int ret; + if (sur->surface_sel) { + ret = route_set_send_enable(sur->surface_sel, id, val, msg); + } + switch (ret) { + case 0: + return ret; + case 1: + return sel_send_fail ("send_enable", id, 1, lo_message_get_source (msg)); + default: + sel_send_fail ("send_enable", id, 0, lo_message_get_source (msg)); + return -1; + } + return -1; + + } int @@ -2348,6 +2398,29 @@ OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr) return 0; } +int +OSC::sel_send_fail (string path, uint32_t id, float val, lo_address addr) +{ + OSCSurface *sur = get_surface(addr); + + ostringstream os; + lo_message reply; + reply = lo_message_new (); + if (sur->feedback[2]) { + os << "/select/" << path << "/" << id; + } else { + os << "/select/" << path; + lo_message_add_int32 (reply, id); + } + string str_pth = os.str(); + lo_message_add_float (reply, (float) val); + + lo_send_message (addr, str_pth.c_str(), reply); + lo_message_free (reply); + + return 0; +} + XMLNode& OSC::get_state () { diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 0ff427ecf0..7ef4b5aaf5 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -394,6 +394,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> PATH_CALLBACK2_MSG(sel_sendgain,i,f); PATH_CALLBACK2_MSG(sel_sendfader,i,f); + PATH_CALLBACK2_MSG(sel_sendenable,i,f); PATH_CALLBACK4(set_surface,i,i,i,i); PATH_CALLBACK2(locate,i,i); @@ -418,6 +419,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> PATH_CALLBACK3(route_set_send_gain_abs,i,i,f); PATH_CALLBACK3(route_set_send_gain_dB,i,i,f); PATH_CALLBACK3(route_set_send_fader,i,i,f); + PATH_CALLBACK3(route_set_send_enable,i,i,f); PATH_CALLBACK4(route_plugin_parameter,i,i,i,f); PATH_CALLBACK3(route_plugin_parameter_print,i,i,i); @@ -443,6 +445,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int route_set_send_gain_abs (int rid, int sid, float val, lo_message msg); int route_set_send_gain_dB (int rid, int sid, float val, lo_message msg); int route_set_send_fader (int rid, int sid, float val, lo_message msg); + int route_set_send_enable (int rid, int sid, float val, lo_message msg); int route_plugin_parameter (int rid, int piid,int par, float val, lo_message msg); int route_plugin_parameter_print (int rid, int piid,int par, lo_message msg); @@ -479,6 +482,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int sel_pan_width (float val, lo_message msg); int sel_sendgain (int id, float dB, lo_message msg); int sel_sendfader (int id, float pos, lo_message msg); + int sel_sendenable (int id, float pos, lo_message msg); void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address); void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address); @@ -493,6 +497,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> PBD::ScopedConnectionList session_connections; int route_send_fail (std::string path, uint32_t ssid, float val, lo_address addr); + int sel_send_fail (std::string path, uint32_t id, float val, lo_address addr); typedef std::list<OSCRouteObserver*> RouteObservers; |