From 70d8300cb285256784f543da6aaf076d76b5052b Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Mon, 5 Feb 2018 10:39:58 -0800 Subject: OSC: clean up jog mode, simplify feedback --- libs/surfaces/osc/osc.cc | 133 ++++++------------------------- libs/surfaces/osc/osc.h | 13 +-- libs/surfaces/osc/osc_global_observer.cc | 47 +++++++++++ libs/surfaces/osc/osc_global_observer.h | 2 + 4 files changed, 74 insertions(+), 121 deletions(-) (limited to 'libs') diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 37151bbc70..6507408f68 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -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 diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index e6b8b5c43c..266a72d88b 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -107,17 +107,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI All }; - enum JogMode { - JOG, - NUDGE, - SCRUB, - SHUTTLE, - MARKER, - SCROLL, - TRACK, - BANK - }; - typedef std::vector > Sorted; Sorted get_sorted_stripables(std::bitset<32> types, bool cue, uint32_t custom, Sorted my_list); typedef std::map, uint32_t> FakeTouchMap; @@ -129,7 +118,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI //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 diff --git a/libs/surfaces/osc/osc_global_observer.cc b/libs/surfaces/osc/osc_global_observer.cc index a63520b572..e68858150f 100644 --- a/libs/surfaces/osc/osc_global_observer.cc +++ b/libs/surfaces/osc/osc_global_observer.cc @@ -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); +} + diff --git a/libs/surfaces/osc/osc_global_observer.h b/libs/surfaces/osc/osc_global_observer.h index 41700bbd89..a96926cac3 100644 --- a/libs/surfaces/osc/osc_global_observer.h +++ b/libs/surfaces/osc/osc_global_observer.h @@ -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; -- cgit v1.2.3