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:
Carl Hetherington 2011-04-20 01:24:46 +00:00
parent 6abc468aeb
commit b25ef3ae69
2 changed files with 19 additions and 3 deletions

View file

@ -417,6 +417,13 @@ Automatable::transport_stopped (framepos_t now)
= boost::dynamic_pointer_cast<AutomationList>(c->list()); = boost::dynamic_pointer_cast<AutomationList>(c->list());
if (l) { 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); l->write_pass_finished (now);
if (l->automation_playback()) { if (l->automation_playback()) {

View file

@ -213,21 +213,30 @@ AutomationList::start_touch (double when)
void void
AutomationList::stop_touch (bool mark, double when) 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); g_atomic_int_set (&_touching, 0);
if (_state == Touch) { if (_state == Touch) {
assert (!nascent.empty ());
Glib::Mutex::Lock lm (ControlList::_lock); Glib::Mutex::Lock lm (ControlList::_lock);
if (mark) { if (mark) {
nascent.back()->end_time = when;
nascent.back()->end_time = when;
} else { } else {
/* nascent info created in start touch but never used. just get rid of it. /* nascent info created in start touch but never used. just get rid of it.
*/ */
assert (!nascent.empty ());
NascentInfo* ninfo = nascent.back (); NascentInfo* ninfo = nascent.back ();
nascent.erase (nascent.begin()); nascent.erase (nascent.begin());
delete ninfo; delete ninfo;