OSC: Feedback was not making it to surface

This commit is contained in:
Len Ovens 2018-04-17 13:10:59 -07:00
parent 5ce341c127
commit 2fa49c51b2
5 changed files with 66 additions and 46 deletions

View file

@ -1737,6 +1737,7 @@ OSC::surface_parse (const char *path, const char* types, lo_arg **argv, int argc
int se_page = sur->send_page_size;
int fadermode = sur->gainmode;
int feedback = sur->feedback.to_ulong();
sur->feedback = 0;
int strip_types = sur->strip_types.to_ulong();
int bank_size = sur->bank_size;
int linkset = sur->linkset;
@ -2129,7 +2130,9 @@ OSC::set_surface_port (uint32_t po, lo_message msg)
it++;
}
}
refresh_surface (msg);
if (sur->feedback.to_ulong()) {
refresh_surface (msg);
}
return 0;
}
}
@ -2215,7 +2218,9 @@ void
OSC::global_feedback (OSCSurface* sur)
{
OSCGlobalObserver* o = sur->global_obs;
delete o;
if (o) {
delete o;
}
if (sur->feedback[4] || sur->feedback[3] || sur->feedback[5] || sur->feedback[6]) {
// create a new Global Observer for this surface
@ -2850,7 +2855,6 @@ OSC::_sel_bus_only (lo_address addr)
{
OSCSurface *sur = get_surface(addr);
boost::shared_ptr<Stripable> s = sur->select;
std::cout << string_compose ("bus_only for: %1\n", s->name());
if (s) {
boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s);
if (rt) {
@ -4482,7 +4486,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
_select = s;
}
if (s != old_sel) {
std::cout << string_compose ("new Select: %1\n", s->name());
sur->select = s;
/*
@ -4507,7 +4510,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
OSCSelectObserver* so = dynamic_cast<OSCSelectObserver*>(sur->sel_obs);
if (sur->feedback[13]) {
if (so != 0) {
std::cout << string_compose ("refreshing select: %1\n", s->name());
so->refresh_strip (s, nsends, sur->gainmode, true);
} else {
OSCSelectObserver* sel_fb = new OSCSelectObserver (*this, *session, sur);
@ -4531,7 +4533,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
}
}
if (s != old_sel) {
std::cout << string_compose ("new Select2: %1\n", s->name());
sur->select = s;
if (sur->temp_mode == GroupOnly) {
boost::shared_ptr<Route> ort = boost::dynamic_pointer_cast<Route> (old_sel);
@ -4577,7 +4578,6 @@ OSC::_strip_select (boost::shared_ptr<Stripable> s, lo_address addr)
_set_bank (1, addr);
}
} else if (sur->temp_mode == BusOnly) {
std::cout << string_compose ("bus only select: %1\n", s->name());
boost::shared_ptr<Route> rt = boost::dynamic_pointer_cast<Route> (s);
if (rt) {
if (!rt->is_track () && rt->can_solo ()) {
@ -4705,9 +4705,7 @@ OSC::sel_delta (int delta, lo_message msg)
boost::weak_ptr<Stripable> o_sel = sur->select;
boost::shared_ptr<Stripable> old_sel= o_sel.lock ();
for (uint32_t i = 0; i < nstps; i++) {
std::cout << string_compose ("try strip %1 - %2\n", i, sel_strips[i]->name());
if (old_sel == sel_strips[i]) {
std::cout << string_compose ("got strip %1 - %2\n", i, sel_strips[i]->name());
if (i && delta < 0) {
new_sel = sel_strips[i - 1];
} else if ((i + 1) < nstps && delta > 0) {
@ -4720,7 +4718,6 @@ OSC::sel_delta (int delta, lo_message msg)
// should not happen
return -1;
}
std::cout << string_compose ("New strip %1\n",new_sel->name());
}
}
if (!new_sel) {
@ -6577,13 +6574,16 @@ OSC::cue_send_enable (uint32_t id, float state, lo_message msg)
int
OSC::float_message (string path, float val, lo_address addr)
{
_lo_lock.lock ();
lo_message reply;
reply = lo_message_new ();
lo_message_add_float (reply, (float) val);
lo_send_message (addr, path.c_str(), reply);
Glib::usleep(1);
lo_message_free (reply);
_lo_lock.unlock ();
return 0;
}
@ -6591,6 +6591,7 @@ OSC::float_message (string path, float val, lo_address addr)
int
OSC::float_message_with_id (std::string path, uint32_t ssid, float value, bool in_line, lo_address addr)
{
_lo_lock.lock ();
lo_message msg = lo_message_new ();
if (in_line) {
path = string_compose ("%1/%2", path, ssid);
@ -6600,20 +6601,25 @@ OSC::float_message_with_id (std::string path, uint32_t ssid, float value, bool i
lo_message_add_float (msg, value);
lo_send_message (addr, path.c_str(), msg);
Glib::usleep(1);
lo_message_free (msg);
_lo_lock.unlock ();
return 0;
}
int
OSC::int_message (string path, int val, lo_address addr)
{
_lo_lock.lock ();
lo_message reply;
reply = lo_message_new ();
lo_message_add_int32 (reply, (float) val);
lo_send_message (addr, path.c_str(), reply);
Glib::usleep(1);
lo_message_free (reply);
_lo_lock.unlock ();
return 0;
}
@ -6621,6 +6627,7 @@ OSC::int_message (string path, int val, lo_address addr)
int
OSC::int_message_with_id (std::string path, uint32_t ssid, int value, bool in_line, lo_address addr)
{
_lo_lock.lock ();
lo_message msg = lo_message_new ();
if (in_line) {
path = string_compose ("%1/%2", path, ssid);
@ -6630,20 +6637,25 @@ OSC::int_message_with_id (std::string path, uint32_t ssid, int value, bool in_li
lo_message_add_int32 (msg, value);
lo_send_message (addr, path.c_str(), msg);
Glib::usleep(1);
lo_message_free (msg);
_lo_lock.unlock ();
return 0;
}
int
OSC::text_message (string path, string val, lo_address addr)
{
_lo_lock.lock ();
lo_message reply;
reply = lo_message_new ();
lo_message_add_string (reply, val.c_str());
lo_send_message (addr, path.c_str(), reply);
Glib::usleep(1);
lo_message_free (reply);
_lo_lock.unlock ();
return 0;
}
@ -6651,6 +6663,7 @@ OSC::text_message (string path, string val, lo_address addr)
int
OSC::text_message_with_id (std::string path, uint32_t ssid, std::string val, bool in_line, lo_address addr)
{
_lo_lock.lock ();
lo_message msg = lo_message_new ();
if (in_line) {
path = string_compose ("%1/%2", path, ssid);
@ -6661,7 +6674,9 @@ OSC::text_message_with_id (std::string path, uint32_t ssid, std::string val, boo
lo_message_add_string (msg, val.c_str());
lo_send_message (addr, path.c_str(), msg);
Glib::usleep(1);
lo_message_free (msg);
_lo_lock.unlock ();
return 0;
}

View file

@ -88,7 +88,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
bool get_active () const;
// generic osc send
Glib::Threads::Mutex _lo_lock;
int float_message (std::string, float value, lo_address addr);
int int_message (std::string, int value, lo_address addr);
int text_message (std::string path, std::string val, lo_address addr);

View file

@ -41,9 +41,9 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
: _osc (o)
,sur (su)
,_init (true)
,_last_master_gain (0.0)
,_last_master_trim (0.0)
,_last_monitor_gain (0.0)
,_last_master_gain (-1.0)
,_last_master_trim (-1.0)
,_last_monitor_gain (-1.0)
,_jog_mode (1024)
,last_punchin (4)
,last_punchout (4)
@ -55,6 +55,7 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
feedback = sur->feedback;
uint32_t jogmode = sur->jogmode;
_last_sample = -1;
mark_text = "";
if (feedback[4]) {
// connect to all the things we want to send feed back from
@ -70,21 +71,21 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
boost::shared_ptr<Controllable> mute_controllable = boost::dynamic_pointer_cast<Controllable>(strip->mute_control());
mute_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_change_message, this, X_("/master/mute"), strip->mute_control()), OSC::instance());
send_change_message (X_("/master/mute"), strip->mute_control());
send_change_message (X_("/master/mute"), mute_controllable);
boost::shared_ptr<Controllable> trim_controllable = boost::dynamic_pointer_cast<Controllable>(strip->trim_control());
trim_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_trim_message, this, X_("/master/trimdB"), strip->trim_control()), OSC::instance());
send_trim_message (X_("/master/trimdB"), strip->trim_control());
send_trim_message (X_("/master/trimdB"), trim_controllable);
boost::shared_ptr<Controllable> pan_controllable = boost::dynamic_pointer_cast<Controllable>(strip->pan_azimuth_control());
if (pan_controllable) {
pan_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_change_message, this, X_("/master/pan_stereo_position"), strip->pan_azimuth_control()), OSC::instance());
send_change_message (X_("/master/pan_stereo_position"), strip->pan_azimuth_control());
send_change_message (X_("/master/pan_stereo_position"), pan_controllable);
}
boost::shared_ptr<Controllable> gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/master/"), strip->gain_control()), OSC::instance());
send_gain_message (X_("/master/"), strip->gain_control());
send_gain_message (X_("/master/"), gain_controllable);
// monitor stuff next
strip = session->monitor_out();
@ -104,8 +105,8 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
send_change_message (X_("/monitor/mono"), mon_mono_cont);
gain_controllable = boost::dynamic_pointer_cast<Controllable>(strip->gain_control());
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/"), strip->gain_control()), OSC::instance());
send_gain_message (X_("/monitor/"), strip->gain_control());
gain_controllable->Changed.connect (strip_connections, MISSING_INVALIDATOR, boost::bind (&OSCGlobalObserver::send_gain_message, this, X_("/monitor/"), strip->gain_control()), OSC::instance());
send_gain_message (X_("/monitor/"), gain_controllable);
}
//Transport feedback
@ -361,6 +362,7 @@ void
OSCGlobalObserver::send_gain_message (string path, boost::shared_ptr<Controllable> controllable)
{
bool ismaster = false;
if (path.find(X_("master")) != std::string::npos) {
ismaster = true;
if (_last_master_gain != controllable->get_value()) {
@ -443,34 +445,36 @@ OSCGlobalObserver::marks_changed ()
void
OSCGlobalObserver::mark_update ()
{
if (!lm.size()) {
_osc.text_message (X_("/marker"), "No Marks", addr);
return;
}
uint32_t prev = 0;
uint32_t next = lm.size() - 1;
for (uint32_t i = 0; i < lm.size (); i++) {
if ((lm[i].when <= _last_sample) && (i > prev)) {
prev = i;
string send_str = "No Marks";
if (lm.size()) {
uint32_t prev = 0;
uint32_t next = lm.size() - 1;
for (uint32_t i = 0; i < lm.size (); i++) {
if ((lm[i].when <= _last_sample) && (i > prev)) {
prev = i;
}
if ((lm[i].when >= _last_sample) && (i < next)) {
next = i;
break;
}
}
if ((lm[i].when >= _last_sample) && (i < next)) {
next = i;
break;
if ((prev_mark != lm[prev].when) || (next_mark != lm[next].when)) {
string send_str = lm[prev].label;
prev_mark = lm[prev].when;
next_mark = lm[next].when;
if (prev != next) {
send_str = string_compose ("%1 <-> %2", lm[prev].label, lm[next].label);
}
if (_last_sample > lm[lm.size() - 1].when) {
send_str = string_compose ("%1 <-", lm[lm.size() - 1].label);
}
if (_last_sample < lm[0].when) {
send_str = string_compose ("-> %1", lm[0].label);
}
}
}
if ((prev_mark != lm[prev].when) || (next_mark != lm[next].when)) {
string send_str = lm[prev].label;
prev_mark = lm[prev].when;
next_mark = lm[next].when;
if (prev != next) {
send_str = string_compose ("%1 <-> %2", lm[prev].label, lm[next].label);
}
if (_last_sample > lm[lm.size() - 1].when) {
send_str = string_compose ("%1 <-", lm[lm.size() - 1].label);
}
if (_last_sample < lm[0].when) {
send_str = string_compose ("-> %1", lm[0].label);
}
if (send_str != mark_text) {
mark_text = send_str;
_osc.text_message (X_("/marker"), send_str, addr);
}

View file

@ -59,6 +59,7 @@ class OSCGlobalObserver
float _last_monitor_gain;
lo_address addr;
std::string path;
std::string mark_text;
uint32_t gainmode;
std::bitset<32> feedback;
ARDOUR::Session* session;

View file

@ -107,7 +107,7 @@ OSCRouteObserver::no_strip ()
* that does not exist... Crash
*/
}
void
OSCRouteObserver::refresh_strip (boost::shared_ptr<ARDOUR::Stripable> new_strip, bool force)
{