diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index 14da57e95c..193d2e717f 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1924,9 +1924,9 @@ Session::XMLRouteFactory_3X (const XMLNode& node, int version) boost::shared_ptr track; if (type == DataType::AUDIO) { - track.reset (new AudioTrack (*this, X_("toBeResetFroXML"))); + track.reset (new AudioTrack (*this, string())); // name will be reset from XML in ::set_state() below } else { - track.reset (new MidiTrack (*this, X_("toBeResetFroXML"))); + track.reset (new MidiTrack (*this, string())); // name will be reset from XML in ::set_state() below } if (track->init()) { @@ -1986,9 +1986,9 @@ Session::XMLRouteFactory_2X (const XMLNode& node, int version) boost::shared_ptr track; if (type == DataType::AUDIO) { - track.reset (new AudioTrack (*this, X_("toBeResetFroXML"))); + track.reset (new AudioTrack (*this, string())); // name will be reset from XML in ::set_state() below } else { - track.reset (new MidiTrack (*this, X_("toBeResetFroXML"))); + track.reset (new MidiTrack (*this, string())); // name will be reset from XML in ::set_state() below } if (track->init()) { diff --git a/libs/ardour/track.cc b/libs/ardour/track.cc index 7e162ee513..058c9aef54 100644 --- a/libs/ardour/track.cc +++ b/libs/ardour/track.cc @@ -110,9 +110,9 @@ Track::init () if (!name().empty()) { /* an empty name means that we are being constructed via - serialized state (XML). Don't create a playlist, because one - will be created or discovered during ::set_state(). - */ + * serialized state (XML). Don't create a playlist, because one + * will be created or discovered during ::set_state(). + */ use_new_playlist (data_type()); } @@ -419,6 +419,18 @@ Track::set_name (const string& str) } } + /* When creating a track during session-load, + * do not change playlist's name, nor try to save the session. + * + * Changing the playlist name from 'toBeResetFroXML' breaks loading + * Ardour v2..5 sessions. Older versions of Arodur identified playlist + * by name, and this causes duplicate names and name conflicts. + * (new track name -> new playlist name != old playlist) + */ + if (_session.loading ()) { + return Route::set_name (str); + } + for (uint32_t n = 0; n < DataType::num_types; ++n) { if (_playlists[n]) { _playlists[n]->set_name (str);