From: Len Ovens Date: Mon, 1 May 2017 14:08:02 +0000 (-0700) Subject: OSC: add /scrub function X-Git-Tag: 5.9~119 X-Git-Url: https://main.carlh.net/gitweb/?p=ardour.git;a=commitdiff_plain;h=5f06ae43d87b441363afca3752c95ad5ed90f885 OSC: add /scrub function --- diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 7e7adb819a..20d89edfe2 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -100,6 +100,7 @@ OSC::OSC (Session& s, uint32_t port) , default_gainmode (0) , tick (true) , bank_dirty (false) + , scrub_speed (0) , gui (0) { _instance = this; @@ -421,6 +422,7 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, "/goto_start", "f", goto_start); REGISTER_CALLBACK (serv, "/goto_end", "", goto_end); REGISTER_CALLBACK (serv, "/goto_end", "f", goto_end); + REGISTER_CALLBACK (serv, "/scrub", "f", scrub); REGISTER_CALLBACK (serv, "/rewind", "", rewind); REGISTER_CALLBACK (serv, "/rewind", "f", rewind); REGISTER_CALLBACK (serv, "/ffwd", "", ffwd); @@ -1749,6 +1751,52 @@ OSC::record_enabled (lo_message msg) lo_message_free (reply); } +int +OSC::scrub (float delta, lo_message msg) +{ + if (!session) return -1; + + scrub_place = session->transport_frame (); + + float speed; + + boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); + boost::posix_time::time_duration diff = now - scrub_time; + if (diff.total_milliseconds() > 35) { + // speed 1 (or 0 if jog wheel supports touch) + speed = delta; + } else if ((diff.total_milliseconds() > 20) && (fabs(scrub_speed) == 1)) { + // add some hysteresis to stop excess speed jumps + speed = delta; + } else { + speed = (int)(delta * 2); + } + scrub_time = now; + if (scrub_speed == speed) { + // Already at that speed no change + return 0; + } + scrub_speed = speed; + + if (speed > 0) { + if (speed == 1) { + session->request_transport_speed (.5); + } else { + session->request_transport_speed (1); + } + } else if (speed < 0) { + if (speed == -1) { + session->request_transport_speed (-.5); + } else { + session->request_transport_speed (-1); + } + } else { + session->request_transport_speed (0); + } + + return 0; +} + // master and monitor calls int OSC::master_set_gain (float dB) @@ -3564,6 +3612,18 @@ OSC::periodic (void) } } + if (scrub_speed != 0) { + // for those jog wheels that don't have 0 on release (touch), time out. + boost::posix_time::ptime now = boost::posix_time::microsec_clock::local_time(); + boost::posix_time::time_duration diff = now - scrub_time; + if (diff.total_milliseconds() > 100) { + scrub_speed = 0; + session->request_transport_speed (0); + // locate to the place PH was at last tick + session->request_locate (scrub_place, false); + } + } + for (GlobalObservers::iterator x = global_observers.begin(); x != global_observers.end(); x++) { OSCGlobalObserver* go; diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index bc612b0881..2157b0e278 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -184,6 +184,9 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI 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 + boost::posix_time::ptime scrub_time; // when did the wheel move last? bool global_init; boost::shared_ptr _select; // which stripable out of /surface/stripables is gui selected @@ -371,6 +374,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI // pan position needs message info to send feedback PATH_CALLBACK1_MSG(master_set_pan_stereo_position,f); + PATH_CALLBACK1_MSG(scrub,f); PATH_CALLBACK1_MSG(set_surface_bank_size,i); PATH_CALLBACK1_MSG(set_surface_strip_types,i); PATH_CALLBACK1_MSG(set_surface_feedback,i); @@ -543,6 +547,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI int set_surface_gainmode (uint32_t gm, lo_message msg); int refresh_surface (lo_message msg); + int scrub (float delta, lo_message msg); int master_set_gain (float dB); int master_set_fader (float position); int master_set_trim (float dB);