diff options
-rw-r--r-- | libs/surfaces/osc/osc.cc | 27 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_select_observer.cc | 24 | ||||
-rw-r--r-- | libs/surfaces/osc/osc_select_observer.h | 2 |
3 files changed, 50 insertions, 3 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 4a0e8657d0..4d4e20aae6 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -2597,6 +2597,18 @@ OSC::route_set_send_enable (int ssid, int sid, float val, lo_message msg) } if (s->send_level_controllable (sid)) { + boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s); + if (!r) { + return 0; + } + boost::shared_ptr<Send> snd = boost::dynamic_pointer_cast<Send> (r->nth_send(sid)); + if (snd) { + if (val) { + snd->activate(); + } else { + snd->deactivate(); + } + } return 0; } @@ -2624,7 +2636,20 @@ OSC::sel_sendenable (int id, float val, lo_message msg) return 0; } if (s->send_level_controllable (id)) { - return sel_send_fail ("send_enable", id + 1, 1, get_address (msg)); + boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (s); + if (!r) { + // should never get here + return sel_send_fail ("send_enable", id + 1, 0, get_address (msg)); + } + boost::shared_ptr<Send> snd = boost::dynamic_pointer_cast<Send> (r->nth_send(id)); + if (snd) { + if (val) { + snd->activate(); + } else { + snd->deactivate(); + } + } + return 0; } } return sel_send_fail ("send_enable", id + 1, 0, get_address (msg)); diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc index 657b46ff93..7bd2746432 100644 --- a/libs/surfaces/osc/osc_select_observer.cc +++ b/libs/surfaces/osc/osc_select_observer.cc @@ -29,6 +29,8 @@ #include "ardour/solo_isolate_control.h" #include "ardour/solo_safe_control.h" #include "ardour/route.h" +#include "ardour/send.h" +#include "ardour/processor.h" #include "osc.h" #include "osc_select_observer.h" @@ -251,8 +253,17 @@ OSCSelectObserver::send_init() enable_message_with_id ("/select/send_enable", nsends + 1, _strip->send_enable_controllable(nsends)); sends = true; } else if (sends) { - // not used by Ardour, just mixbus so in Ardour always true - clear_strip_with_id ("/select/send_enable", nsends + 1, 1); + boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_strip); + if (!r) { + // should never get here + clear_strip_with_id ("/select/send_enable", nsends + 1, 0); + } + boost::shared_ptr<Send> snd = boost::dynamic_pointer_cast<Send> (r->nth_send(nsends)); + if (snd) { + boost::shared_ptr<Processor> proc = boost::dynamic_pointer_cast<Processor> (snd); + proc->ActiveChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_enable, this, X_("/select/send_enable"), nsends + 1, proc), OSC::instance()); + clear_strip_with_id ("/select/send_enable", nsends + 1, proc->enabled()); + } } // this should get signalled by the route the send goes to, (TODO) if (!gainmode && sends) { // if the gain control is there, this is too @@ -543,6 +554,15 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> } void +OSCSelectObserver::send_enable (string path, uint32_t id, boost::shared_ptr<Processor> proc) +{ + // with no delay value is wrong + usleep(10); + + clear_strip_with_id ("/select/send_enable", id, proc->enabled()); +} + +void OSCSelectObserver::text_with_id (string path, uint32_t id, string name) { lo_message msg = lo_message_new (); diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h index d3abc20c80..b004f938d9 100644 --- a/libs/surfaces/osc/osc_select_observer.h +++ b/libs/surfaces/osc/osc_select_observer.h @@ -29,6 +29,7 @@ #include "pbd/controllable.h" #include "pbd/stateful.h" #include "ardour/types.h" +#include "ardour/processor.h" class OSCSelectObserver { @@ -75,6 +76,7 @@ class OSCSelectObserver void send_end (void); void send_restart (int); void send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable); + void send_enable (std::string path, uint32_t id, boost::shared_ptr<ARDOUR::Processor> proc); void eq_init (void); void eq_end (void); void eq_restart (int); |