Make Session::audible_frame() return a (more) correct answer when the transport has changed direction since it last started rolling. Fixes some playhead anomolies when reversing the transport.
git-svn-id: svn://localhost/ardour2/branches/3.0@6999 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
83b30a6d06
commit
581376e0ed
@ -5175,6 +5175,7 @@ Editor::super_rapid_screen_update ()
|
|||||||
* 1. we don't update things when there's a pending locate request, otherwise
|
* 1. we don't update things when there's a pending locate request, otherwise
|
||||||
* when the editor requests a locate there is a chance that this method
|
* when the editor requests a locate there is a chance that this method
|
||||||
* will move the playhead before the locate request is processed, causing
|
* will move the playhead before the locate request is processed, causing
|
||||||
|
* a visual glitch.
|
||||||
* 2. if we're not rolling, there's nothing to do here (locates are handled elsewhere).
|
* 2. if we're not rolling, there's nothing to do here (locates are handled elsewhere).
|
||||||
* 3. if we're still at the same frame that we were last time, there's nothing to do.
|
* 3. if we're still at the same frame that we were last time, there's nothing to do.
|
||||||
*/
|
*/
|
||||||
|
@ -987,6 +987,7 @@ class Session : public PBD::StatefulDestructible, public PBD::ScopedConnectionLi
|
|||||||
int load_state (std::string snapshot_name);
|
int load_state (std::string snapshot_name);
|
||||||
|
|
||||||
nframes_t _last_roll_location;
|
nframes_t _last_roll_location;
|
||||||
|
nframes_t _last_roll_or_reversal_location;
|
||||||
nframes_t _last_record_location;
|
nframes_t _last_record_location;
|
||||||
|
|
||||||
bool pending_locate_roll;
|
bool pending_locate_roll;
|
||||||
|
@ -1104,17 +1104,20 @@ Session::audible_frame () const
|
|||||||
|
|
||||||
/* MOVING */
|
/* MOVING */
|
||||||
|
|
||||||
/* check to see if we have passed the first guaranteed
|
/* Check to see if we have passed the first guaranteed
|
||||||
audible frame past our last start position. if not,
|
audible frame past our last start position. if not,
|
||||||
return that last start point because in terms
|
return that last start point because in terms
|
||||||
of audible frames, we have not moved yet.
|
of audible frames, we have not moved yet.
|
||||||
|
|
||||||
|
`Start position' in this context means the time we last
|
||||||
|
either started or changed transport direction.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (_transport_speed > 0.0f) {
|
if (_transport_speed > 0.0f) {
|
||||||
|
|
||||||
if (!play_loop || !have_looped) {
|
if (!play_loop || !have_looped) {
|
||||||
if (tf < _last_roll_location + offset) {
|
if (tf < _last_roll_or_reversal_location + offset) {
|
||||||
return _last_roll_location;
|
return _last_roll_or_reversal_location;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1126,8 +1129,8 @@ Session::audible_frame () const
|
|||||||
|
|
||||||
/* XXX wot? no backward looping? */
|
/* XXX wot? no backward looping? */
|
||||||
|
|
||||||
if (tf > _last_roll_location - offset) {
|
if (tf > _last_roll_or_reversal_location - offset) {
|
||||||
return _last_roll_location;
|
return _last_roll_or_reversal_location;
|
||||||
} else {
|
} else {
|
||||||
/* backwards */
|
/* backwards */
|
||||||
ret += offset;
|
ret += offset;
|
||||||
|
@ -184,6 +184,7 @@ Session::first_stage_init (string fullpath, string snapshot_name)
|
|||||||
play_loop = false;
|
play_loop = false;
|
||||||
have_looped = false;
|
have_looped = false;
|
||||||
_last_roll_location = 0;
|
_last_roll_location = 0;
|
||||||
|
_last_roll_or_reversal_location = 0;
|
||||||
_last_record_location = 0;
|
_last_record_location = 0;
|
||||||
pending_locate_frame = 0;
|
pending_locate_frame = 0;
|
||||||
pending_locate_roll = false;
|
pending_locate_roll = false;
|
||||||
|
@ -1012,6 +1012,7 @@ Session::set_transport_speed (double speed, bool abort, bool clear_state)
|
|||||||
|
|
||||||
if ((_transport_speed && speed * _transport_speed < 0.0) || (_last_transport_speed * speed < 0.0) || (_last_transport_speed == 0.0f && speed < 0.0f)) {
|
if ((_transport_speed && speed * _transport_speed < 0.0) || (_last_transport_speed * speed < 0.0) || (_last_transport_speed == 0.0f && speed < 0.0f)) {
|
||||||
todo = PostTransportWork (todo | PostTransportReverse);
|
todo = PostTransportWork (todo | PostTransportReverse);
|
||||||
|
_last_roll_or_reversal_location = _transport_frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
_last_transport_speed = _transport_speed;
|
_last_transport_speed = _transport_speed;
|
||||||
@ -1097,6 +1098,8 @@ void
|
|||||||
Session::start_transport ()
|
Session::start_transport ()
|
||||||
{
|
{
|
||||||
_last_roll_location = _transport_frame;
|
_last_roll_location = _transport_frame;
|
||||||
|
_last_roll_or_reversal_location = _transport_frame;
|
||||||
|
|
||||||
have_looped = false;
|
have_looped = false;
|
||||||
|
|
||||||
/* if record status is Enabled, move it to Recording. if its
|
/* if record status is Enabled, move it to Recording. if its
|
||||||
|
Loading…
Reference in New Issue
Block a user