summaryrefslogtreecommitdiff
path: root/libs/surfaces/osc/osc_select_observer.cc
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2017-11-23 12:04:21 -0800
committerLen Ovens <len@ovenwerks.net>2017-11-23 12:04:54 -0800
commitda467cf39b73e2a4ddc243bfa1791306625b5302 (patch)
tree643195cd94493fb1655e56d96628ee3a10a6a1af /libs/surfaces/osc/osc_select_observer.cc
parent155156cfb2df50970c1ad4c1fc05ad9d00c5baf9 (diff)
OSC: Only send new select send values
no clear first, no double send
Diffstat (limited to 'libs/surfaces/osc/osc_select_observer.cc')
-rw-r--r--libs/surfaces/osc/osc_select_observer.cc127
1 files changed, 73 insertions, 54 deletions
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
index bfcfc2d0a1..5ad7f2226a 100644
--- a/libs/surfaces/osc/osc_select_observer.cc
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -57,13 +57,17 @@ OSCSelectObserver::OSCSelectObserver (OSC& o, ArdourSurface::OSC::OSCSurface* su
,_last_trim (-1.0)
,_init (true)
,eq_bands (0)
+ ,_expand (2048)
{
addr = lo_address_new_from_url (sur->remote_url.c_str());
gainmode = sur->gainmode;
feedback = sur->feedback;
in_line = feedback[2];
- refresh_strip (true);
send_page_size = sur->send_page_size;
+ plug_page_size = sur->plug_page_size;
+ send_page = sur->send_page;
+ refresh_strip (sur->select, sur->nsends, true);
+ set_expand (sur->expand_enable);
}
OSCSelectObserver::~OSCSelectObserver ()
@@ -92,21 +96,13 @@ OSCSelectObserver::no_strip ()
}
void
-OSCSelectObserver::refresh_strip (bool force)
+OSCSelectObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip, uint32_t s_nsends, bool force)
{
_init = true;
if (_tick_busy) {
Glib::usleep(100); // let tick finish
}
- // this has to be done first because expand may change with no strip change
- if (sur->expand_enable) {
- _osc.float_message ("/select/expand", 1.0, addr);
- } else {
- _osc.float_message ("/select/expand", 0.0, addr);
- }
-
- boost::shared_ptr<ARDOUR::Stripable> new_strip = sur->select;
if (_strip && (new_strip == _strip) && !force) {
_init = false;
return;
@@ -123,7 +119,7 @@ OSCSelectObserver::refresh_strip (bool force)
send_size = 0;
plug_size = 0;
_comp_redux = 1;
- nsends = 0;
+ nsends = s_nsends;
_last_gain = -1.0;
_last_trim = -1.0;
@@ -245,6 +241,33 @@ OSCSelectObserver::refresh_strip (bool force)
}
void
+OSCSelectObserver::set_expand (uint32_t expand)
+{
+ if (expand != _expand) {
+ _expand = expand;
+ if (expand) {
+ _osc.float_message ("/select/expand", 1.0, addr);
+ } else {
+ _osc.float_message ("/select/expand", 0.0, addr);
+ }
+ }
+}
+
+void
+OSCSelectObserver::set_send_page (uint32_t page)
+{
+ send_page = page;
+ renew_sends ();
+}
+
+void
+OSCSelectObserver::set_send_size (uint32_t size)
+{
+ send_page_size = size;
+ renew_sends ();
+}
+
+void
OSCSelectObserver::clear_observer ()
{
_init = true;
@@ -300,7 +323,8 @@ OSCSelectObserver::clear_observer ()
void
OSCSelectObserver::renew_sends () {
- send_end();
+ send_connections.drop_connections ();
+ send_timeout.clear();
send_init();
}
@@ -313,34 +337,15 @@ OSCSelectObserver::renew_plugin () {
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)) {
- sends = true;
- nsends++;
- }
- } while (sends);
- if (!nsends) {
- return;
- }
-
- // paging should be done in osc.cc in case there is no feedback
send_size = nsends;
if (send_page_size) {
send_size = 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;
+ if (!send_size) {
+ return;
}
- uint32_t page_start = ((sur->send_page - 1) * send_size);
- uint32_t last_send = sur->send_page * send_size;
+ uint32_t page_start = ((send_page - 1) * send_size);
+ uint32_t last_send = send_page * send_size;
uint32_t c = 1;
send_timeout.push_back (2);
_last_send.clear();
@@ -352,9 +357,13 @@ OSCSelectObserver::send_init()
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 (2);
- _last_send.push_back (0.0);
+ _last_send.push_back (20.0);
send_gain (c, _strip->send_level_controllable(s));
send_valid = true;
+ } else {
+ send_gain (c, _strip->send_level_controllable(s));
+ _osc.float_message_with_id ("/select/send_enable", c, 0, in_line, addr);
+ _osc.text_message_with_id ("/select/send_name", c, " ", in_line, addr);
}
if (_strip->send_enable_controllable (s)) {
@@ -404,8 +413,8 @@ OSCSelectObserver::plugin_init()
// default of 0 page size means show all
plug_size = nplug_params;
- if (sur->plug_page_size) {
- plug_size = sur->plug_page_size;
+ if (plug_page_size) {
+ plug_size = plug_page_size;
}
_osc.text_message ("/select/plugin/name", pip->name(), addr);
uint32_t page_end = nplug_params;
@@ -469,7 +478,6 @@ OSCSelectObserver::send_end ()
}
// need to delete or clear send_timeout
send_timeout.clear();
- nsends = 0;
}
void
@@ -560,7 +568,7 @@ OSCSelectObserver::tick ()
for (uint32_t i = 1; i <= send_timeout.size(); i++) {
if (send_timeout[i]) {
if (send_timeout[i] == 1) {
- uint32_t pg_offset = (sur->send_page - 1) * send_page_size;
+ uint32_t pg_offset = (send_page - 1) * send_page_size;
_osc.text_message_with_id ("/select/send_name", i, _strip->send_name(pg_offset + i - 1), in_line, addr);
}
send_timeout[i]--;
@@ -730,31 +738,41 @@ OSCSelectObserver::gain_automation ()
void
OSCSelectObserver::send_gain (uint32_t id, boost::shared_ptr<PBD::Controllable> controllable)
{
- if (_last_send[id] != controllable->get_value()) {
- _last_send[id] = controllable->get_value();
+ float raw_value = 0.0;
+ if (controllable) {
+ raw_value = controllable->get_value();
+ }
+ if (_last_send[id] != raw_value) {
+ _last_send[id] = raw_value;
} else {
return;
}
string path;
- float value;
+ float value = 0.0;
float db;
#ifdef MIXBUS
- db = controllable->get_value();
+ if (controllable) {
+ db = raw_value;
+ } else {
+ db = -193;
+ }
#else
- if (controllable->get_value() < 1e-15) {
- db = -193;
- } else {
- db = accurate_coefficient_to_dB (controllable->get_value());
- }
+ if (raw_value < 1e-15) {
+ db = -193;
+ } else {
+ db = accurate_coefficient_to_dB (raw_value);
+ }
#endif
if (gainmode) {
path = "/select/send_fader";
- value = controllable->internal_to_interface (controllable->get_value());
+ if (controllable) {
+ value = controllable->internal_to_interface (raw_value);
+ }
_osc.text_message_with_id ("/select/send_name" , id, string_compose ("%1%2%3", std::fixed, std::setprecision(2), db), in_line, addr);
- if (send_timeout.size() > id) {
- send_timeout[id] = 8;
- }
+ if (send_timeout.size() > id) {
+ send_timeout[id] = 8;
+ }
} else {
path = "/select/send_gain";
value = db;
@@ -871,6 +889,7 @@ OSCSelectObserver::eq_end ()
void
OSCSelectObserver::eq_restart(int x)
{
- eq_end();
+ eq_connections.drop_connections ();
+ //eq_end();
eq_init();
}