From 0a40e0be86910a7a7d0eccb71f7b935a429ffa70 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sun, 18 Apr 2010 23:58:43 +0000 Subject: [PATCH] Load 2.X sessions correctly with newly-arranged session start/end markers. git-svn-id: svn://localhost/ardour2/branches/3.0@6933 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/location.cc | 43 ++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/libs/ardour/location.cc b/libs/ardour/location.cc index ec2059a41f..d3fc3b0d41 100644 --- a/libs/ardour/location.cc +++ b/libs/ardour/location.cc @@ -655,7 +655,7 @@ Locations::get_state () } int -Locations::set_state (const XMLNode& node, int /*version*/) +Locations::set_state (const XMLNode& node, int version) { if (node.name() != "Locations") { error << _("incorrect XML mode passed to Locations::set_state") << endmsg; @@ -667,6 +667,12 @@ Locations::set_state (const XMLNode& node, int /*version*/) locations.clear (); current_location = 0; + Location* session_range_location = 0; + if (version < 3000) { + session_range_location = new Location (0, 0, _("session"), Location::IsSessionRange); + locations.push_back (session_range_location); + } + { Glib::Mutex::Lock lm (lock); @@ -676,7 +682,39 @@ Locations::set_state (const XMLNode& node, int /*version*/) try { Location *loc = new Location (**niter); - locations.push_back (loc); + + bool add = true; + + if (version < 3000) { + /* look for old-style IsStart / IsEnd properties in this location; + if they are present, update the session_range_location accordingly + */ + XMLProperty const * prop = (*niter)->property ("flags"); + if (prop) { + string v = prop->value (); + while (1) { + string::size_type const c = v.find_first_of (','); + string const s = v.substr (0, c); + if (s == X_("IsStart")) { + session_range_location->set_start (loc->start()); + add = false; + } else if (s == X_("IsEnd")) { + session_range_location->set_end (loc->start()); + add = false; + } + + if (c == string::npos) { + break; + } + + v = v.substr (c + 1); + } + } + } + + if (add) { + locations.push_back (loc); + } } catch (failed_constructor& err) { @@ -685,7 +723,6 @@ Locations::set_state (const XMLNode& node, int /*version*/) } if (locations.size()) { - current_location = locations.front(); } else { current_location = 0;