Fix an assertion failure when stopping the transport with an active controllable touch gesture.
git-svn-id: svn://localhost/ardour2/branches/3.0@9389 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
6abc468aeb
commit
b25ef3ae69
@ -417,6 +417,13 @@ Automatable::transport_stopped (framepos_t now)
|
||||
= boost::dynamic_pointer_cast<AutomationList>(c->list());
|
||||
|
||||
if (l) {
|
||||
/* Stop any active touch gesture just before we mark the write pass
|
||||
as finished. If we don't do this, the transport can end up stopped with
|
||||
an AutomationList thinking that a touch is still in progress and,
|
||||
when the transport is re-started, a touch will magically
|
||||
be happening without it ever have being started in the usual way.
|
||||
*/
|
||||
l->stop_touch (true, now);
|
||||
l->write_pass_finished (now);
|
||||
|
||||
if (l->automation_playback()) {
|
||||
|
@ -213,12 +213,23 @@ AutomationList::start_touch (double when)
|
||||
void
|
||||
AutomationList::stop_touch (bool mark, double when)
|
||||
{
|
||||
if (g_atomic_int_get (&_touching) == 0) {
|
||||
/* this touch has already been stopped (probably by Automatable::transport_stopped),
|
||||
so we've nothing to do.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
g_atomic_int_set (&_touching, 0);
|
||||
|
||||
if (_state == Touch) {
|
||||
|
||||
assert (!nascent.empty ());
|
||||
|
||||
Glib::Mutex::Lock lm (ControlList::_lock);
|
||||
|
||||
if (mark) {
|
||||
|
||||
nascent.back()->end_time = when;
|
||||
|
||||
} else {
|
||||
@ -226,8 +237,6 @@ AutomationList::stop_touch (bool mark, double when)
|
||||
/* nascent info created in start touch but never used. just get rid of it.
|
||||
*/
|
||||
|
||||
assert (!nascent.empty ());
|
||||
|
||||
NascentInfo* ninfo = nascent.back ();
|
||||
nascent.erase (nascent.begin());
|
||||
delete ninfo;
|
||||
|
Loading…
Reference in New Issue
Block a user