OSC: clean up jog mode, simplify feedback

This commit is contained in:
Len Ovens 2018-02-05 10:39:58 -08:00
parent ea1740d65f
commit 70d8300cb2
4 changed files with 74 additions and 121 deletions

View 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

View 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

View 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);
}

View 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;