Sort Route xml node order by PBD::ID instead of by PresentationInfo
authorTim Mayberry <mojofunk@gmail.com>
Fri, 21 Apr 2017 10:33:05 +0000 (20:33 +1000)
committerTim Mayberry <mojofunk@gmail.com>
Wed, 26 Apr 2017 07:36:58 +0000 (17:36 +1000)
This prevents the node order from changing when the display order of the Routes
changes, which helps to reduce the amount of Session file change.

This is useful for testing and if keeping sessions under version control.

Resolves: #7327

libs/ardour/session_state.cc

index c59ae00a575f51ce12272a78b213c5a34f80f4d0..35cb9c538cd34e6e0daa2a05834c8f533636dcea 100644 (file)
@@ -1126,6 +1126,17 @@ Session::export_track_state (boost::shared_ptr<RouteList> rl, const string& path
        return tree.write (sn.c_str());
 }
 
+namespace
+{
+struct route_id_compare {
+       bool
+       operator() (const boost::shared_ptr<Route>& r1, const boost::shared_ptr<Route>& r2)
+       {
+               return r1->id () < r2->id ();
+       }
+};
+} // anon namespace
+
 XMLNode&
 Session::state (bool full_state)
 {
@@ -1326,17 +1337,11 @@ Session::state (bool full_state)
        {
                boost::shared_ptr<RouteList> r = routes.reader ();
 
-               RoutePublicOrderSorter cmp;
-               RouteList public_order (*r);
-               public_order.sort (cmp);
-
-               /* the sort should have put the monitor out first */
-
-               if (_monitor_out) {
-                       assert (_monitor_out == public_order.front());
-               }
+               route_id_compare cmp;
+               RouteList xml_node_order (*r);
+               xml_node_order.sort (cmp);
 
-               for (RouteList::iterator i = public_order.begin(); i != public_order.end(); ++i) {
+               for (RouteList::iterator i = xml_node_order.begin(); i != xml_node_order.end(); ++i) {
                        if (!(*i)->is_auditioner()) {
                                if (full_state) {
                                        child->add_child_nocopy ((*i)->get_state());