From 1cc9573dbaa2a4fb5ec28e5e362c78b3ad968cd7 Mon Sep 17 00:00:00 2001 From: Len Ovens Date: Thu, 20 Aug 2020 16:25:08 -0700 Subject: [PATCH] OSC toggle roll make return to zero optional --- libs/surfaces/osc/osc.cc | 37 +++++++++++++++++++++++++++++++++---- libs/surfaces/osc/osc.h | 3 +-- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/libs/surfaces/osc/osc.cc b/libs/surfaces/osc/osc.cc index 8fa9306e90..376279e365 100644 --- a/libs/surfaces/osc/osc.cc +++ b/libs/surfaces/osc/osc.cc @@ -494,8 +494,6 @@ OSC::register_callbacks() REGISTER_CALLBACK (serv, X_("/click/level"), "f", click_level); REGISTER_CALLBACK (serv, X_("/midi_panic"), "", midi_panic); REGISTER_CALLBACK (serv, X_("/midi_panic"), "f", midi_panic); - REGISTER_CALLBACK (serv, X_("/toggle_roll"), "", osc_toggle_roll); - REGISTER_CALLBACK (serv, X_("/toggle_roll"), "f", osc_toggle_roll); REGISTER_CALLBACK (serv, X_("/stop_forget"), "", stop_forget); REGISTER_CALLBACK (serv, X_("/stop_forget"), "f", stop_forget); REGISTER_CALLBACK (serv, X_("/set_punch_range"), "", set_punch_range); @@ -844,6 +842,17 @@ OSC::catchall (const char *path, const char* types, lo_arg **argv, int argc, lo_ ret = touch_detect (path, types, argv, argc, msg); } else + if (strstr (path, X_("/toggle_roll"))) { + if (!argc) { + ret = osc_toggle_roll (false); + } else { + if ((types[0] == 'f' && argv[0]->f == 1.0) || (types[0] == 'i' && argv[0]->i == 1)) { + ret = osc_toggle_roll (true); + } else if ((types[0] == 'f' && argv[0]->f == 0.0) || (types[0] == 'i' && argv[0]->i == 0)) { + ret = osc_toggle_roll (false); + } + } + } else if (strstr (path, X_("/spill"))) { ret = spill (path, types, argv, argc, msg); @@ -1451,9 +1460,29 @@ OSC::cancel_all_solos () } int -OSC::osc_toggle_roll () +OSC::osc_toggle_roll (bool ret2strt) { - toggle_roll (false); + if (!session) { + return 0; + } + + if (session->is_auditioning()) { + session->cancel_audition (); + return 0; + } + + bool rolling = transport_rolling(); + + if (rolling) { + session->request_stop (ret2strt, true); + } else { + + if (session->get_play_loop() && Config->get_loop_is_mode()) { + session->request_locate (session->locations()->auto_loop_location()->start(), MustRoll); + } else { + session->request_transport_speed (1.0f); + } + } return 0; } diff --git a/libs/surfaces/osc/osc.h b/libs/surfaces/osc/osc.h index ad593ef0db..dfa830c240 100644 --- a/libs/surfaces/osc/osc.h +++ b/libs/surfaces/osc/osc.h @@ -438,7 +438,6 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI PATH_CALLBACK(mark_out); PATH_CALLBACK(toggle_click); PATH_CALLBACK(midi_panic); - PATH_CALLBACK(osc_toggle_roll); PATH_CALLBACK(stop_forget); PATH_CALLBACK(set_punch_range); PATH_CALLBACK(set_loop_range); @@ -822,7 +821,7 @@ class OSC : public ARDOUR::ControlProtocol, public AbstractUI void notify_vca_added (ARDOUR::VCAList &); int cancel_all_solos (); - int osc_toggle_roll (); + int osc_toggle_roll (bool ret2strt); bool periodic (void); sigc::connection periodic_connection; PBD::ScopedConnectionList session_connections;