diff options
author | Len Ovens <len@ovenwerks.net> | 2016-06-06 14:54:33 -0700 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2016-06-06 14:54:33 -0700 |
commit | ee1046bbed84f79c80433a2f011696813240e517 (patch) | |
tree | 7fbf0ccc11e312d2b139d8b75b830bd7b7838127 /libs | |
parent | 3c0fd1a1158ef858233c48abeb562c9bfe813eec (diff) |
OSC: Respond to GUI select.
Diffstat (limited to 'libs')
-rw-r--r-- | libs/surfaces/osc/osc.cc | 74 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 5 |
2 files changed, 56 insertions, 23 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 6a5d4d3cd1..31e0bf2628 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -243,7 +243,7 @@ OSC::start () periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &OSC::periodic)); periodic_timeout->attach (main_loop()->get_context()); - //StripableSelectionChanged.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this, _1), this); + StripableSelectionChanged.connect (session_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this, _1), this); return 0; } @@ -316,6 +316,7 @@ OSC::stop () } periodic_connection.disconnect (); + session_connections.drop_connections (); // Delete any active route observers for (RouteObservers::iterator x = route_observers.begin(); x != route_observers.end();) { @@ -1552,7 +1553,7 @@ OSC::route_recenable (int ssid, int yn, lo_message msg) } } // hmm, not set for whatever reason tell surface - return route_send_fail ("recenable", ssid, 0, msg); + return route_send_fail ("recenable", ssid, 0, lo_message_get_source (msg)); } int @@ -1578,7 +1579,7 @@ OSC::route_recsafe (int ssid, int yn, lo_message msg) } } // hmm, not set for whatever reason tell surface - return route_send_fail ("record_safe", ssid, 0, msg); + return route_send_fail ("record_safe", ssid, 0,lo_message_get_source (msg)); } int @@ -1594,7 +1595,7 @@ OSC::route_monitor_input (int ssid, int yn, lo_message msg) if (track) { track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup); } else { - route_send_fail ("monitor_input", ssid, 0, msg); + route_send_fail ("monitor_input", ssid, 0, lo_message_get_source (msg)); } } @@ -1622,7 +1623,7 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg) if (track) { track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup); } else { - route_send_fail ("monitor_disk", ssid, 0, msg); + route_send_fail ("monitor_disk", ssid, 0, lo_message_get_source (msg)); } } @@ -1643,21 +1644,27 @@ OSC::strip_select (int ssid, int yn, lo_message msg) //ignore button release if (!yn) return 0; + return _strip_select ( ssid, lo_message_get_source (msg)); +} + +int +OSC::_strip_select (int ssid, lo_address addr) +{ if (!session) { - route_send_fail ("select", ssid, 0, msg); + route_send_fail ("select", ssid, 0, addr); return -1; } - int rid = get_rid (ssid, lo_message_get_source (msg)); + int rid = get_rid (ssid, addr); boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route); - OSCSurface *sur = get_surface(lo_message_get_source (msg)); + OSCSurface *sur = get_surface(addr); delete sur->sel_obs; if (s) { sur->surface_sel = ssid; - OSCSelectObserver* sel_fb = new OSCSelectObserver (s, lo_message_get_source (msg), ssid, sur->gainmode, sur->feedback); + OSCSelectObserver* sel_fb = new OSCSelectObserver (s, addr, ssid, sur->gainmode, sur->feedback); sur->sel_obs = sel_fb; } else { - route_send_fail ("select", ssid, 0 , msg); + route_send_fail ("select", ssid, 0 , addr); } int b_s = sur->bank_size; if (!b_s) { // bank size 0 means we need to know how many strips there are. @@ -1676,10 +1683,10 @@ OSC::strip_select (int ssid, int yn, lo_message msg) } lo_message_add_float (reply, (float) 1); - lo_send_message (lo_message_get_source (msg), path.c_str(), reply); + lo_send_message (addr, path.c_str(), reply); lo_message_free (reply); } else { - route_send_fail ("select", i, 0, msg); + route_send_fail ("select", i, 0, addr); } } @@ -1693,7 +1700,7 @@ OSC::strip_gui_select (int ssid, int yn, lo_message msg) if (!yn) return 0; if (!session) { - route_send_fail ("gui_select", ssid, 0, msg); + route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg)); return -1; } int ret = strip_select (ssid, yn, msg); @@ -1708,7 +1715,7 @@ OSC::strip_gui_select (int ssid, int yn, lo_message msg) //s->set_select(); //sur->surface_sel = ssid; } else { - route_send_fail ("gui_select", ssid, 0, msg); + route_send_fail ("gui_select", ssid, 0, lo_message_get_source (msg)); } return 0; @@ -1731,7 +1738,7 @@ int OSC::route_set_gain_dB (int ssid, float dB, lo_message msg) { if (!session) { - route_send_fail ("gain", ssid, -193, msg); + route_send_fail ("gain", ssid, -193, lo_message_get_source (msg)); return -1; } int ret; @@ -1742,7 +1749,7 @@ OSC::route_set_gain_dB (int ssid, float dB, lo_message msg) ret = route_set_gain_abs (rid, dB_to_coefficient (dB), msg); } if (ret != 0) { - route_send_fail ("gain", ssid, 0, msg); + route_send_fail ("gain", ssid, 0, lo_message_get_source (msg)); } return ret; } @@ -1758,7 +1765,7 @@ int OSC::route_set_gain_fader (int ssid, float pos, lo_message msg) { if (!session) { - route_send_fail ("fader", ssid, 0, msg); + route_send_fail ("fader", ssid, 0, lo_message_get_source (msg)); return -1; } int ret; @@ -1769,7 +1776,7 @@ OSC::route_set_gain_fader (int ssid, float pos, lo_message msg) ret = route_set_gain_abs (rid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg); } if (ret != 0) { - route_send_fail ("fader", ssid, 0, msg); + route_send_fail ("fader", ssid, 0, lo_message_get_source (msg)); } return ret; } @@ -1984,6 +1991,29 @@ OSC::route_plugin_parameter_print (int ssid, int piid, int par, lo_message msg) return 0; } +void +OSC::gui_selection_changed (StripableNotificationListPtr stripables) +{ + boost::shared_ptr<Stripable> strip; + + if (!stripables->empty()) { + strip = stripables->front().lock(); + } + if (strip) { + for (uint32_t it = 0; it < _surface.size(); ++it) { + OSCSurface* sur = &_surface[it]; + if(!sur->feedback[10]) { + uint32_t sel_strip = strip->presentation_info().order() + 1; + if (!(sel_strip < sur->bank) && !(sel_strip >= (sur->bank + sur->bank_size))) { + lo_address addr = lo_address_new_from_url (sur->remote_url.c_str()); + _strip_select ((sel_strip - sur->bank + 1), addr); + } + } + } + } + +} + // timer callbacks bool OSC::periodic (void) @@ -2015,9 +2045,9 @@ OSC::periodic (void) } int -OSC::route_send_fail (string path, uint32_t ssid, float val, lo_message msg) +OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr) { - OSCSurface *sur = get_surface(lo_message_get_source (msg)); + OSCSurface *sur = get_surface(addr); ostringstream os; lo_message reply = lo_message_new (); @@ -2030,7 +2060,7 @@ OSC::route_send_fail (string path, uint32_t ssid, float val, lo_message msg) string str_pth = os.str(); lo_message_add_float (reply, (float) val); - lo_send_message (lo_message_get_source (msg), str_pth.c_str(), reply); + lo_send_message (addr, str_pth.c_str(), reply); lo_message_free (reply); if (sur->surface_sel == ssid) { os.str(""); @@ -2038,7 +2068,7 @@ OSC::route_send_fail (string path, uint32_t ssid, float val, lo_message msg) string sel_pth = os.str(); reply = lo_message_new (); lo_message_add_float (reply, (float) val); - lo_send_message (lo_message_get_source (msg), sel_pth.c_str(), reply); + lo_send_message (addr, sel_pth.c_str(), reply); lo_message_free (reply); } diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index 4b74bf0e78..aea4dd1dc6 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -414,6 +414,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> int route_monitor_input (int rid, int yn, lo_message msg); int route_monitor_disk (int rid, int yn, lo_message msg); int strip_select (int rid, int yn, lo_message msg); + int _strip_select (int rid, lo_address addr); int strip_gui_select (int rid, int yn, lo_message msg); int route_set_gain_abs (int rid, float level, lo_message msg); int route_set_gain_dB (int rid, float dB, lo_message msg); @@ -456,14 +457,16 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest> void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address); void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address); void drop_route (boost::weak_ptr<ARDOUR::Stripable>); + void gui_selection_changed (ARDOUR::StripableNotificationListPtr stripables); void route_name_changed (const PBD::PropertyChange&, boost::weak_ptr<ARDOUR::Route> r, lo_address addr); void update_clock (); bool periodic (void); sigc::connection periodic_connection; + PBD::ScopedConnectionList session_connections; - int route_send_fail (std::string path, uint32_t ssid, float val, lo_message msg); + int route_send_fail (std::string path, uint32_t ssid, float val, lo_address addr); typedef std::list<OSCRouteObserver*> RouteObservers; |