From bcf885b4be6c20c65b076640df9e3c9a3e52d5b7 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 23 Oct 2009 00:05:50 +0000 Subject: [PATCH] Fix crash when adding automation tracks caused by route ordering. I have no idea what caused this, or whether this is a kludge or not, but it's certainly less crap than not being able to display automation whatsoever. git-svn-id: svn://localhost/ardour2/branches/3.0@5877 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/mixer_ui.cc | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/gtk2_ardour/mixer_ui.cc b/gtk2_ardour/mixer_ui.cc index 0c88b7b2db..9e8277a3e0 100644 --- a/gtk2_ardour/mixer_ui.cc +++ b/gtk2_ardour/mixer_ui.cc @@ -18,6 +18,7 @@ */ #include +#include #include #include @@ -374,7 +375,6 @@ Mixer_UI::remove_strip (MixerStrip* strip) void Mixer_UI::sync_order_keys (string const & src) { - vector neworder; TreeModel::Children rows = track_model->children(); TreeModel::Children::iterator ri; @@ -382,25 +382,30 @@ Mixer_UI::sync_order_keys (string const & src) return; } - for (ri = rows.begin(); ri != rows.end(); ++ri) { - neworder.push_back (0); - } + std::map keys; bool changed = false; - unsigned int order; - for (order = 0, ri = rows.begin(); ri != rows.end(); ++ri, ++order) { + unsigned order = 0; + for (ri = rows.begin(); ri != rows.end(); ++ri, ++order) { boost::shared_ptr route = (*ri)[track_columns.route]; unsigned int old_key = order; unsigned int new_key = route->order_key (N_("signal")); - assert (new_key < neworder.size()); - neworder[new_key] = old_key; + keys[new_key] = old_key; if (new_key != old_key) { changed = true; } } + assert(keys.size() == rows.size()); + + // Remove any gaps in keys caused by automation children tracks + vector neworder; + for (std::map::const_iterator i = keys.begin(); i != keys.end(); ++i) { + neworder.push_back(i->second); + } + assert(neworder.size() == rows.size()); if (changed) { strip_redisplay_does_not_reset_order_keys = true;