OSC: Add multimode /jog command
authorLen Ovens <len@ovenwerks.net>
Wed, 3 May 2017 23:31:46 +0000 (16:31 -0700)
committerLen Ovens <len@ovenwerks.net>
Wed, 3 May 2017 23:33:33 +0000 (16:33 -0700)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h

index e12738d726d89226fbd1d4f327887c06ec09b57c..6da35ffc9c2832c82086851c451b11ab7511e4e2 100644 (file)
@@ -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)
index 97f2c4e5eb9d173eaafe2f8913a0707c6b35a7b4..20585c34e395510aa310751683902570b8a16582 100644 (file)
@@ -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);