diff --git a/libs/ardour/audio_track.cc b/libs/ardour/audio_track.cc index efa87562c8..d262bef1de 100644 --- a/libs/ardour/audio_track.cc +++ b/libs/ardour/audio_track.cc @@ -108,6 +108,7 @@ AudioTrack::state (bool save_template) freeze_node = new XMLNode (X_("freeze-info")); freeze_node->set_property ("playlist", _freeze_record.playlist->name()); + freeze_node->set_property ("playlist-id", _freeze_record.playlist->id().to_s ()); freeze_node->set_property ("state", _freeze_record.state); for (vector::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) { @@ -149,16 +150,19 @@ AudioTrack::set_state_part_two () } _freeze_record.processor_info.clear (); - if ((prop = fnode->property (X_("playlist"))) != 0) { - boost::shared_ptr pl = _session.playlists()->by_name (prop->value()); - if (pl) { - _freeze_record.playlist = boost::dynamic_pointer_cast (pl); - _freeze_record.playlist->use(); - } else { - _freeze_record.playlist.reset (); - _freeze_record.state = NoFreeze; + boost::shared_ptr freeze_pl; + if ((prop = fnode->property (X_("playlist-id"))) != 0) { + freeze_pl = _session.playlists()->by_id (prop->value()); + } else if ((prop = fnode->property (X_("playlist"))) != 0) { + freeze_pl = _session.playlists()->by_name (prop->value()); + } + if (freeze_pl) { + _freeze_record.playlist = boost::dynamic_pointer_cast (freeze_pl); + _freeze_record.playlist->use(); + } else { + _freeze_record.playlist.reset (); + _freeze_record.state = NoFreeze; return; - } } fnode->get_property (X_("state"), _freeze_record.state); diff --git a/libs/ardour/midi_track.cc b/libs/ardour/midi_track.cc index 8e20c1453f..6a522d3a5f 100644 --- a/libs/ardour/midi_track.cc +++ b/libs/ardour/midi_track.cc @@ -227,6 +227,7 @@ MidiTrack::state(bool save_template) freeze_node = new XMLNode (X_("freeze-info")); freeze_node->set_property ("playlist", _freeze_record.playlist->name()); + freeze_node->set_property ("playlist-id", _freeze_record.playlist->id().to_s()); freeze_node->set_property ("state", _freeze_record.state); for (vector::iterator i = _freeze_record.processor_info.begin(); i != _freeze_record.processor_info.end(); ++i) { @@ -266,6 +267,7 @@ void MidiTrack::set_state_part_two () { XMLNode* fnode; + XMLProperty const * prop; /* This is called after all session state has been restored but before have been made ports and connections are established. @@ -284,23 +286,28 @@ MidiTrack::set_state_part_two () } _freeze_record.processor_info.clear (); - std::string str; - if (fnode->get_property (X_("playlist"), str)) { - boost::shared_ptr pl = _session.playlists()->by_name (str); - if (pl) { - _freeze_record.playlist = boost::dynamic_pointer_cast (pl); - } else { - _freeze_record.playlist.reset(); - _freeze_record.state = NoFreeze; - return; - } + boost::shared_ptr freeze_pl; + if ((prop = fnode->property (X_("playlist-id"))) != 0) { + freeze_pl = _session.playlists()->by_id (prop->value()); + } else if ((prop = fnode->property (X_("playlist"))) != 0) { + freeze_pl = _session.playlists()->by_name (prop->value()); } + if (freeze_pl) { + _freeze_record.playlist = boost::dynamic_pointer_cast (freeze_pl); + _freeze_record.playlist->use(); + } else { + _freeze_record.playlist.reset (); + _freeze_record.state = NoFreeze; + return; + } + fnode->get_property (X_("state"), _freeze_record.state); XMLNodeConstIterator citer; XMLNodeList clist = fnode->children(); + std::string str; for (citer = clist.begin(); citer != clist.end(); ++citer) { if ((*citer)->name() != X_("processor")) { continue;