diff options
author | Len Ovens <len@ovenwerks.net> | 2017-05-03 16:31:46 -0700 |
---|---|---|
committer | Len Ovens <len@ovenwerks.net> | 2017-05-03 16:33:33 -0700 |
commit | 2bbf83e109c6767d6db0dafeade5e1bd5c6b8559 (patch) | |
tree | 1b575b95d82dbb14b807d0cae759c4bad9cfb59f | |
parent | 0afd18eb5dbaf7671fd1a59d1ef760b0f7c98611 (diff) |
OSC: Add multimode /jog command
-rw-r--r-- | libs/surfaces/osc/osc.cc | 122 | ||||
-rw-r--r-- | libs/surfaces/osc/osc.h | 22 |
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); |