diff --git a/include/DataFile.h b/include/DataFile.h index 6b6b1a98e6c..de93309657c 100644 --- a/include/DataFile.h +++ b/include/DataFile.h @@ -129,6 +129,7 @@ class EXPORT DataFile : public QDomDocument void upgrade_1_2_0_rc2_42(); void upgrade(); + void fixPaths(); void loadData( const QByteArray & _data, const QString & _sourceFile ); diff --git a/src/core/DataFile.cpp b/src/core/DataFile.cpp index dc2b1de5791..1ad9775e9a1 100644 --- a/src/core/DataFile.cpp +++ b/src/core/DataFile.cpp @@ -40,6 +40,7 @@ #include "GuiApplication.h" #include "PluginFactory.h" #include "ProjectVersion.h" +#include "SampleBuffer.h" #include "SongEditor.h" #include "TextFloat.h" @@ -1118,6 +1119,9 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) ProjectVersion createdWith = root.attribute( "creatorversion" ); ProjectVersion openedWith = LMMS_VERSION; + // fix incorrectly saved paths (e.g. incorrectly set lmms working dir) + fixPaths(); + if ( createdWith != openedWith ) { // only one compareType needs to be set, and we can compare on one line because setCompareType returns ProjectVersion @@ -1157,6 +1161,45 @@ void DataFile::loadData( const QByteArray & _data, const QString & _sourceFile ) } + +/* + * Fix project portability by attempting to fix absolute paths. This can happen + * from a misconfigured lmms working directory or any projects created with + * 1.2.0-rc1 or 1.2.0-rc2 + */ +void DataFile::fixPaths() { + // Fix relative instrument samples (AudioFileProcessor, SF2Player...) + QDomNodeList list = elementsByTagName( "instrument" ); + for( int i = 0; i < list.count(); ++i ) + { + QDomElement el = list.item( i ).toElement().firstChildElement(); + while( !el.isNull() ) + { + QString src = el.attribute( "src" ); + if ( QFileInfo( src ).isAbsolute() ) { + el.setAttribute( "src", SampleBuffer::tryToMakeRelative( src ) ); + } + el = el.nextSiblingElement(); + } + } + + // Fix relative track samples (SampleTrack) + list = elementsByTagName( "sampletco" ); + for( int i = 0; i < list.count(); ++i ) + { + QDomElement el = list.item( i ).toElement(); + if( !el.isNull() ) + { + QString src = el.attribute( "src" ); + if ( QFileInfo( src ).isAbsolute() ) { + el.setAttribute( "src", SampleBuffer::tryToMakeRelative( src ) ); + } + } + } +} + + + void findIds(const QDomElement& elem, QList& idList) { if(elem.hasAttribute("id"))