OSC: clean up jog mode, simplify feedback
authorLen Ovens <len@ovenwerks.net>
Mon, 5 Feb 2018 18:39:58 +0000 (10:39 -0800)
committerLen Ovens <len@ovenwerks.net>
Mon, 5 Feb 2018 18:40:25 +0000 (10:40 -0800)
libs/surfaces/osc/osc.cc
libs/surfaces/osc/osc.h
libs/surfaces/osc/osc_global_observer.cc
libs/surfaces/osc/osc_global_observer.h

index 37151bbc703ec8c6f02786eb97d84806ef286b3a..6507408f6851ada2b73ffff0bd941313ee62869d 100644 (file)
@@ -2132,7 +2132,7 @@ OSC::get_surface (lo_address addr , bool quiet)
        OSCSurface s;
        s.remote_url = r_url;
        s.no_clear = false;
-       s.jogmode = JOG;
+       s.jogmode = 0;
        s.bank = 1;
        s.bank_size = default_banksize;
        s.observers.clear();
@@ -2184,40 +2184,7 @@ OSC::global_feedback (OSCSurface* sur)
                // create a new Global Observer for this surface
                OSCGlobalObserver* o = new OSCGlobalObserver (*this, *session, sur);
                sur->global_obs = o;
-               uint32_t mode = sur->jogmode;
-               lo_address addr = lo_address_new_from_url       (sur->remote_url.c_str());
-
-               switch(mode)
-               {
-                       case JOG  :
-                               text_message ("/jog/mode/name", "Jog", addr);
-                               break;
-                       case SCRUB:
-                               text_message ("/jog/mode/name", "Scrub", addr);
-                               break;
-                       case SHUTTLE:
-                               text_message ("/jog/mode/name", "Shuttle", addr);
-                               break;
-                       case SCROLL:
-                               text_message ("/jog/mode/name", "Scroll", addr);
-                               break;
-                       case TRACK:
-                               text_message ("/jog/mode/name", "Track", addr);
-                               break;
-                       case BANK:
-                               text_message ("/jog/mode/name", "Bank", addr);
-                               break;
-                       case NUDGE:
-                               text_message ("/jog/mode/name", "Nudge", addr);
-                               break;
-                       case MARKER:
-                               text_message ("/jog/mode/name", "Marker", addr);
-                               break;
-                       default:
-                               PBD::warning << "Jog Mode: " << mode << " is not valid." << endmsg;
-                               break;
-               }
-               int_message ("/jog/mode", mode, addr);
+               o->jog_mode (sur->jogmode);
        }
 }
 
@@ -2857,21 +2824,24 @@ OSC::jog (float delta, lo_message msg)
 
        OSCSurface *s = get_surface(get_address (msg));
 
-       string path = "/jog/mode/name";
        switch(s->jogmode)
        {
-               case JOG  :
-                       text_message (path, "Jog", get_address (msg));
+               case 0:
                        if (delta) {
                                jump_by_seconds (delta / 5);
                        }
                        break;
-               case SCRUB:
-                       text_message (path, "Scrub", get_address (msg));
+               case 1:
+                       if (delta > 0) {
+                               access_action ("Common/nudge-playhead-forward");
+                       } else if (delta < 0) {
+                               access_action ("Common/nudge-playhead-backward");
+                       }
+                       break;
+               case 2:
                        scrub (delta, msg);
                        break;
-               case SHUTTLE:
-                       text_message (path, "Shuttle", get_address (msg));
+               case 3:
                        if (delta) {
                                double speed = get_transport_speed ();
                                set_transport_speed (speed + (delta / 8.1));
@@ -2879,46 +2849,34 @@ OSC::jog (float delta, lo_message msg)
                                set_transport_speed (0);
                        }
                        break;
-               case SCROLL:
-                       text_message (path, "Scroll", get_address (msg));
+               case 4:
+                       if (delta > 0) {
+                               next_marker ();
+                       } else if (delta < 0) {
+                               prev_marker ();
+                       }
+                       break;
+               case 5:
                        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));
+               case 6:
                        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));
+               case 7:
                        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;
 
@@ -2936,52 +2894,9 @@ OSC::jog_mode (float mode, lo_message msg)
        if (get_transport_speed () != 1.0) {
                set_transport_speed (0);
        }
-
-       switch((uint32_t)mode)
-       {
-               case JOG  :
-                       text_message ("/jog/mode/name", "Jog", get_address (msg));
-                       s->jogmode = JOG;
-                       break;
-               case SCRUB:
-                       text_message ("/jog/mode/name", "Scrub", get_address (msg));
-                       s->jogmode = SCRUB;
-                       break;
-               case SHUTTLE:
-                       text_message ("/jog/mode/name", "Shuttle", get_address (msg));
-                       s->jogmode = SHUTTLE;
-                       break;
-               case SCROLL:
-                       text_message ("/jog/mode/name", "Scroll", get_address (msg));
-                       s->jogmode = SCROLL;
-                       break;
-               case TRACK:
-                       text_message ("/jog/mode/name", "Track", get_address (msg));
-                       s->jogmode = TRACK;
-                       break;
-               case BANK:
-                       text_message ("/jog/mode/name", "Bank", get_address (msg));
-                       s->jogmode = BANK;
-                       break;
-               case NUDGE:
-                       text_message ("/jog/mode/name", "Nudge", get_address (msg));
-                       s->jogmode = NUDGE;
-                       break;
-               case MARKER:
-                       text_message ("/jog/mode/name", "Marker", get_address (msg));
-                       s->jogmode = MARKER;
-                       break;
-               default:
-                       PBD::warning << "Jog Mode: " << mode << " is not valid." << endmsg;
-                       break;
-       }
-       lo_message reply = lo_message_new ();
-       lo_message_add_int32 (reply, s->jogmode);
-       lo_send_message (get_address(msg), "/jog/mode", reply);
-       lo_message_free (reply);
-
+       s->jogmode = (uint32_t) mode;
+       s->global_obs->jog_mode (mode);
        return 0;
-
 }
 
 // two structs to help with going to markers
index e6b8b5c43c7cb6d28ac20e0c0a131f3ba3000f90..266a72d88b9ae4e98a10253561d38b83cce3d30a 100644 (file)
@@ -107,17 +107,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                All
        };
 
-       enum JogMode {
-               JOG,
-               NUDGE,
-               SCRUB,
-               SHUTTLE,
-               MARKER,
-               SCROLL,
-               TRACK,
-               BANK
-       };
-
        typedef std::vector<boost::shared_ptr<ARDOUR::Stripable> > Sorted;
        Sorted get_sorted_stripables(std::bitset<32> types, bool cue, uint32_t custom, Sorted my_list);
        typedef std::map<boost::shared_ptr<ARDOUR::AutomationControl>, uint32_t> FakeTouchMap;
@@ -129,7 +118,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI<OSCUIRequest>
                //global
                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 jogmode;                       // current jogmode
                OSCGlobalObserver* global_obs;  // pointer to this surface's global observer
                uint32_t nstrips;                       // how many strips are there for strip_types
                std::bitset<32> feedback;       // What is fed back? strips/meters/timecode/bar_beat/global
index a63520b572b204477671ce7c0f4d7b7a0abd219e..e68858150fa0e7df2e32883e2457a2d2b0e614ad 100644 (file)
@@ -44,6 +44,7 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
        ,_last_master_gain (0.0)
        ,_last_master_trim (0.0)
        ,_last_monitor_gain (0.0)
+       ,_jog_mode (1024)
        ,last_punchin (4)
        ,last_punchout (4)
        ,last_click (4)
@@ -52,6 +53,7 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
        session = &s;
        gainmode = sur->gainmode;
        feedback = sur->feedback;
+       uint32_t jogmode = sur->jogmode;
        _last_sample = -1;
        if (feedback[4]) {
 
@@ -126,6 +128,7 @@ OSCGlobalObserver::OSCGlobalObserver (OSC& o, Session& s, ArdourSurface::OSC::OS
                send_change_message ("/click/level", click_controllable);
 
                extra_check ();
+               jog_mode (jogmode);
 
                /*
                *       Maybe (many) more
@@ -202,6 +205,8 @@ OSCGlobalObserver::clear_observer ()
        _osc.float_message (X_("/toggle_punch_in"), 0, addr);
        _osc.float_message (X_("/toggle_click"), 0, addr);
        _osc.float_message (X_("/click/level"), 0, addr);
+       _osc.text_message (X_("/jog/mode/name"), " ", addr);
+       _osc.int_message (X_("/jog/mode"), 0, addr);
 
 
 }
@@ -500,3 +505,45 @@ OSCGlobalObserver::extra_check ()
        }
 }
 
+void
+OSCGlobalObserver::jog_mode (uint32_t jogmode)
+{
+       if (jogmode == _jog_mode || !feedback[4]) {
+               // no change
+               return;
+       }
+       _jog_mode = jogmode;
+
+       switch(jogmode)
+       {
+               case 0:
+                       _osc.text_message (X_("/jog/mode/name"), "Jog", addr);
+                       break;
+               case 1:
+                       _osc.text_message (X_("/jog/mode/name"), "Nudge", addr);
+                       break;
+               case 2:
+                       _osc.text_message (X_("/jog/mode/name"), "Scrub", addr);
+                       break;
+               case 3:
+                       _osc.text_message (X_("/jog/mode/name"), "Shuttle", addr);
+                       break;
+               case 4:
+                       _osc.text_message (X_("/jog/mode/name"), "Marker", addr);
+                       break;
+               case 5:
+                       _osc.text_message (X_("/jog/mode/name"), "Scroll", addr);
+                       break;
+               case 6:
+                       _osc.text_message (X_("/jog/mode/name"), "Track", addr);
+                       break;
+               case 7:
+                       _osc.text_message (X_("/jog/mode/name"), "Bank", addr);
+                       break;
+               default:
+                       PBD::warning << X_("Jog Mode: ") << jogmode << X_(" is not valid.") << endmsg;
+                       break;
+       }
+       _osc.int_message (X_("/jog/mode"), jogmode, addr);
+}
+
index 41700bbd898e1eb7501657b0ed31d38e428fcdb3..a96926cac343d7370ca9700aab8ff382514df6b4 100644 (file)
@@ -39,6 +39,7 @@ class OSCGlobalObserver
        lo_address address() const { return addr; };
        void tick (void);
        void clear_observer (void);
+       void jog_mode (uint32_t jogmode);
 
   private:
        ArdourSurface::OSC& _osc;
@@ -61,6 +62,7 @@ class OSCGlobalObserver
        uint32_t gainmode;
        std::bitset<32> feedback;
        ARDOUR::Session* session;
+       uint32_t _jog_mode;
        samplepos_t _last_sample;
        uint32_t _heartbeat;
        float _last_meter;