summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2017-11-06 13:37:37 -0800
committerLen Ovens <len@ovenwerks.net>2017-11-06 13:38:18 -0800
commitbb8d65c52839362937c153c3c716ad0a4789c067 (patch)
tree0482fb75d26e6d5fd754fd1e98afe47b4fb40879 /libs
parent77a94e1015b6a9dad8273b0cb9337253f9e93eb2 (diff)
OSC link: make selection work correctly
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/osc/osc.cc120
-rw-r--r--libs/surfaces/osc/osc.h4
-rw-r--r--libs/surfaces/osc/osc_route_observer.cc41
-rw-r--r--libs/surfaces/osc/osc_route_observer.h3
-rw-r--r--libs/surfaces/osc/osc_select_observer.cc11
-rw-r--r--libs/surfaces/osc/osc_select_observer.h1
6 files changed, 109 insertions, 71 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index 6e05bd3937..65ea48aa62 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -1289,8 +1289,8 @@ OSC::surface_list (lo_message msg)
}
uint32_t devices = 0;
LinkSet* set = &(*it).second;
- if (set->linked.size()) {
- devices = set->linked.size() - 1;
+ if (set->urls.size()) {
+ devices = set->urls.size() - 1;
}
cerr << string_compose (" Linkset %1 has %2 devices and sees %3 strips\n", (*it).first, devices, set->strips.size());
cerr << string_compose (" Bank size: %1 Current bank: %2 Strip Types: %3\n", set->banksize, set->bank, set->strip_types.to_ulong());
@@ -1399,6 +1399,7 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l
new_ls.not_ready = true;
new_ls.strip_types = sur->strip_types;
new_ls.strips = sur->strips;
+ new_ls.urls.resize (2);
link_sets[set] = new_ls;
}
ls = &link_sets[set];
@@ -1413,7 +1414,7 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l
ls = &link_sets[oldid];
if (ls) {
ls->not_ready = 1;
- ls->linked[(uint32_t) data] = 0;
+ ls->urls[(uint32_t) data] = "";
}
}
return 0;
@@ -1433,10 +1434,10 @@ OSC::parse_link (const char *path, const char* types, lo_arg **argv, int argc, l
} else if (!strncmp (path, "/link/set", 9)) {
sur->linkset = set;
sur->linkid = (uint32_t) data;
- if (ls->linked.size() <= (uint32_t) data) {
- ls->linked.resize((int) data + 1);
+ if (ls->urls.size() <= (uint32_t) data) {
+ ls->urls.resize ((int) data + 1);
}
- ls->linked[(uint32_t) data] = sur;
+ ls->urls[(uint32_t) data] = sur->remote_url;
ls->not_ready = link_check (set);
if (ls->not_ready) {
strip_feedback (sur, true);
@@ -1465,23 +1466,35 @@ OSC::link_check (uint32_t set)
}
ls = &link_sets[set];
uint32_t bank_total = 0;
- uint32_t set_ready = 0;
- for (uint32_t dv = 1; dv < ls->linked.size(); dv++) {
- if ((ls->linked[dv]) && ((ls->linked[dv]))->linkset == set) {
- OSCSurface *su = (ls->linked[dv]);
- bank_total = bank_total + su->bank_size;
- } else if (!set_ready) {
- set_ready = dv;
+ for (uint32_t dv = 1; dv < ls->urls.size(); dv++) {
+ std::cout << string_compose ("link_check dv %1 banksize: %2\n", dv, bank_total);
+ OSCSurface *su;
+
+ if (ls->urls[dv] != "") {
+ string url = ls->urls[dv];
+ su = get_surface (lo_address_new_from_url (url.c_str()));
+ } else {
+ return dv;
}
- }
- if (ls->autobank) {
- ls->banksize = bank_total;
- } else {
- if (!set_ready && bank_total != ls->banksize) {
- set_ready = ls->linked.size();
+ if (su->linkset == set) {
+ std::cout << string_compose ("checking sur %1 %2 banksize %3\n", dv, su->remote_url, su->bank_size);
+ bank_total = bank_total + su->bank_size;
+ } else {
+ std::cout << "dv not ready\n";
+ ls->urls[dv] = "";
+ return dv;
+ }
+ std::cout << string_compose ("link_checked dv %1 banksize: %2\n", dv, bank_total);
+ //std::cout << string_compose ("link_check notready %1 banksize: %2\n", set_ready, bank_total);
+ if (ls->autobank) {
+ ls->banksize = bank_total;
+ } else {
+ if (bank_total != ls->banksize) {
+ return ls->urls.size();
+ }
}
}
- return set_ready;
+ return 0;
}
int
@@ -1679,8 +1692,8 @@ OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, ui
s->plug_page_size = pi_size;
// set bank and strip feedback
// XXXX check if we are already in a linkset
- _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), get_address (msg), true);
strip_feedback(s, true);
+ _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), get_address (msg));
global_feedback (s);
sel_send_pagesize (se_size, msg);
@@ -1849,6 +1862,7 @@ OSC::global_feedback (OSCSurface* sur)
void
OSC::strip_feedback (OSCSurface* sur, bool new_bank_size)
{
+ new_bank_size = true;
sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
sur->nstrips = sur->strips.size();
if (new_bank_size || (!sur->feedback[0] && !sur->feedback[1])) {
@@ -1929,7 +1943,6 @@ OSC::_recalcbanks ()
sur->nstrips = sur->strips.size();
// find lo_address
lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
- _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr, true);
if (sur->cue) {
_cue_set (sur->aux, addr);
} else if (!sur->bank_size) {
@@ -1942,6 +1955,7 @@ OSC::_recalcbanks ()
} else {
strip_feedback (sur, false);
}
+ _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr);
}
}
@@ -1968,41 +1982,52 @@ OSC::_set_bank (uint32_t bank_start, lo_address addr)
uint32_t nstrips = s->nstrips;
LinkSet *set;
- uint32_t l_set = s->linkset;
+ uint32_t ls = s->linkset;
- if (l_set) {
+ if (ls) {
//we have a linkset... deal with each surface
- set = &(link_sets[l_set]);
+ set = &(link_sets[ls]);
if (set->not_ready) {
return 1;
}
- uint32_t s_count = set->linked.size();
+ uint32_t d_count = set->urls.size();
set->strips = striplist;
bank_start = bank_limits_check (bank_start, set->banksize, nstrips);
set->bank = bank_start;
- for (uint32_t ls = 1; ls < s_count; ls++) {
- OSCSurface *sur = (set->linked[ls]);
- if (!sur || sur->linkset != l_set) {
+ uint32_t not_ready = 0;
+ for (uint32_t dv = 1; dv < d_count; dv++) {
+ OSCSurface *sur;
+ if (set->urls[dv] != "") {
+ string url = set->urls[dv];
+ sur = get_surface (lo_address_new_from_url (url.c_str()));
+ } else {
+ not_ready = dv;
+ }
+ if (sur->linkset != ls) {
+ set->urls[dv] = "";
+ not_ready = dv;
+ }
+ if (not_ready) {
if (!set->not_ready) {
- set->not_ready = ls;
+ set->not_ready = not_ready;
}
set->bank = 1;
- return 1;
+ break;
}
lo_address sur_addr = lo_address_new_from_url (sur->remote_url.c_str());
- _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr, true);
sur->bank = bank_start;
bank_start = bank_start + sur->bank_size;
strip_feedback (sur, false);
+ _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr);
bank_leds (sur);
lo_address_free (sur_addr);
}
} else {
- _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr, true);
s->bank = bank_limits_check (bank_start, s->bank_size, nstrips);
strip_feedback (s, true);
+ _strip_select (boost::shared_ptr<ARDOUR::Stripable>(), addr);
bank_leds (s);
}
@@ -3443,19 +3468,17 @@ OSC::strip_expand (int ssid, int yn, lo_message msg)
}
int
-OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr, bool quiet)
+OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
{
if (!session) {
return -1;
}
OSCSurface *sur = get_surface(addr, true);
if (!s) {
- if (sur->expand_enable) {
- // expand doesn't point to a stripable, turn it off and use select
- sur->expand = 0;
- sur->expand_enable = false;
- }
- if(ControlProtocol::first_selected_stripable()) {
+ // expand doesn't point to a stripable, turn it off and use select
+ sur->expand = 0;
+ sur->expand_enable = false;
+ if (ControlProtocol::first_selected_stripable()) {
s = ControlProtocol::first_selected_stripable();
} else {
s = session->master_out ();
@@ -3472,6 +3495,15 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr, bool quiet)
}
OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, sur);
sur->sel_obs = sel_fb;
+ uint32_t obs_expand = 0;
+ if (sur->expand_enable) {
+ obs_expand = sur->expand;
+ } else {
+ obs_expand = 0;
+ }
+ for (uint32_t i = 0; i < sur->observers.size(); i++) {
+ sur->observers[i]->set_expand (obs_expand);
+ }
} else {
if (so != 0) {
delete so;
@@ -3480,17 +3512,12 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr, bool quiet)
}
// need to set monitor for processor changed signal (for paging)
- // detecting processor changes requires cast to route
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);
}
- if (!quiet) {
- strip_feedback (sur, false);
- }
-
return 0;
}
@@ -3534,10 +3561,11 @@ OSC::sel_expand (uint32_t state, lo_message msg)
{
OSCSurface *sur = get_surface(get_address (msg));
boost::shared_ptr<Stripable> s;
- sur->expand_enable = (bool) state;
if (state && sur->expand) {
+ sur->expand_enable = (bool) state;
s = get_strip (sur->expand, get_address (msg));
} else {
+ sur->expand_enable = false;
s = _select;
}
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 1b88c559b4..b1b5611499 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -189,7 +189,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
// linked surfaces
struct LinkSet {
public:
- std::vector<OSCSurface*> linked; //linked surfaces
+ std::vector<std::string> urls; //urls of linked surfaces
uint32_t banksize; // linkset banksize
uint32_t bank; // linkset current bank
bool autobank; // banksize is derived from total
@@ -616,7 +616,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int route_monitor_disk (int rid, int yn, lo_message msg);
int strip_phase (int rid, int yn, lo_message msg);
int strip_expand (int rid, int yn, lo_message msg);
- int _strip_select (boost::shared_ptr<ARDOUR::Stripable> s, lo_address addr, bool quiet = false);
+ int _strip_select (boost::shared_ptr<ARDOUR::Stripable> s, lo_address addr);
int strip_gui_select (int rid, int yn, lo_message msg);
int route_set_gain_abs (int rid, float level, lo_message msg);
int route_set_gain_dB (int rid, float dB, lo_message msg);
diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc
index f5df73eaec..3db6e20f1d 100644
--- a/libs/surfaces/osc/osc_route_observer.cc
+++ b/libs/surfaces/osc/osc_route_observer.cc
@@ -47,9 +47,17 @@ OSCRouteObserver::OSCRouteObserver (OSC& o, uint32_t ss, ArdourSurface::OSC::OSC
,_last_gain (-1.0)
,_last_trim (-1.0)
,_init (true)
- ,_expand (false)
+ ,_expand (2048)
{
addr = lo_address_new_from_url (sur->remote_url.c_str());
+ gainmode = sur->gainmode;
+ feedback = sur->feedback;
+ in_line = feedback[2];
+ if (sur->expand_enable) {
+ set_expand (sur->expand);
+ } else {
+ set_expand (0);
+ }
refresh_strip (true);
}
@@ -83,9 +91,6 @@ OSCRouteObserver::refresh_strip (bool force)
if (_tick_busy) {
Glib::usleep(100); // let tick finish
}
- gainmode = sur->gainmode;
- feedback = sur->feedback;
- in_line = feedback[2];
_last_gain =-1.0;
_last_trim =-1.0;
uint32_t sid = sur->bank + ssid - 2;
@@ -124,21 +129,6 @@ OSCRouteObserver::refresh_strip (bool force)
}
}
- // this has to be done first because expand may change with no strip change
- bool new_expand;
- if (sur->expand_enable && sur->expand == ssid) {
- new_expand = true;
- } else {
- new_expand = false;
- }
- if (new_expand != _expand) {
- _expand = new_expand;
- if (_expand) {
- _osc.float_message_with_id ("/strip/expand", ssid, 1.0, in_line, addr);
- } else {
- _osc.float_message_with_id ("/strip/expand", ssid, 0.0, in_line, addr);
- }
- }
send_select_status (ARDOUR::Properties::selected);
boost::shared_ptr<ARDOUR::Stripable> new_strip = sur->strips[sur->bank + ssid - 2];
@@ -215,6 +205,19 @@ OSCRouteObserver::refresh_strip (bool force)
}
void
+OSCRouteObserver::set_expand (uint32_t expand)
+{
+ if (expand != _expand) {
+ _expand = expand;
+ if (expand == ssid) {
+ _osc.float_message_with_id ("/strip/expand", ssid, 1.0, in_line, addr);
+ } else {
+ _osc.float_message_with_id ("/strip/expand", ssid, 0.0, in_line, addr);
+ }
+ }
+}
+
+void
OSCRouteObserver::clear_strip ()
{
_init = true;
diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h
index 88a5f211fb..f51f722eee 100644
--- a/libs/surfaces/osc/osc_route_observer.h
+++ b/libs/surfaces/osc/osc_route_observer.h
@@ -45,6 +45,7 @@ class OSCRouteObserver
void tick (void);
void send_select_status (const PBD::PropertyChange&);
void refresh_strip (bool force);
+ void set_expand (uint32_t expand);
void clear_strip ();
private:
@@ -65,7 +66,7 @@ class OSCRouteObserver
float _last_gain;
float _last_trim;
bool _init;
- bool _expand;
+ uint32_t _expand;
bool in_line;
ARDOUR::AutoState as;
bool _tick_busy;
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
index c635792f31..ecfb7ae1f2 100644
--- a/libs/surfaces/osc/osc_select_observer.cc
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -59,6 +59,9 @@ OSCSelectObserver::OSCSelectObserver (OSC& o, ArdourSurface::OSC::OSCSurface* su
,eq_bands (0)
{
addr = lo_address_new_from_url (sur->remote_url.c_str());
+ gainmode = sur->gainmode;
+ feedback = sur->feedback;
+ in_line = feedback[2];
refresh_strip (true);
}
@@ -91,6 +94,9 @@ void
OSCSelectObserver::refresh_strip (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) {
@@ -113,9 +119,6 @@ OSCSelectObserver::refresh_strip (bool force)
_strip->DropReferences.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCSelectObserver::no_strip, this), OSC::instance());
as = ARDOUR::Off;
- gainmode = sur->gainmode;
- feedback = sur->feedback;
- in_line = feedback[2];
send_size = 0;
plug_size = 0;
_comp_redux = 1;
@@ -497,6 +500,7 @@ OSCSelectObserver::tick ()
if (_init) {
return;
}
+ _tick_busy = true;
if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
float now_meter;
if (_strip->peak_meter()) {
@@ -561,6 +565,7 @@ OSCSelectObserver::tick ()
send_timeout[i]--;
}
}
+ _tick_busy = false;
}
void
diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h
index 8ad7bf2a96..985066a129 100644
--- a/libs/surfaces/osc/osc_select_observer.h
+++ b/libs/surfaces/osc/osc_select_observer.h
@@ -79,6 +79,7 @@ class OSCSelectObserver
uint32_t nplug_params;
uint32_t plug_size;
int eq_bands;
+ bool _tick_busy;
void name_changed (const PBD::PropertyChange& what_changed);
void change_message (std::string path, boost::shared_ptr<PBD::Controllable> controllable);