summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2016-06-06 23:40:35 -0700
committerLen Ovens <len@ovenwerks.net>2016-06-06 23:40:35 -0700
commitd511d62f65ce3d60f72a903886f3d126d960c04a (patch)
tree4231c5d1eedeefc065411195e449f5284f7fa976 /libs
parent0318b4f3ac267493145718b772a3d8e7bcf20e06 (diff)
OSC: reset select strip on bank change or select for non-existing stripable.
Fixes crash when selecting unused strip and then changing bank.
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/osc/osc.cc94
1 files changed, 70 insertions, 24 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index 31e0bf2628..f924788a40 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -503,6 +503,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/bank_up", "f", bank_up);
REGISTER_CALLBACK (serv, "/bank_down", "", bank_down);
REGISTER_CALLBACK (serv, "/bank_down", "f", bank_down);
+
+ // controls for "special" strips
REGISTER_CALLBACK (serv, "/master/gain", "f", master_set_gain);
REGISTER_CALLBACK (serv, "/master/fader", "i", master_set_fader);
REGISTER_CALLBACK (serv, "/master/mute", "i", master_set_mute);
@@ -510,6 +512,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/master/pan_stereo_position", "f", master_set_pan_stereo_position);
REGISTER_CALLBACK (serv, "/monitor/gain", "f", monitor_set_gain);
REGISTER_CALLBACK (serv, "/monitor/fader", "i", monitor_set_fader);
+
+ // Controls for the Selected strip
REGISTER_CALLBACK (serv, "/select/recenable", "i", sel_recenable);
REGISTER_CALLBACK (serv, "/select/record_safe", "i", sel_recsafe);
REGISTER_CALLBACK (serv, "/select/mute", "i", sel_mute);
@@ -1180,6 +1184,8 @@ OSC::get_surface (lo_address addr)
s.strip_types = 31; // 31 is tracks, busses, and VCAs (no master/monitor)
s.feedback = 0;
s.gainmode = 0;
+ s.sel_obs = 0;
+ s.surface_sel = 0;
//get sorted should go here
_surface.push_back (s);
//MARK
@@ -1248,6 +1254,8 @@ OSC::set_bank (uint32_t bank_start, lo_message msg)
} else {
nstrips = session->nroutes() - 1;
}
+ // reset local select
+ _strip_select (0, lo_message_get_source (msg));
// undo all listeners for this url
for (int n = 0; n <= (int) nstrips; ++n) {
@@ -1287,6 +1295,7 @@ OSC::set_bank (uint32_t bank_start, lo_message msg)
listen_to_route(stp, lo_message_get_source (msg));
}
}
+ // put in check for GUI_selects here.
}
return 0;
}
@@ -1504,7 +1513,11 @@ int
OSC::sel_mute (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_mute(sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_mute(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("mute", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -1526,14 +1539,22 @@ int
OSC::sel_solo (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_solo (sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_solo(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("solo", 0, 0, lo_message_get_source (msg));
+ }
}
int
OSC::sel_recenable (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_recenable(sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_recenable(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("recenable", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -1560,7 +1581,11 @@ int
OSC::sel_recsafe (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_recsafe(sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_recsafe(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("record_safe", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -1597,7 +1622,6 @@ OSC::route_monitor_input (int ssid, int yn, lo_message msg)
} else {
route_send_fail ("monitor_input", ssid, 0, lo_message_get_source (msg));
}
-
}
return 0;
@@ -1607,7 +1631,11 @@ int
OSC::sel_monitor_input (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_monitor_input(sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_monitor_input(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("monitor_input", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -1625,7 +1653,6 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
} else {
route_send_fail ("monitor_disk", ssid, 0, lo_message_get_source (msg));
}
-
}
return 0;
@@ -1635,7 +1662,11 @@ int
OSC::sel_monitor_disk (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_monitor_disk(sur->surface_sel, yn, msg);
+ if (sur->surface_sel) {
+ return route_monitor_disk(sur->surface_sel, yn, msg);
+ } else {
+ return route_send_fail ("monitor_disk", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -1657,7 +1688,11 @@ OSC::_strip_select (int ssid, lo_address addr)
int rid = get_rid (ssid, addr);
boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
OSCSurface *sur = get_surface(addr);
- delete sur->sel_obs;
+ if (sur->sel_obs) {
+ delete sur->sel_obs;
+ sur->sel_obs = 0;
+ }
+ sur->surface_sel = 0;
if (s) {
sur->surface_sel = ssid;
@@ -1671,7 +1706,7 @@ OSC::_strip_select (int ssid, lo_address addr)
b_s = sur->nstrips;
}
for (int i = 1; i <= b_s; i++) {
- if (i==ssid) {
+ if (i==(int)sur->surface_sel) {
string path = "/strip/select";
lo_message reply = lo_message_new ();
if (sur->feedback[2]) {
@@ -1749,7 +1784,7 @@ OSC::route_set_gain_dB (int ssid, float dB, lo_message msg)
ret = route_set_gain_abs (rid, dB_to_coefficient (dB), msg);
}
if (ret != 0) {
- route_send_fail ("gain", ssid, 0, lo_message_get_source (msg));
+ route_send_fail ("gain", ssid, -193, lo_message_get_source (msg));
}
return ret;
}
@@ -1758,7 +1793,11 @@ int
OSC::sel_gain (float val, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_set_gain_dB(sur->surface_sel, val, msg);
+ if (sur->surface_sel) {
+ return route_set_gain_dB(sur->surface_sel, val, msg);
+ } else {
+ return route_send_fail ("gain", 0, -193, lo_message_get_source (msg));
+ }
}
int
@@ -1785,7 +1824,11 @@ int
OSC::sel_fader (float val, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
- return route_set_gain_fader(sur->surface_sel, val, msg);
+ if (sur->surface_sel) {
+ return route_set_gain_fader(sur->surface_sel, val, msg);
+ } else {
+ return route_send_fail ("fader", 0, 0, lo_message_get_source (msg));
+ }
}
int
@@ -2050,18 +2093,21 @@ OSC::route_send_fail (string path, uint32_t ssid, float val, lo_address addr)
OSCSurface *sur = get_surface(addr);
ostringstream os;
- lo_message reply = lo_message_new ();
- if (sur->feedback[2]) {
- os << "/strip/" << path << "/" << ssid;
- } else {
- os << "/strip/" << path;
- lo_message_add_int32 (reply, ssid);
- }
- string str_pth = os.str();
- lo_message_add_float (reply, (float) val);
+ lo_message reply;
+ if (ssid) {
+ reply = lo_message_new ();
+ if (sur->feedback[2]) {
+ os << "/strip/" << path << "/" << ssid;
+ } else {
+ os << "/strip/" << path;
+ lo_message_add_int32 (reply, ssid);
+ }
+ string str_pth = os.str();
+ lo_message_add_float (reply, (float) val);
- lo_send_message (addr, str_pth.c_str(), reply);
- lo_message_free (reply);
+ lo_send_message (addr, str_pth.c_str(), reply);
+ lo_message_free (reply);
+ }
if (sur->surface_sel == ssid) {
os.str("");
os << "/select/" << path;