summaryrefslogtreecommitdiff
path: root/libs/surfaces
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2016-11-18 07:53:40 -0800
committerLen Ovens <len@ovenwerks.net>2016-11-18 07:53:40 -0800
commit1015e19ad3d5b9aa0f368bc6add1fbceac0091d4 (patch)
treec2e084cbeedd6436d3284e6e1aca44ed3917b76e /libs/surfaces
parentd624bac38e5f035e003c832aa3b11b0f176c90d5 (diff)
OSC: issue 7116 fix send enable not working
Diffstat (limited to 'libs/surfaces')
-rw-r--r--libs/surfaces/osc/osc.cc27
-rw-r--r--libs/surfaces/osc/osc_select_observer.cc24
-rw-r--r--libs/surfaces/osc/osc_select_observer.h2
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);