summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2017-07-23 20:07:01 -0700
committerLen Ovens <len@ovenwerks.net>2017-07-23 20:08:02 -0700
commitf1632fcfd2eeed678da330f77bdabfc766ade826 (patch)
tree3b0092a50fec756384d474df4b303f8330635cb2
parent07e869fda8d92fed1a375f85f54f13a75c7d5493 (diff)
OSC: make sure initialization is complete before we allow periodic to run
-rw-r--r--libs/surfaces/osc/osc.cc21
-rw-r--r--libs/surfaces/osc/osc.h2
-rw-r--r--libs/surfaces/osc/osc_cue_observer.cc1
-rw-r--r--libs/surfaces/osc/osc_global_observer.cc16
-rw-r--r--libs/surfaces/osc/osc_global_observer.h5
-rw-r--r--libs/surfaces/osc/osc_route_observer.cc6
-rw-r--r--libs/surfaces/osc/osc_route_observer.h1
-rw-r--r--libs/surfaces/osc/osc_select_observer.cc8
-rw-r--r--libs/surfaces/osc/osc_select_observer.h1
9 files changed, 43 insertions, 18 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index bc96db636f..cc13c48eee 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -1596,7 +1596,7 @@ OSC::set_surface (uint32_t b_size, uint32_t strips, uint32_t fb, uint32_t gm, ui
// set bank and strip feedback
set_bank(s->bank, msg);
- global_feedback (s->feedback, get_address (msg), s->gainmode);
+ global_feedback (*s, get_address (msg));
sel_send_pagesize (se_size, msg);
sel_plug_pagesize (pi_size, msg);
return 0;
@@ -1640,7 +1640,7 @@ OSC::set_surface_feedback (uint32_t fb, lo_message msg)
set_bank(s->bank, msg);
// Set global/master feedback
- global_feedback (s->feedback, get_address (msg), s->gainmode);
+ global_feedback (*s, get_address (msg));
return 0;
}
@@ -1654,7 +1654,7 @@ OSC::set_surface_gainmode (uint32_t gm, lo_message msg)
set_bank(s->bank, msg);
// Set global/master feedback
- global_feedback (s->feedback, get_address (msg), s->gainmode);
+ global_feedback (*s, get_address (msg));
return 0;
}
@@ -1729,24 +1729,24 @@ OSC::get_surface (lo_address addr)
_set_bank(s.bank, addr);
// Set global/master feedback
- global_feedback (s.feedback, addr, s.gainmode);
+ global_feedback (s, addr);
return &_surface[_surface.size() - 1];
}
// setup global feedback for a surface
void
-OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode)
+OSC::global_feedback (OSCSurface sur, lo_address addr)
{
// first destroy global observer for this surface
GlobalObservers::iterator x;
for (x = global_observers.begin(); x != global_observers.end();) {
- OSCGlobalObserver* ro;
+ OSCGlobalObserver* go;
- if ((ro = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
+ if ((go = dynamic_cast<OSCGlobalObserver*>(*x)) != 0) {
- int res = strcmp(lo_address_get_url(ro->address()), lo_address_get_url(addr));
+ int res = strcmp(lo_address_get_url(go->address()), lo_address_get_url(addr));
if (res == 0) {
delete *x;
@@ -1758,9 +1758,10 @@ OSC::global_feedback (bitset<32> feedback, lo_address addr, uint32_t gainmode)
++x;
}
}
+ std::bitset<32> feedback = sur.feedback;
if (feedback[4] || feedback[3] || feedback[5] || feedback[6]) {
// create a new Global Observer for this surface
- OSCGlobalObserver* o = new OSCGlobalObserver (*session, addr, gainmode, /*s->*/feedback);
+ OSCGlobalObserver* o = new OSCGlobalObserver (*session, &sur);
global_observers.push_back (o);
}
}
@@ -4784,7 +4785,7 @@ OSC::periodic (void)
for (uint32_t it = 0; it < _surface.size(); it++) {
OSCSurface* sur = &_surface[it];
lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
- global_feedback (sur->feedback, addr, sur->gainmode);
+ global_feedback (*sur, addr);
}
global_init = false;
tick = true;
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 99e8130544..20a7b96632 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -240,7 +240,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int check_surface (lo_message msg);
uint32_t get_sid (boost::shared_ptr<ARDOUR::Stripable> strip, lo_address addr);
boost::shared_ptr<ARDOUR::Stripable> get_strip (uint32_t ssid, lo_address addr);
- void global_feedback (std::bitset<32> feedback, lo_address addr, uint32_t gainmode);
+ void global_feedback (OSCSurface sur, lo_address addr);
void send_current_value (const char* path, lo_arg** argv, int argc, lo_message msg);
void current_value_query (const char* path, size_t len, lo_arg **argv, int argc, lo_message msg);
diff --git a/libs/surfaces/osc/osc_cue_observer.cc b/libs/surfaces/osc/osc_cue_observer.cc
index d36fdaf3a9..11d62073cf 100644
--- a/libs/surfaces/osc/osc_cue_observer.cc
+++ b/libs/surfaces/osc/osc_cue_observer.cc
@@ -60,6 +60,7 @@ OSCCueObserver::OSCCueObserver (boost::shared_ptr<Stripable> s, std::vector<boos
OSCCueObserver::~OSCCueObserver ()
{
+ tick_enable = false;
strip_connections.drop_connections ();
send_end ();
diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc
index aa890e987f..a76463d467 100644
--- a/libs/surfaces/osc/osc_global_observer.cc
+++ b/libs/surfaces/osc/osc_global_observer.cc
@@ -36,12 +36,15 @@ using namespace PBD;
using namespace ARDOUR;
using namespace ArdourSurface;
-OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std::bitset<32> fb)
- : gainmode (gm)
- ,feedback (fb)
+OSCGlobalObserver::OSCGlobalObserver (Session& s, ArdourSurface::OSC::OSCSurface* su)
+ : sur (su)
+ ,_init (true)
{
- addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+ addr = lo_address_new_from_url (sur->remote_url.c_str());
+ //addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
session = &s;
+ gainmode = sur->gainmode;
+ feedback = sur->feedback;
_last_frame = -1;
if (feedback[4]) {
@@ -117,10 +120,12 @@ OSCGlobalObserver::OSCGlobalObserver (Session& s, lo_address a, uint32_t gm, std
* Maybe (many) more
*/
}
+ _init = false;
}
OSCGlobalObserver::~OSCGlobalObserver ()
{
+ _init = true;
// need to add general zero everything messages
strip_connections.drop_connections ();
@@ -132,6 +137,9 @@ OSCGlobalObserver::~OSCGlobalObserver ()
void
OSCGlobalObserver::tick ()
{
+ if (_init) {
+ return;
+ }
framepos_t now_frame = session->transport_frame();
if (now_frame != _last_frame) {
if (feedback[6]) { // timecode enabled
diff --git a/libs/surfaces/osc/osc_global_observer.h b/libs/surfaces/osc/osc_global_observer.h
index 9e0bef450a..9c4e0d6ddc 100644
--- a/libs/surfaces/osc/osc_global_observer.h
+++ b/libs/surfaces/osc/osc_global_observer.h
@@ -33,7 +33,7 @@ class OSCGlobalObserver
{
public:
- OSCGlobalObserver (ARDOUR::Session& s, lo_address addr, uint32_t gainmode, std::bitset<32> feedback);
+ OSCGlobalObserver (ARDOUR::Session& s, ArdourSurface::OSC::OSCSurface* su);
~OSCGlobalObserver ();
lo_address address() const { return addr; };
@@ -49,7 +49,8 @@ class OSCGlobalObserver
Monitor,
};
-
+ ArdourSurface::OSC::OSCSurface* sur;
+ bool _init;
lo_address addr;
std::string path;
uint32_t gainmode;
diff --git a/libs/surfaces/osc/osc_route_observer.cc b/libs/surfaces/osc/osc_route_observer.cc
index bf1ec24953..506ad8aea6 100644
--- a/libs/surfaces/osc/osc_route_observer.cc
+++ b/libs/surfaces/osc/osc_route_observer.cc
@@ -43,6 +43,7 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, uint32_t ss,
,ssid (ss)
,sur (su)
,_last_gain (0.0)
+ ,_init (true)
{
addr = lo_address_new_from_url (sur->remote_url.c_str());
gainmode = sur->gainmode;
@@ -109,11 +110,13 @@ OSCRouteObserver::OSCRouteObserver (boost::shared_ptr<Stripable> s, uint32_t ss,
send_change_message ("/strip/pan_stereo_position", _strip->pan_azimuth_control());
}
}
+ _init = false;
tick();
}
OSCRouteObserver::~OSCRouteObserver ()
{
+ _init = true;
strip_connections.drop_connections ();
if (sur->no_clear) {
@@ -163,6 +166,9 @@ OSCRouteObserver::~OSCRouteObserver ()
void
OSCRouteObserver::tick ()
{
+ if (_init) {
+ return;
+ }
if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
// the only meter here is master
float now_meter;
diff --git a/libs/surfaces/osc/osc_route_observer.h b/libs/surfaces/osc/osc_route_observer.h
index a8e6828112..acf4a8744b 100644
--- a/libs/surfaces/osc/osc_route_observer.h
+++ b/libs/surfaces/osc/osc_route_observer.h
@@ -59,6 +59,7 @@ class OSCRouteObserver
uint32_t gain_timeout;
uint32_t trim_timeout;
float _last_gain;
+ bool _init;
ARDOUR::AutoState as;
diff --git a/libs/surfaces/osc/osc_select_observer.cc b/libs/surfaces/osc/osc_select_observer.cc
index dfc1a80319..092da95a5a 100644
--- a/libs/surfaces/osc/osc_select_observer.cc
+++ b/libs/surfaces/osc/osc_select_observer.cc
@@ -54,8 +54,9 @@ OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address
,sur (su)
,nsends (0)
,_last_gain (0.0)
+ ,_init (true)
{
- addr = lo_address_new (lo_address_get_hostname(a) , lo_address_get_port(a));
+ addr = lo_address_new_from_url (sur->remote_url.c_str());
gainmode = sur->gainmode;
feedback = sur->feedback;
as = ARDOUR::Off;
@@ -173,12 +174,14 @@ OSCSelectObserver::OSCSelectObserver (boost::shared_ptr<Stripable> s, lo_address
change_message ("/select/comp_makeup", _strip->comp_makeup_controllable());
}
+ _init = false;
tick();
}
OSCSelectObserver::~OSCSelectObserver ()
{
+ _init = true;
strip_connections.drop_connections ();
// all strip buttons should be off and faders 0 and etc.
send_float ("/select/expand", 0);
@@ -427,6 +430,9 @@ OSCSelectObserver::plugin_end ()
void
OSCSelectObserver::tick ()
{
+ if (_init) {
+ return;
+ }
if (feedback[7] || feedback[8] || feedback[9]) { // meters enabled
float now_meter;
if (_strip->peak_meter()) {
diff --git a/libs/surfaces/osc/osc_select_observer.h b/libs/surfaces/osc/osc_select_observer.h
index ea5ab5aeed..71640fd106 100644
--- a/libs/surfaces/osc/osc_select_observer.h
+++ b/libs/surfaces/osc/osc_select_observer.h
@@ -66,6 +66,7 @@ class OSCSelectObserver
float _last_meter;
uint32_t nsends;
float _last_gain;
+ bool _init;
float _comp_redux;
ARDOUR::AutoState as;
uint32_t send_size;