OSC: Only send new select send values

no clear first, no double send
This commit is contained in:
Len Ovens
2017-11-23 12:04:21 -08:00
parent 155156cfb2
commit da467cf39b
4 changed files with 106 additions and 59 deletions

View File

@@ -2328,7 +2328,7 @@ OSC::sel_send_pagesize (uint32_t size, lo_message msg)
OSCSurface *s = get_surface(get_address (msg));
if (size != s->send_page_size) {
s->send_page_size = size;
s->sel_obs->renew_sends();
s->sel_obs->set_send_size(size);
}
return 0;
}
@@ -2337,8 +2337,18 @@ int
OSC::sel_send_page (int page, lo_message msg)
{
OSCSurface *s = get_surface(get_address (msg));
uint32_t send_size = s->send_page_size;
if (!send_size) {
send_size = s->nsends;
}
uint32_t max_page = (uint32_t)(s->nsends / send_size) + 1;
s->send_page = s->send_page + page;
s->sel_obs->renew_sends();
if (s->send_page < 1) {
s->send_page = 1;
} else if ((uint32_t)s->send_page > max_page) {
s->send_page = max_page;
}
s->sel_obs->set_send_page (s->send_page);
return 0;
}
@@ -3601,6 +3611,17 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
_select = s;
}
sur->select = s;
bool sends;
uint32_t nsends = 0;
do {
sends = false;
if (s->send_level_controllable (nsends)) {
sends = true;
nsends++;
}
} while (sends);
sur->nsends = nsends;
s->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::recalcbanks, this), this);
OSCSelectObserver* so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs);
@@ -3610,6 +3631,7 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
}
OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, sur);
sur->sel_obs = sel_fb;
sur->sel_obs->set_expand (sur->expand_enable);
uint32_t obs_expand = 0;
if (sur->expand_enable) {
obs_expand = sur->expand;
@@ -3630,7 +3652,7 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
boost::shared_ptr<Route> r = boost::dynamic_pointer_cast<Route>(s);
if (r) {
r->processors_changed.connect (sur->proc_connection, MISSING_INVALIDATOR, boost::bind (&OSC::processor_changed, this, addr), this);
processor_changed (addr);
_sel_plugin (sur->plugin_id, addr);
}
return 0;
@@ -3640,7 +3662,6 @@ void
OSC::processor_changed (lo_address addr)
{
OSCSurface *sur = get_surface (addr);
sur->proc_connection.disconnect ();
_sel_plugin (sur->plugin_id, addr);
if (sur->sel_obs) {
sur->sel_obs->renew_sends ();

View File

@@ -152,6 +152,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
std::vector<int> plugins; // stores allowable plugins with index (work around MB strip PIs)
int send_page; // current send page
uint32_t send_page_size; // send page size in channels
uint32_t nsends; // number of sends select has
PBD::ScopedConnection proc_connection; // for processor signal monitoring
// cue
bool cue; // is this a cue surface

View File

@@ -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;
@@ -244,6 +240,33 @@ OSCSelectObserver::refresh_strip (bool force)
tick();
}
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 ()
{
@@ -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();
}

View File

@@ -47,7 +47,10 @@ class OSCSelectObserver
void renew_plugin (void);
void eq_restart (int);
void clear_observer (void);
void refresh_strip (bool force);
void refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip, uint32_t nsends, bool force);
void set_expand (uint32_t expand);
void set_send_page (uint32_t page);
void set_send_size (uint32_t size);
private:
boost::shared_ptr<ARDOUR::Stripable> _strip;
@@ -77,10 +80,13 @@ class OSCSelectObserver
ARDOUR::AutoState as;
uint32_t send_page_size;
uint32_t send_size;
uint32_t send_page;
uint32_t nplug_params;
uint32_t plug_page_size;
uint32_t plug_size;
int eq_bands;
bool _tick_busy;
uint32_t _expand;
void name_changed (const PBD::PropertyChange& what_changed);
void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);