summaryrefslogtreecommitdiff
path: root/libs/surfaces/control_protocol
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2016-05-09 08:14:33 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2016-05-09 08:17:23 -0400
commitae7cc64377e60ec4d93de4c7199341e9fa942c5d (patch)
tree4237eb26ded0afaa911874788f3084b2e013c82a /libs/surfaces/control_protocol
parentec8a840b1ae564d9401cac165063f20b48145300 (diff)
copy-n-paste the ARDOUR_UI toggle-roll code into BasicUI (for Faderport and others)
Diffstat (limited to 'libs/surfaces/control_protocol')
-rw-r--r--libs/surfaces/control_protocol/basic_ui.cc58
1 files changed, 46 insertions, 12 deletions
diff --git a/libs/surfaces/control_protocol/basic_ui.cc b/libs/surfaces/control_protocol/basic_ui.cc
index 161135390f..8227c55ca5 100644
--- a/libs/surfaces/control_protocol/basic_ui.cc
+++ b/libs/surfaces/control_protocol/basic_ui.cc
@@ -199,22 +199,56 @@ BasicUI::transport_stop ()
void
BasicUI::transport_play (bool from_last_start)
{
- bool rolling = session->transport_rolling ();
+ if (!session) {
+ return;
+ }
- if (session->get_play_loop()) {
- session->request_play_loop (false);
+ if (session->is_auditioning()) {
+ return;
}
- if (session->get_play_range ()) {
- session->request_play_range (0);
+#if 0
+ if (session->config.get_external_sync()) {
+ switch (Config->get_sync_source()) {
+ case Engine:
+ break;
+ default:
+ /* transport controlled by the master */
+ return;
+ }
}
+#endif
+
+ bool rolling = session->transport_rolling();
- if (from_last_start && rolling) {
- session->request_locate (session->last_transport_start(), true);
+ if (session->get_play_loop()) {
+
+ /* If loop playback is not a mode, then we should cancel
+ it when this action is requested. If it is a mode
+ we just leave it in place.
+ */
+
+ if (!Config->get_loop_is_mode()) {
+ /* XXX it is not possible to just leave seamless loop and keep
+ playing at present (nov 4th 2009)
+ */
+ if (!Config->get_seamless_loop()) {
+ /* stop loop playback and stop rolling */
+ session->request_play_loop (false, true);
+ } else if (rolling) {
+ /* stop loop playback but keep rolling */
+ session->request_play_loop (false, false);
+ }
+ }
+ } else if (session->get_play_range () ) {
+ /* stop playing a range if we currently are */
+ session->request_play_range (0, true);
}
- session->request_transport_speed (1.0f);
+ if (!rolling) {
+ session->request_transport_speed (1.0f);
+ }
}
void
@@ -357,11 +391,11 @@ BasicUI::jump_by_seconds (double secs)
{
framepos_t current = session->transport_frame();
double s = (double) current / (double) session->nominal_frame_rate();
-
+
s+= secs;
if (s < 0) current = 0;
s = s * session->nominal_frame_rate();
-
+
session->request_locate ( floor(s) );
}
@@ -374,11 +408,11 @@ BasicUI::jump_by_bars (double bars)
bars += bbt.bars;
if (bars < 0) bars = 0;
-
+
AnyTime any;
any.type = AnyTime::BBT;
any.bbt.bars = bars;
-
+
session->request_locate ( session->convert_to_frames (any) );
}