mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-12 09:36:33 +01:00
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
2 changed files with 19 additions and 3 deletions
|
|
@ -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()) {
|
||||||
|
|
|
||||||
|
|
@ -213,12 +213,23 @@ 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 {
|
||||||
|
|
@ -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.
|
/* 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;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue