summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2017-12-02 08:17:42 -0800
committerLen Ovens <len@ovenwerks.net>2017-12-02 08:18:53 -0800
commit2c4a8d2d257acbbef62e491d7bd5079fc64bc19e (patch)
treeaea6f192d25d5a65a1c8a1f7ff127f51b7705eda /libs
parent9aab9bc229b97aabfd93f1aae3e96738cbacd49b (diff)
OSC: Add custom bank creation and use
Diffstat (limited to 'libs')
-rw-r--r--libs/surfaces/osc/osc.cc120
-rw-r--r--libs/surfaces/osc/osc.h6
2 files changed, 82 insertions, 44 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index 7ffc2e6019..dedb611e5b 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -415,6 +415,9 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/refresh", "f", refresh_surface);
REGISTER_CALLBACK (serv, "/strip/list", "", routes_list);
REGISTER_CALLBACK (serv, "/strip/list", "f", routes_list);
+ REGISTER_CALLBACK (serv, "/strip/custom/enable", "f", custom_enable);
+ REGISTER_CALLBACK (serv, "/strip/custom/clear", "f", custom_clear);
+ REGISTER_CALLBACK (serv, "/strip/custom/clear", "", custom_clear);
REGISTER_CALLBACK (serv, "/surface/list", "", surface_list);
REGISTER_CALLBACK (serv, "/surface/list", "f", surface_list);
REGISTER_CALLBACK (serv, "/add_marker", "", add_marker);
@@ -794,10 +797,7 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
/* 15 for /#current_value plus 2 for /<path> */
len = strlen (path);
- /*
- * not needed until /strip/listen/ignore fixed
- OSCSurface *sur = get_surface(get_address (msg));
- */
+ OSCSurface *sur = get_surface(get_address (msg), true);
if (strstr (path, "/automation")) {
ret = set_automation (path, types, argv, argc, msg);
@@ -832,56 +832,38 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_
ret = 0;
} else
-/* if (strcmp (path, "/strip/listen") == 0) {
- check_surface (msg);
-
- cerr << "set up listener\n";
-
- lo_message reply = lo_message_new ();
-
+ if (strcmp (path, "/strip/listen") == 0) {
if (argc <= 0) {
- lo_message_add_string (reply, "syntax error");
+ PBD::warning << "OSC: Wrong number of parameters." << endmsg;
+ } else if (sur->custom_enable) {
+ PBD::warning << "OSC: Can't add strips with custom enabled." << endmsg;
} else {
for (int n = 0; n < argc; ++n) {
- boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
-
- if (!r) {
- lo_message_add_string (reply, "not found");
- cerr << "no such route\n";
- break;
- } else {
- cerr << "add listener\n";
- listen_to_route (r, get_address (msg));
- lo_message_add_int32 (reply, argv[n]->i);
+ boost::shared_ptr<Stripable> s = get_strip (argv[n]->i, get_address (msg));
+ if (s) {
+ sur->custom_strips.push_back (s);
}
}
}
-
- if (sur->feedback[14]) {
- lo_send_message (get_address (msg), "/reply", reply);
- } else {
- lo_send_message (get_address (msg), "#reply", reply);
- }
- lo_message_free (reply);
-
ret = 0;
-
} else
if (strcmp (path, "/strip/ignore") == 0) {
- check_surface (msg);
-
- for (int n = 0; n < argc; ++n) {
-
- boost::shared_ptr<Route> r = session->get_remote_nth_route (argv[n]->i);
-
- if (r) {
- end_listen (r, get_address (msg));
+ if (argc <= 0) {
+ PBD::warning << "OSC: Wrong number of parameters." << endmsg;
+ } else if (!sur->custom_enable) {
+ PBD::warning << "OSC: Can't remove strips without custom enabled." << endmsg;
+ } else {
+ for (int n = 0; n < argc; ++n) {
+ if ((uint32_t) argv[n]->i <= sur->custom_strips.size ()) {
+ sur->custom_strips[argv[n]->i - 1] = boost::shared_ptr<Stripable>();
+ }
}
+ ret = set_bank (sur->bank, msg);
}
ret = 0;
- } else */
+ } else
if (strstr (path, "/strip") && (argc != 1)) {
// All of the strip commands below require 1 parameter
PBD::warning << "OSC: Wrong number of parameters." << endmsg;
@@ -1269,6 +1251,7 @@ OSC::surface_list (lo_message msg)
OSCSurface* sur = &_surface[it];
cerr << string_compose (" Surface: %1 URL: %2\n", it, sur->remote_url);
cerr << string_compose (" Number of strips: %1 Bank size: %2 Current Bank %3\n", sur->nstrips, sur->bank_size, sur->bank);
+ cerr << string_compose (" Use Custom: %1 Custom Strips: %2\n", sur->custom_enable, sur->custom_strips.size ());
bool ug = false;
if (sur->usegroup == PBD::Controllable::UseGroup) {
ug = true;
@@ -1301,6 +1284,47 @@ OSC::surface_list (lo_message msg)
}
int
+OSC::custom_clear (lo_message msg)
+{
+ if (!session) {
+ return 0;
+ }
+ OSCSurface *sur = get_surface(get_address (msg), true);
+ sur->custom_enable = false;
+ sur->custom_strips.clear ();
+ sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
+ sur->nstrips = sur->strips.size();
+ return set_bank (1, msg);
+}
+
+int
+OSC::custom_enable (float state, lo_message msg)
+{
+ if (!session) {
+ return 0;
+ }
+ OSCSurface *sur = get_surface(get_address (msg), true);
+ if (state > 0){
+ if (sur->custom_strips.size () == 0) {
+ PBD::warning << "No custom strips set to enable" << endmsg;
+ sur->custom_enable = false;
+ return -1;
+ } else {
+ sur->custom_enable = true;
+ sur->strips = sur->custom_strips;
+ sur->nstrips = sur->custom_strips.size();
+ return set_bank (1, msg);
+ }
+ } else {
+ sur->custom_enable = false;
+ sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
+ sur->nstrips = sur->strips.size();
+ return set_bank (1, msg);
+ }
+ return -1;
+}
+
+int
OSC::cancel_all_solos ()
{
session->cancel_all_solo ();
@@ -1930,6 +1954,8 @@ OSC::get_surface (lo_address addr , bool quiet)
s.feedback = default_feedback;
s.gainmode = default_gainmode;
s.usegroup = PBD::Controllable::NoGroup;
+ s.custom_strips.clear ();
+ s.custom_enable = false;
s.sel_obs = 0;
s.expand = 0;
s.expand_enable = false;
@@ -1974,8 +2000,14 @@ OSC::global_feedback (OSCSurface* sur)
void
OSC::strip_feedback (OSCSurface* sur, bool new_bank_size)
{
- sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
- sur->nstrips = sur->strips.size();
+ if (sur->custom_enable && (sur->custom_strips.size () > 0)) {
+ sur->strips = sur->custom_strips;
+ sur->nstrips = sur->custom_strips.size ();
+ } else {
+ sur->custom_enable = false;
+ 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])) {
// delete old observers
for (uint32_t i = 0; i < sur->observers.size(); i++) {
@@ -2051,8 +2083,8 @@ OSC::_recalcbanks ()
// refresh each surface we know about.
for (uint32_t it = 0; it < _surface.size(); ++it) {
OSCSurface* sur = &_surface[it];
- sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
- sur->nstrips = sur->strips.size();
+ //sur->strips = get_sorted_stripables(sur->strip_types, sur->cue);
+ //sur->nstrips = sur->strips.size();
// find lo_address
lo_address addr = lo_address_new_from_url (sur->remote_url.c_str());
if (sur->cue) {
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 0d02d25cdb..a65513423d 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -134,6 +134,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
std::bitset<32> feedback; // What is fed back? strips/meters/timecode/bar_beat/global
int gainmode; // what kind of faders do we have Gain db or position 0 to 1?
PBD::Controllable::GroupControlDisposition usegroup; // current group disposition
+ Sorted custom_strips; // a sorted list of user selected strips
+ int custom_enable; // use custom strip list
Sorted strips; // list of stripables for this surface
// strips
uint32_t bank; // current bank
@@ -352,6 +354,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK_MSG(bank_up);
PATH_CALLBACK_MSG(bank_down);
PATH_CALLBACK_MSG(master_select);
+ PATH_CALLBACK_MSG(custom_clear);
#define PATH_CALLBACK(name) \
static int _ ## name (const char *path, const char *types, lo_arg **argv, int argc, void *data, void *user_data) { \
@@ -508,6 +511,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK1_MSG(sel_eq_lpf_enable,f);
PATH_CALLBACK1_MSG(sel_eq_lpf_slope,f);
PATH_CALLBACK1_MSG(sel_expand,i);
+ PATH_CALLBACK1_MSG(custom_enable,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) { \
@@ -655,6 +659,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int set_surface_feedback (uint32_t fb, lo_message msg);
int set_surface_gainmode (uint32_t gm, lo_message msg);
int refresh_surface (lo_message msg);
+ int custom_clear (lo_message msg);
+ int custom_enable (float state, lo_message msg);
// select
int sel_send_pagesize (uint32_t size, lo_message msg);
int sel_send_page (int page, lo_message msg);