, default_gainmode (0)
, tick (true)
, bank_dirty (false)
+ , scrub_speed (0)
, gui (0)
{
_instance = this;
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, "/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);
std::string action_path = path;
access_action (action_path.substr(15));
- std::cout << "access_action path = " << action_path.substr(15) << "\n";
}
ret = 0;
for (CueObservers::iterator x = cue_observers.begin(); x != cue_observers.end();) {
OSCCueObserver* co;
if ((co = dynamic_cast<OSCCueObserver*>(*x)) != 0) {
- delete co;
+ delete *x;
+ x = cue_observers.erase (x);
} else {
++x;
}
lo_message_free (reply);
}
+int
+OSC::scrub (float delta, lo_message msg)
+{
+ if (!session) return -1;
+
+ scrub_place = session->transport_frame ();
+
+ float speed;
+
+ int64_t now = ARDOUR::get_microseconds ();
+ int64_t diff = now - scrub_time;
+ if (diff > 35000) {
+ // speed 1 (or 0 if jog wheel supports touch)
+ speed = delta;
+ } else if ((diff > 20000) && (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;
+}
+
+int
+OSC::jog (float delta, lo_message msg)
+{
+ if (!session) return -1;
+
+ OSCSurface *s = get_surface(get_address (msg));
+
+ string path = "/jog/mode/name";
+ 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;
+ 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);
+
+ }
+ jog (0, msg);
+ return 0;
+
+}
+
// master and monitor calls
int
OSC::master_set_gain (float dB)
}
}
+ if (scrub_speed != 0) {
+ // for those jog wheels that don't have 0 on release (touch), time out.
+ int64_t now = ARDOUR::get_microseconds ();
+ int64_t diff = now - scrub_time;
+ if (diff > 120000) {
+ 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;
sorted.push_back (s);
}
}
- } else
- if (types[3] && (s->presentation_info().flags() & PresentationInfo::MidiBus)) {
+ } else if (types[3] && (s->presentation_info().flags() & PresentationInfo::MidiBus)) {
sorted.push_back (s);
- } else
- if (types[4] && (s->presentation_info().flags() & PresentationInfo::VCA)) {
+ } else if (types[4] && (s->presentation_info().flags() & PresentationInfo::VCA)) {
sorted.push_back (s);
- } else
- if (types[8] && (s->presentation_info().flags() & PresentationInfo::Selected)) {
+ } else if (types[8] && (s->is_selected())) {
sorted.push_back (s);
- } else
- if (types[9] && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
+ } else if (types[9] && (s->presentation_info().flags() & PresentationInfo::Hidden)) {
sorted.push_back (s);
}
}
ret = 0;
}
else if (!strncmp (path, "/cue/connect", 12)) {
- // switch to next Aux bus
- cue_set (0, msg);
+ // Connect to default Aux bus
+ if (argv[0]->i) {
+ cue_set (1, msg);
+ }
ret = 0;
}
else if (!strncmp (path, "/cue/next_aux", 13)) {
// switch to next Aux bus
- cue_next (msg);
+ if (argv[0]->i) {
+ cue_next (msg);
+ }
ret = 0;
}
else if (!strncmp (path, "/cue/previous_aux", 17)) {
// switch to previous Aux bus
- cue_previous (msg);
+ if (argv[0]->i) {
+ cue_previous (msg);
+ }
ret = 0;
}
else if (!strncmp (path, "/cue/send/fader/", 16) && strlen (path) > 16) {
ret = 0;
}
- if ((ret && _debugmode == Unhandled)) {
- debugmsg (_("Unhandled OSC cue message"), path, types, argv, argc);
- } else if ((!ret && _debugmode == All)) {
- debugmsg (_("OSC cue"), path, types, argv, argc);
- }
-
return ret;
}
s->feedback = 0;
s->gainmode = 1;
s->cue = true;
- s->aux = aux;
s->strips = get_sorted_stripables(s->strip_types, s->cue);
s->nstrips = s->strips.size();
+
+ if (aux < 1) {
+ aux = 1;
+ } else if (aux > s->nstrips) {
+ aux = s->nstrips;
+ }
+ s->aux = aux;
+
// get rid of any old CueObsevers for this address
- cueobserver_connections.drop_connections ();
+ //cueobserver_connections.drop_connections ();
CueObservers::iterator x;
for (x = cue_observers.begin(); x != cue_observers.end();) {
OSC::cue_next (lo_message msg)
{
OSCSurface *s = get_surface(get_address (msg));
+
+ if (!s->cue) {
+ cue_set (1, msg);
+ return 0;
+ }
if (s->aux < s->nstrips) {
cue_set (s->aux + 1, msg);
} else {
OSC::cue_previous (lo_message msg)
{
OSCSurface *s = get_surface(get_address (msg));
+ if (!s->cue) {
+ cue_set (1, msg);
+ return 0;
+ }
if (s->aux > 1) {
cue_set (s->aux - 1, msg);
}