From 1015e19ad3d5b9aa0f368bc6add1fbceac0091d4 Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Fri, 18 Nov 2016 07:53:40 -0800 Subject: OSC: issue 7116 fix send enable not working --- libs/surfaces/osc/osc.cc | 27 ++++++++++++++++++++++++++- libs/surfaces/osc/osc_select_observer.cc | 24 ++++++++++++++++++++++-- libs/surfaces/osc/osc_select_observer.h | 2 ++ 3 files changed, 50 insertions(+), 3 deletions(-) (limited to 'libs/surfaces') 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 r = boost::dynamic_pointer_cast (s); + if (!r) { + return 0; + } + boost::shared_ptr snd = boost::dynamic_pointer_cast (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 r = boost::dynamic_pointer_cast (s); + if (!r) { + // should never get here + return sel_send_fail ("send_enable", id + 1, 0, get_address (msg)); + } + boost::shared_ptr snd = boost::dynamic_pointer_cast (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 r = boost::dynamic_pointer_cast (_strip); + if (!r) { + // should never get here + clear_strip_with_id ("/select/send_enable", nsends + 1, 0); + } + boost::shared_ptr snd = boost::dynamic_pointer_cast (r->nth_send(nsends)); + if (snd) { + boost::shared_ptr proc = boost::dynamic_pointer_cast (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 @@ -542,6 +553,15 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr lo_message_free (msg); } +void +OSCSelectObserver::send_enable (string path, uint32_t id, boost::shared_ptr 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) { 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 controllable); + void send_enable (std::string path, uint32_t id, boost::shared_ptr proc); void eq_init (void); void eq_end (void); void eq_restart (int); -- cgit v1.2.3