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
This commit is contained in:
Paul Davis 2012-06-22 14:45:44 +00:00
parent 8c10320497
commit c0f7f044f3
6 changed files with 27 additions and 15 deletions

View file

@ -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

View file

@ -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);

View file

@ -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) {

View file

@ -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:

View file

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

View file

@ -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();