Fix crash when adding automation tracks caused by route ordering.
authorDavid Robillard <d@drobilla.net>
Fri, 23 Oct 2009 00:05:50 +0000 (00:05 +0000)
committerDavid Robillard <d@drobilla.net>
Fri, 23 Oct 2009 00:05:50 +0000 (00:05 +0000)
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

index 0c88b7b2db09600108069ae7089d73259cda6017..9e8277a3e050a80b9daa26f7fc518fd06c0ff947 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include <algorithm>
+#include <map>
 #include <sigc++/bind.h>
 
 #include <gtkmm/accelmap.h>
@@ -374,7 +375,6 @@ Mixer_UI::remove_strip (MixerStrip* strip)
 void
 Mixer_UI::sync_order_keys (string const & src)
 {
-       vector<int> 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<int,int> 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> 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<int> neworder;
+       for (std::map<int,int>::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;