node->add_property (buf2, buf);
}
- if (max_source_level() > 0) {
+ /* Only store nested sources for the whole-file region that acts
+ as the parent/root of all regions using it.
+ */
+
+ if (_whole_file && max_source_level() > 0) {
XMLNode* nested_node = new XMLNode (X_("NestedSource"));
for (niter = nlist.begin(); niter != nlist.end(); ++niter) {
if ((*niter)->name() == "Source") {
- try {
- SourceFactory::create (*this, **niter, true);
+
+ /* it may already exist, so don't recreate it unnecessarily
+ */
+
+ XMLProperty* prop = (*niter)->property (X_("id"));
+ if (!prop) {
+ error << _("Nested source has no ID info in session state file! (ignored)") << endmsg;
+ continue;
}
- catch (failed_constructor& err) {
- error << string_compose (_("Cannot reconstruct nested source for region %1"), name()) << endmsg;
+
+ ID source_id (prop->value());
+
+ if (!source_by_id (source_id)) {
+
+ try {
+ SourceFactory::create (*this, **niter, true);
+ }
+ catch (failed_constructor& err) {
+ error << string_compose (_("Cannot reconstruct nested source for region %1"), name()) << endmsg;
+ }
}
}
}
try {
boost::shared_ptr<AudioPlaylistSource> ap (new AudioPlaylistSource (s, node));
-
+
if (setup_peakfile (ap, true)) {
return boost::shared_ptr<Source>();
}
ap->check_for_analysis_data_on_disk ();
+
SourceCreated (ap);
return ap;