summaryrefslogtreecommitdiff
path: root/libs/surfaces/osc
diff options
context:
space:
mode:
authorLen Ovens <len@ovenwerks.net>2017-05-03 16:31:46 -0700
committerLen Ovens <len@ovenwerks.net>2017-05-03 16:33:33 -0700
commit2bbf83e109c6767d6db0dafeade5e1bd5c6b8559 (patch)
tree1b575b95d82dbb14b807d0cae759c4bad9cfb59f /libs/surfaces/osc
parent0afd18eb5dbaf7671fd1a59d1ef760b0f7c98611 (diff)
OSC: Add multimode /jog command
Diffstat (limited to 'libs/surfaces/osc')
-rw-r--r--libs/surfaces/osc/osc.cc122
-rw-r--r--libs/surfaces/osc/osc.h22
2 files changed, 141 insertions, 3 deletions
diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc
index e12738d726..6da35ffc9c 100644
--- a/libs/surfaces/osc/osc.cc
+++ b/libs/surfaces/osc/osc.cc
@@ -423,6 +423,8 @@ OSC::register_callbacks()
REGISTER_CALLBACK (serv, "/goto_end", "", goto_end);
REGISTER_CALLBACK (serv, "/goto_end", "f", goto_end);
REGISTER_CALLBACK (serv, "/scrub", "f", scrub);
+ REGISTER_CALLBACK (serv, "/jog", "f", jog);
+ REGISTER_CALLBACK (serv, "/jog/mode", "f", jog_mode);
REGISTER_CALLBACK (serv, "/rewind", "", rewind);
REGISTER_CALLBACK (serv, "/rewind", "f", rewind);
REGISTER_CALLBACK (serv, "/ffwd", "", ffwd);
@@ -1797,6 +1799,126 @@ OSC::scrub (float delta, lo_message msg)
return 0;
}
+int
+OSC::jog (float delta, lo_message msg)
+{
+ if (!session) return -1;
+
+ OSCSurface *s = get_surface(get_address (msg));
+
+ string path = "/jog/mode";
+ switch(s->jogmode)
+ {
+ case JOG :
+ text_message (path, "Jog", get_address (msg));
+ if (delta) {
+ jump_by_seconds (delta / 5);
+ }
+ break;
+ case SCRUB:
+ text_message (path, "Scrub", get_address (msg));
+ scrub (delta, msg);
+ break;
+ case SHUTTLE:
+ text_message (path, "Shuttle", get_address (msg));
+ if (delta) {
+ double speed = get_transport_speed ();
+ set_transport_speed (speed + (delta / 8));
+ } else {
+ set_transport_speed (0);
+ }
+ break;
+ case SCROLL:
+ text_message (path, "Scroll", get_address (msg));
+ if (delta > 0) {
+ access_action ("Editor/scroll-forward");
+ } else if (delta < 0) {
+ access_action ("Editor/scroll-backward");
+ }
+ break;
+ case TRACK:
+ text_message (path, "Track", get_address (msg));
+ if (delta > 0) {
+ set_bank (s->bank + 1, msg);
+ } else if (delta < 0) {
+ set_bank (s->bank - 1, msg);
+ }
+ break;
+ case BANK:
+ text_message (path, "Bank", get_address (msg));
+ if (delta > 0) {
+ bank_up (msg);
+ } else if (delta < 0) {
+ bank_down (msg);
+ }
+ break;
+ case NUDGE:
+ text_message (path, "Nudge", get_address (msg));
+ if (delta > 0) {
+ access_action ("Common/nudge-playhead-forward");
+ } else if (delta < 0) {
+ access_action ("Common/nudge-playhead-backward");
+ }
+ break;
+ case MARKER:
+ text_message (path, "Marker", get_address (msg));
+ if (delta > 0) {
+ next_marker ();
+ } else if (delta < 0) {
+ prev_marker ();
+ }
+ break;
+ default:
+ break;
+
+ }
+ return 0;
+
+}
+
+int
+OSC::jog_mode (float mode, lo_message msg)
+{
+ if (!session) return -1;
+
+ OSCSurface *s = get_surface(get_address (msg));
+
+ switch((uint32_t)mode)
+ {
+ case JOG :
+ s->jogmode = JOG;
+ break;
+ case SCRUB:
+ s->jogmode = SCRUB;
+ break;
+ case SHUTTLE:
+ s->jogmode = SHUTTLE;
+ break;
+ case SCROLL:
+ s->jogmode = SCROLL;
+ break;
+ case TRACK:
+ s->jogmode = TRACK;
+ break;
+ case BANK:
+ s->jogmode = BANK;
+ break;
+ case NUDGE:
+ s->jogmode = NUDGE;
+ break;
+ case MARKER:
+ s->jogmode = MARKER;
+ break;
+ default:
+ PBD::warning << "Jog Mode: " << mode << " is not valid." << endmsg;
+ break;
+
+ }
+ jog (0, msg);
+ return 0;
+
+}
+
// master and monitor calls
int
OSC::master_set_gain (float dB)
diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h
index 97f2c4e5eb..20585c34e3 100644
--- a/libs/surfaces/osc/osc.h
+++ b/libs/surfaces/osc/osc.h
@@ -95,6 +95,17 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
All
};
+ enum JogMode {
+ JOG,
+ SCRUB,
+ SHUTTLE,
+ SCROLL,
+ TRACK,
+ BANK,
+ NUDGE,
+ MARKER
+ };
+
typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
Sorted get_sorted_stripables(std::bitset<32> types, bool cue);
@@ -103,6 +114,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
public:
std::string remote_url; // the url these setting belong to
bool no_clear; // don't send osc clear messages on strip change
+ JogMode jogmode; // current jogmode
uint32_t bank; // current bank
uint32_t bank_size; // size of banks for this surface
std::bitset<32> strip_types;// what strip types are a part of this bank
@@ -184,9 +196,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
uint32_t default_gainmode;
bool tick;
bool bank_dirty;
- float scrub_speed; // Current scrub speed
- double scrub_place; // place of play head at latest jog/scrub wheel tick
- int64_t scrub_time; // when did the wheel move last?
+ float scrub_speed; // Current scrub speed
+ double scrub_place; // place of play head at latest jog/scrub wheel tick
+ int64_t scrub_time; // when did the wheel move last?
bool global_init;
boost::shared_ptr<ARDOUR::Stripable> _select; // which stripable out of /surface/stripables is gui selected
@@ -375,6 +387,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
PATH_CALLBACK1_MSG(master_set_pan_stereo_position,f);
PATH_CALLBACK1_MSG(scrub,f);
+ PATH_CALLBACK1_MSG(jog,f);
+ PATH_CALLBACK1_MSG(jog_mode,f);
PATH_CALLBACK1_MSG(set_surface_bank_size,i);
PATH_CALLBACK1_MSG(set_surface_strip_types,i);
PATH_CALLBACK1_MSG(set_surface_feedback,i);
@@ -548,6 +562,8 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
int refresh_surface (lo_message msg);
int scrub (float delta, lo_message msg);
+ int jog (float delta, lo_message msg);
+ int jog_mode (float mode, lo_message msg);
int master_set_gain (float dB);
int master_set_fader (float position);
int master_set_trim (float dB);