summaryrefslogtreecommitdiff
path: root/libs/surfaces/osc/osc_select_observer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'libs/surfaces/osc/osc_select_observer.cc')
-rw-r--r--libs/surfaces/osc/osc_select_observer.cc91
1 files changed, 64 insertions, 27 deletions
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
index 2071f0455d..c4a5eae09c 100644
--- a/libs/surfaces/osc/osc_select_observer.cc
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -45,15 +45,17 @@ using namespace PBD;
using namespace ARDOUR;
using namespace ArdourSurface;
-OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address a, uint32_t gm, std::bitset<32> fb)
+OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address a, ArdourSurface::OSC::OSCSurface* su)
: _strip (s)
- ,gainmode (gm)
- ,feedback (fb)
+ ,sur (su)
,nsends (0)
,_last_gain (0.0)
{
addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+ gainmode = sur->gainmode;
+ feedback = sur->feedback;
as = ARDOUR::Off;
+ send_size = 0;
if (feedback[0]) { // buttons are separate feedback
_strip->PropertyChanged.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::name_changed, this, boost::lambda::_1), OSC::instance());
@@ -235,52 +237,85 @@ OSCSelectObserver::~OSCSelectObserver ()
}
void
+OSCSelectObserver::renew_sends () {
+ send_end();
+ send_init();
+}
+
+void
+OSCSelectObserver::renew_plugin () {
+ // to be written :)
+}
+
+void
OSCSelectObserver::send_init()
{
// we don't know how many there are, so find out.
bool sends;
+ nsends = 0;
do {
sends = false;
if (_strip->send_level_controllable (nsends)) {
- _strip->send_level_controllable(nsends)->Changed.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_gain, this, nsends, _strip->send_level_controllable(nsends)), OSC::instance());
- send_timeout.push_back (0);
- send_gain (nsends, _strip->send_level_controllable(nsends));
sends = true;
+ nsends++;
}
+ } while (sends);
+ if (!nsends) {
+ return;
+ }
- if (_strip->send_enable_controllable (nsends)) {
- _strip->send_enable_controllable(nsends)->Changed.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message_with_id, this, X_("/select/send_enable"), nsends + 1, _strip->send_enable_controllable(nsends)), OSC::instance());
- enable_message_with_id ("/select/send_enable", nsends + 1, _strip->send_enable_controllable(nsends));
- sends = true;
- } else if (sends) {
+ send_size = nsends;
+ if (sur->send_page_size) {
+ send_size = sur->send_page_size;
+ }
+ // check limits
+ uint32_t max_page = (uint32_t)(nsends / send_size) + 1;
+ if (sur->send_page < 1) {
+ sur->send_page = 1;
+ } else if ((uint32_t)sur->send_page > max_page) {
+ sur->send_page = max_page;
+ }
+ uint32_t page_start = ((sur->send_page - 1) * send_size);
+ uint32_t last_send = sur->send_page * send_size;
+ uint32_t c = 1;
+
+ for (uint32_t s = page_start; s < last_send; ++s, ++c) {
+
+ bool send_valid = false;
+ if (_strip->send_level_controllable (s)) {
+ _strip->send_level_controllable(s)->Changed.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_gain, this, c, _strip->send_level_controllable(s)), OSC::instance());
+ send_timeout.push_back (0);
+ send_gain (c, _strip->send_level_controllable(s));
+ send_valid = true;
+ }
+
+ if (_strip->send_enable_controllable (s)) {
+ _strip->send_enable_controllable(s)->Changed.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::enable_message_with_id, this, X_("/select/send_enable"), c, _strip->send_enable_controllable(s)), OSC::instance());
+ enable_message_with_id ("/select/send_enable", c, _strip->send_enable_controllable(s));
+ } else if (send_valid) {
boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route> (_strip);
if (!r) {
// should never get here
- send_float_with_id ("/select/send_enable", nsends + 1, 0);
+ send_float_with_id ("/select/send_enable", c, 0);
}
- boost::shared_ptr<Send> snd = boost::dynamic_pointer_cast<Send> (r->nth_send(nsends));
+ boost::shared_ptr<Send> snd = boost::dynamic_pointer_cast<Send> (r->nth_send(s));
if (snd) {
boost::shared_ptr<Processor> proc = boost::dynamic_pointer_cast<Processor> (snd);
- proc->ActiveChanged.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_enable, this, X_("/select/send_enable"), nsends + 1, proc), OSC::instance());
- send_float_with_id ("/select/send_enable", nsends + 1, proc->enabled());
+ proc->ActiveChanged.connect (send_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::send_enable, this, X_("/select/send_enable"), c, proc), OSC::instance());
+ send_float_with_id ("/select/send_enable", c, 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
- text_with_id ("/select/send_name", nsends + 1, _strip->send_name(nsends));
+ if (!gainmode && send_valid) {
+ text_with_id ("/select/send_name", c, _strip->send_name(s));
}
- // Send numbers are 0 based, OSC is 1 based so this gets incremented at the end
- if (sends) {
- nsends++;
- }
- } while (sends);
+ }
}
void
OSCSelectObserver::send_end ()
{
send_connections.drop_connections ();
- for (uint32_t i = 1; i <= nsends; i++) {
+ for (uint32_t i = 1; i <= send_size; i++) {
if (gainmode) {
send_float_with_id ("/select/send_fader", i, 0);
} else {
@@ -291,6 +326,8 @@ OSCSelectObserver::send_end ()
// next name
text_with_id ("/select/send_name", i, " ");
}
+ // need to delete or clear send_timeout
+ send_timeout.clear();
nsends = 0;
}
@@ -580,7 +617,7 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable>
#else
value = gain_to_slider_position (controllable->get_value());
#endif
- text_with_id ("/select/send_name" , id + 1, string_compose ("%1%2%3", std::fixed, std::setprecision(2), db));
+ text_with_id ("/select/send_name" , id, string_compose ("%1%2%3", std::fixed, std::setprecision(2), db));
if (send_timeout.size() > id) {
send_timeout[id] = 8;
}
@@ -590,9 +627,9 @@ OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable>
}
if (feedback[2]) {
- path = set_path (path, id + 1);
+ path = set_path (path, id);
} else {
- lo_message_add_int32 (msg, id + 1);
+ lo_message_add_int32 (msg, id);
}
lo_message_add_float (msg, value);