summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2016-06-05 22:30:14 -0700
committerLen Ovens <len@ovenwerks.net>2016-06-05 22:30:14 -0700
commitcce4726c4cd2a417a646cacbe2bedb580f7a5dbc (patch)
tree1339a3f183c09c65305397f9a2fe16c2db148f6f /libs
parentf0f2e3bb713287a3e170ff6e9c8feb5b1b2188ca (diff)
OSC: More controls in /select/*, off by one fixed
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/osc/osc.cc141
-rw-r--r--libs/surfaces/osc/osc.h14
2 files changed, 124 insertions, 31 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index f7772ab29b..6a5d4d3cd1 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -243,6 +243,8 @@ OSC::start ()
periodic_connection = periodic_timeout->connect (sigc::mem_fun (*this, &OSC::periodic));
periodic_timeout->attach (main_loop()->get_context());
+ //StripableSelectionChanged.connect (gui_connections, MISSING_INVALIDATOR, boost::bind (&OSC::gui_selection_changed, this, _1), this);
+
return 0;
}
@@ -509,7 +511,12 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/monitor/fader", "i", monitor_set_fader);
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);
+ REGISTER_CALLBACK (serv, "/select/solo", "i", sel_solo);
+ REGISTER_CALLBACK (serv, "/select/monitor_input", "i", sel_monitor_input);
+ REGISTER_CALLBACK (serv, "/select/monitor_disk", "i", sel_monitor_disk);
+ REGISTER_CALLBACK (serv, "/select/gain", "f", sel_gain);
+ REGISTER_CALLBACK (serv, "/select/fader", "f", sel_fader);
/* These commands require the route index in addition to the arg; TouchOSC (et al) can't use these */
REGISTER_CALLBACK (serv, "/strip/mute", "ii", route_mute);
@@ -613,9 +620,9 @@ OSC::listen_to_route (boost::shared_ptr<Stripable> strip, lo_address addr)
}
OSCSurface *s = get_surface(addr);
- uint32_t sid = get_sid (strip->presentation_info().order(), addr);
+ uint32_t sid = get_sid (strip->presentation_info().order() + 1, addr);
// above is zero based add 1
- OSCRouteObserver* o = new OSCRouteObserver (strip, addr, sid + 1, s->gainmode, s->feedback);
+ OSCRouteObserver* o = new OSCRouteObserver (strip, addr, sid, s->gainmode, s->feedback);
route_observers.push_back (o);
strip->DropReferences.connect (*this, MISSING_INVALIDATOR, boost::bind (&OSC::drop_route, this, boost::weak_ptr<Stripable> (strip)), this);
@@ -1241,7 +1248,7 @@ OSC::set_bank (uint32_t bank_start, lo_message msg)
nstrips = session->nroutes() - 1;
}
// undo all listeners for this url
- for (int n = 1; n <= (int) nstrips; ++n) {
+ for (int n = 0; n <= (int) nstrips; ++n) {
boost::shared_ptr<Stripable> stp = session->get_remote_nth_stripable (n, PresentationInfo::Route);
@@ -1273,7 +1280,7 @@ OSC::set_bank (uint32_t bank_start, lo_message msg)
if (s->feedback[0] || s->feedback[1]) {
for (int n = bank_start; n < (int) (b_size + bank_start); ++n) {
// this next will eventually include strip types
- boost::shared_ptr<Stripable> stp = session->get_remote_nth_stripable (n, PresentationInfo::Route);
+ boost::shared_ptr<Stripable> stp = session->get_remote_nth_stripable (n - 1, PresentationInfo::Route);
if (stp) {
listen_to_route(stp, lo_message_get_source (msg));
@@ -1317,10 +1324,10 @@ OSC::get_sid (uint32_t rid, lo_address addr)
}
uint32_t
-OSC::get_rid (uint32_t sid, lo_address addr)
+OSC::get_rid (uint32_t ssid, lo_address addr)
{
OSCSurface *s = get_surface(addr);
- return sid + s->bank - 1;
+ return ssid + s->bank - 2;
}
void
@@ -1493,6 +1500,13 @@ OSC::route_mute (int ssid, int yn, lo_message msg)
}
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);
+}
+
+int
OSC::route_solo (int ssid, int yn, lo_message msg)
{
if (!session) return -1;
@@ -1508,6 +1522,13 @@ OSC::route_solo (int ssid, int yn, lo_message msg)
}
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);
+}
+
+int
OSC::sel_recenable (uint32_t yn, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
@@ -1531,7 +1552,7 @@ OSC::route_recenable (int ssid, int yn, lo_message msg)
}
}
// hmm, not set for whatever reason tell surface
- return route_send_fail ("/strip/recenable", ssid, msg);
+ return route_send_fail ("recenable", ssid, 0, msg);
}
int
@@ -1557,7 +1578,7 @@ OSC::route_recsafe (int ssid, int yn, lo_message msg)
}
}
// hmm, not set for whatever reason tell surface
- return route_send_fail ("/strip/record_safe", ssid, msg);
+ return route_send_fail ("record_safe", ssid, 0, msg);
}
int
@@ -1573,7 +1594,7 @@ OSC::route_monitor_input (int ssid, int yn, lo_message msg)
if (track) {
track->monitoring_control()->set_value (yn ? 1.0 : 0.0, PBD::Controllable::NoGroup);
} else {
- route_send_fail ("/strip/monitor_input", ssid, msg);
+ route_send_fail ("monitor_input", ssid, 0, msg);
}
}
@@ -1582,6 +1603,13 @@ OSC::route_monitor_input (int ssid, int yn, lo_message msg)
}
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);
+}
+
+int
OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
{
if (!session) return -1;
@@ -1594,7 +1622,7 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
if (track) {
track->monitoring_control()->set_value (yn ? 2.0 : 0.0, PBD::Controllable::NoGroup);
} else {
- route_send_fail ("/strip/monitor_disk", ssid, msg);
+ route_send_fail ("monitor_disk", ssid, 0, msg);
}
}
@@ -1603,13 +1631,20 @@ OSC::route_monitor_disk (int ssid, int yn, lo_message msg)
}
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);
+}
+
+int
OSC::strip_select (int ssid, int yn, lo_message msg)
{
//ignore button release
if (!yn) return 0;
if (!session) {
- route_send_fail ("/strip/select", ssid, msg);
+ route_send_fail ("select", ssid, 0, msg);
return -1;
}
int rid = get_rid (ssid, lo_message_get_source (msg));
@@ -1622,7 +1657,7 @@ OSC::strip_select (int ssid, int yn, lo_message msg)
OSCSelectObserver* sel_fb = new OSCSelectObserver (s, lo_message_get_source (msg), ssid, sur->gainmode, sur->feedback);
sur->sel_obs = sel_fb;
} else {
- route_send_fail ("/strip/select", ssid, msg);
+ route_send_fail ("select", ssid, 0 , msg);
}
int b_s = sur->bank_size;
if (!b_s) { // bank size 0 means we need to know how many strips there are.
@@ -1644,7 +1679,7 @@ OSC::strip_select (int ssid, int yn, lo_message msg)
lo_send_message (lo_message_get_source (msg), path.c_str(), reply);
lo_message_free (reply);
} else {
- route_send_fail ("/strip/select", i, msg);
+ route_send_fail ("select", i, 0, msg);
}
}
@@ -1658,17 +1693,22 @@ OSC::strip_gui_select (int ssid, int yn, lo_message msg)
if (!yn) return 0;
if (!session) {
- route_send_fail ("/strip/gui_select", ssid, msg);
+ route_send_fail ("gui_select", ssid, 0, msg);
return -1;
}
+ int ret = strip_select (ssid, yn, msg);
+ if (ret != 0) {
+ return ret;
+ }
int rid = get_rid (ssid, lo_message_get_source (msg));
boost::shared_ptr<Stripable> s = session->get_remote_nth_stripable (rid, PresentationInfo::Route);
- OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ //OSCSurface *sur = get_surface(lo_message_get_source (msg));
if (s) {
- sur->surface_sel = ssid;
+ //s->set_select();
+ //sur->surface_sel = ssid;
} else {
- route_send_fail ("/strip/gui_select", ssid, msg);
+ route_send_fail ("gui_select", ssid, 0, msg);
}
return 0;
@@ -1690,26 +1730,56 @@ OSC::route_set_gain_abs (int rid, float level, lo_message msg)
int
OSC::route_set_gain_dB (int ssid, float dB, lo_message msg)
{
- if (!session) return -1;
+ if (!session) {
+ route_send_fail ("gain", ssid, -193, msg);
+ return -1;
+ }
+ int ret;
int rid = get_rid (ssid, lo_message_get_source (msg));
if (dB < -192) {
- return route_set_gain_abs (rid, 0.0, msg);
+ ret = route_set_gain_abs (rid, 0.0, msg);
+ } else {
+ ret = route_set_gain_abs (rid, dB_to_coefficient (dB), msg);
+ }
+ if (ret != 0) {
+ route_send_fail ("gain", ssid, 0, msg);
}
- return route_set_gain_abs (rid, dB_to_coefficient (dB), msg);
+ return ret;
+}
+
+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);
}
int
OSC::route_set_gain_fader (int ssid, float pos, lo_message msg)
{
- if (!session) return -1;
+ if (!session) {
+ route_send_fail ("fader", ssid, 0, msg);
+ return -1;
+ }
+ int ret;
int rid = get_rid (ssid, lo_message_get_source (msg));
if ((pos > 799.5) && (pos < 800.5)) {
- return route_set_gain_abs (rid, 1.0, msg);
+ ret = route_set_gain_abs (rid, 1.0, msg);
} else {
- return route_set_gain_abs (rid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
+ ret = route_set_gain_abs (rid, slider_position_to_gain_with_max ((pos/1023), 2.0), msg);
}
+ if (ret != 0) {
+ route_send_fail ("fader", ssid, 0, msg);
+ }
+ return ret;
}
+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);
+}
int
OSC::route_set_trim_abs (int ssid, float level, lo_message msg)
@@ -1945,22 +2015,33 @@ OSC::periodic (void)
}
int
-OSC::route_send_fail (string path, uint32_t ssid, lo_message msg)
+OSC::route_send_fail (string path, uint32_t ssid, float val, lo_message msg)
{
OSCSurface *sur = get_surface(lo_message_get_source (msg));
+ ostringstream os;
lo_message reply = lo_message_new ();
if (sur->feedback[2]) {
- ostringstream os;
- os << path << "/" << ssid;
- path = os.str();
+ os << "/strip/" << path << "/" << ssid;
} else {
+ os << "/strip/" << path;
lo_message_add_int32 (reply, ssid);
}
- lo_message_add_float (reply, (float) 0);
+ string str_pth = os.str();
+ lo_message_add_float (reply, (float) val);
- lo_send_message (lo_message_get_source (msg), path.c_str(), reply);
+ lo_send_message (lo_message_get_source (msg), str_pth.c_str(), reply);
lo_message_free (reply);
+ if (sur->surface_sel == ssid) {
+ os.str("");
+ os << "/select/" << path;
+ string sel_pth = os.str();
+ reply = lo_message_new ();
+ lo_message_add_float (reply, (float) val);
+ lo_send_message (lo_message_get_source (msg), sel_pth.c_str(), reply);
+ lo_message_free (reply);
+ }
+
return 0;
}
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 9b045e2b75..4b74bf0e78 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -329,6 +329,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK1_MSG(set_surface_gainmode,i);
PATH_CALLBACK1_MSG(sel_recenable,i);
PATH_CALLBACK1_MSG(sel_recsafe,i);
+ PATH_CALLBACK1_MSG(sel_mute,i);
+ PATH_CALLBACK1_MSG(sel_solo,i);
+ PATH_CALLBACK1_MSG(sel_monitor_input,i);
+ PATH_CALLBACK1_MSG(sel_monitor_disk,i);
+ PATH_CALLBACK1_MSG(sel_gain,f);
+ PATH_CALLBACK1_MSG(sel_fader,f);
#define PATH_CALLBACK2(name,arg1type,arg2type) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -440,6 +446,12 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int monitor_set_fader (uint32_t position);
int sel_recenable (uint32_t state, lo_message msg);
int sel_recsafe (uint32_t state, lo_message msg);
+ int sel_mute (uint32_t state, lo_message msg);
+ int sel_solo (uint32_t state, lo_message msg);
+ int sel_monitor_input (uint32_t state, lo_message msg);
+ int sel_monitor_disk (uint32_t state, lo_message msg);
+ int sel_gain (float state, lo_message msg);
+ int sel_fader (float state, lo_message msg);
void listen_to_route (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
void end_listen (boost::shared_ptr<ARDOUR::Stripable>, lo_address);
@@ -451,7 +463,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
bool periodic (void);
sigc::connection periodic_connection;
- int route_send_fail (std::string path, uint32_t ssid, lo_message msg);
+ int route_send_fail (std::string path, uint32_t ssid, float val, lo_message msg);
typedef std::list<OSCRouteObserver*> RouteObservers;