summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2012-06-22 14:45:44 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2012-06-22 14:45:44 +0000
commitc0f7f044f3e117660641d0b8b026c7bc4f53163c (patch)
treea88e13608005c1905726c9ac7c5313279e6be32a
parent8c10320497f09f85a90eb831f3e6d30d084eb7ab (diff)
introduce the idea of a "default transport speed", used whenever Session::start_transport() is called. Only the shuttle controller alters it, and even that only alters it in wheel mode, which means that stopping the transport does not rever the default speed back to zero. To get back to zero either switch the shuttle controller back to sprung mode, or change the speed back to zero (fixes #451 ... yes, really, a 3 digit bug fixed!)
git-svn-id: svn://localhost/ardour2/branches/3.0@12819 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/shuttle_control.cc4
-rw-r--r--libs/ardour/ardour/session.h7
-rw-r--r--libs/ardour/ardour/session_event.h7
-rw-r--r--libs/ardour/session_process.cc2
-rw-r--r--libs/ardour/session_state.cc1
-rw-r--r--libs/ardour/session_transport.cc21
6 files changed, 27 insertions, 15 deletions
diff --git a/gtk2_ardour/shuttle_control.cc b/gtk2_ardour/shuttle_control.cc
index 68d91ef162..88159fe020 100644
--- a/gtk2_ardour/shuttle_control.cc
+++ b/gtk2_ardour/shuttle_control.cc
@@ -278,7 +278,7 @@ ShuttleControl::on_button_release_event (GdkEventButton* ev)
case 2:
if (_session->transport_rolling()) {
- _session->request_transport_speed (1.0);
+ _session->request_transport_speed (1.0, Config->get_shuttle_behaviour() == Wheel);
}
return true;
@@ -479,7 +479,7 @@ ShuttleControl::use_shuttle_fract (bool force)
speed = shuttle_max_speed * shuttle_fract;
}
- _session->request_transport_speed_nonzero (speed);
+ _session->request_transport_speed_nonzero (speed, true);
}
bool
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index f89c43ac16..7f73d3ae77 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -329,8 +329,8 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void goto_start ();
void use_rf_shuttle_speed ();
void allow_auto_play (bool yn);
- void request_transport_speed (double speed);
- void request_transport_speed_nonzero (double);
+ void request_transport_speed (double speed, bool as_default = false);
+ void request_transport_speed_nonzero (double, bool as_default = false);
void request_overwrite_buffer (Track *);
void adjust_playback_buffering();
void adjust_capture_buffering();
@@ -905,6 +905,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
// varispeed playback
double _transport_speed;
+ double _default_transport_speed;
double _last_transport_speed;
double _target_transport_speed;
CubicInterpolation interpolation;
@@ -1210,7 +1211,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
void start_locate (framepos_t, bool with_roll, bool with_flush, bool with_loop=false, bool force=false);
void force_locate (framepos_t frame, bool with_roll = false);
void set_track_speed (Track *, double speed);
- void set_transport_speed (double speed, bool abort = false, bool clear_state = false);
+ void set_transport_speed (double speed, bool abort = false, bool clear_state = false, bool as_default = false);
void stop_transport (bool abort = false, bool clear_state = false);
void start_transport ();
void realtime_stop (bool abort, bool clear_state);
diff --git a/libs/ardour/ardour/session_event.h b/libs/ardour/ardour/session_event.h
index c917e4b3cf..d8a48123a2 100644
--- a/libs/ardour/ardour/session_event.h
+++ b/libs/ardour/ardour/session_event.h
@@ -71,6 +71,10 @@ public:
bool second_yes_or_no;
};
+ union {
+ bool third_yes_or_no;
+ };
+
/* 4 members to handle a multi-group event handled in RT context */
typedef boost::function<void (SessionEvent*)> RTeventCallback;
@@ -85,7 +89,7 @@ public:
boost::shared_ptr<Region> region;
- SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false)
+ SessionEvent (Type t, Action a, framepos_t when, framepos_t where, double spd, bool yn = false, bool yn2 = false, bool yn3 = false)
: type (t)
, action (a)
, action_frame (when)
@@ -93,6 +97,7 @@ public:
, speed (spd)
, yes_or_no (yn)
, second_yes_or_no (yn2)
+ , third_yes_or_no (yn3)
, event_loop (0) {}
void set_ptr (void* p) {
diff --git a/libs/ardour/session_process.cc b/libs/ardour/session_process.cc
index 0c3b0a57ea..6cebc13b0d 100644
--- a/libs/ardour/session_process.cc
+++ b/libs/ardour/session_process.cc
@@ -1065,7 +1065,7 @@ Session::process_event (SessionEvent* ev)
case SessionEvent::SetTransportSpeed:
- set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no);
+ set_transport_speed (ev->speed, ev->yes_or_no, ev->second_yes_or_no, ev->third_yes_or_no);
break;
case SessionEvent::PunchIn:
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 347c4ee35b..2f69ff2dee 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -169,6 +169,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
_solo_isolated_cnt = 0;
g_atomic_int_set (&processing_prohibited, 0);
_transport_speed = 0;
+ _default_transport_speed = 1.0;
_last_transport_speed = 0;
_target_transport_speed = 0;
auto_play_legal = false;
diff --git a/libs/ardour/session_transport.cc b/libs/ardour/session_transport.cc
index 20ac737575..27896f6e67 100644
--- a/libs/ardour/session_transport.cc
+++ b/libs/ardour/session_transport.cc
@@ -103,10 +103,11 @@ Session::request_sync_source (Slave* new_slave)
}
void
-Session::request_transport_speed (double speed)
+Session::request_transport_speed (double speed, bool as_default)
{
SessionEvent* ev = new SessionEvent (SessionEvent::SetTransportSpeed, SessionEvent::Add, SessionEvent::Immediate, 0, speed);
- DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1\n", speed));
+ ev->third_yes_or_no = true;
+ DEBUG_TRACE (DEBUG::Transport, string_compose ("Request transport speed = %1 as default = %2\n", speed, as_default));
queue_event (ev);
}
@@ -115,13 +116,13 @@ Session::request_transport_speed (double speed)
* be used by callers who are varying transport speed but don't ever want to stop it.
*/
void
-Session::request_transport_speed_nonzero (double speed)
+Session::request_transport_speed_nonzero (double speed, bool as_default)
{
if (speed == 0) {
speed = DBL_EPSILON;
}
- request_transport_speed (speed);
+ request_transport_speed (speed, as_default);
}
void
@@ -995,10 +996,10 @@ Session::locate (framepos_t target_frame, bool with_roll, bool with_flush, bool
* @param speed New speed
*/
void
-Session::set_transport_speed (double speed, bool abort, bool clear_state)
+Session::set_transport_speed (double speed, bool abort, bool clear_state, bool as_default)
{
- DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4\n",
- speed, abort, clear_state, _transport_speed, _transport_frame));
+ DEBUG_TRACE (DEBUG::Transport, string_compose ("@ %5 Set transport speed to %1, abort = %2 clear_state = %3, current = %4 as_default %5\n",
+ speed, abort, clear_state, _transport_speed, _transport_frame, as_default));
if (_transport_speed == speed) {
return;
@@ -1098,6 +1099,10 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state)
_last_transport_speed = _transport_speed;
_transport_speed = speed;
+ if (as_default) {
+ _default_transport_speed = speed;
+ }
+
boost::shared_ptr<RouteList> rl = routes.reader();
for (RouteList::iterator i = rl->begin(); i != rl->end(); ++i) {
boost::shared_ptr<Track> tr = boost::dynamic_pointer_cast<Track> (*i);
@@ -1213,7 +1218,7 @@ Session::start_transport ()
transport_sub_state |= PendingDeclickIn;
- _transport_speed = 1.0;
+ _transport_speed = _default_transport_speed;
_target_transport_speed = _transport_speed;
boost::shared_ptr<RouteList> rl = routes.reader();