|
From: <sag...@us...> - 2014-12-01 16:58:37
|
Revision: 4622
http://sourceforge.net/p/modplug/code/4622
Author: saga-games
Date: 2014-12-01 16:58:22 +0000 (Mon, 01 Dec 2014)
Log Message:
-----------
[Ref] Move external sample loading from individual loaders to CSoundFile::Create.
[Fix] When an external sample could not be found, its loop points were lost.
Modified Paths:
--------------
trunk/OpenMPT/soundlib/Load_it.cpp
trunk/OpenMPT/soundlib/Load_mt2.cpp
trunk/OpenMPT/soundlib/Sndfile.cpp
Modified: trunk/OpenMPT/soundlib/Load_it.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_it.cpp 2014-12-01 13:52:00 UTC (rev 4621)
+++ trunk/OpenMPT/soundlib/Load_it.cpp 2014-12-01 16:58:22 UTC (rev 4622)
@@ -17,7 +17,7 @@
#include "../mptrack/TrackerSettings.h"
#endif // MODPLUG_TRACKER
#ifdef MPT_EXTERNAL_SAMPLES
-#include "../common/mptFileIO.h"
+#include "../common/mptPathString.h"
#endif // MPT_EXTERNAL_SAMPLES
#include "../common/mptIO.h"
#include "../common/serialization_utils.h"
@@ -642,28 +642,7 @@
std::string filenameU8;
file.ReadString<mpt::String::maybeNullTerminated>(filenameU8, strLen);
#ifdef MPT_EXTERNAL_SAMPLES
- mpt::PathString filename = mpt::PathString::FromUTF8(filenameU8);
-
- if(!filename.empty())
- {
- if(!file.GetFileName().empty())
- {
- filename = filename.RelativePathToAbsolute(file.GetFileName().GetPath());
- } else if(GetpModDoc() != nullptr)
- {
- filename = filename.RelativePathToAbsolute(GetpModDoc()->GetPathNameMpt().GetPath());
- }
- if(!LoadExternalSample(i + 1, filename))
- {
-#ifndef MODPLUG_TRACKER
- // OpenMPT has its own way of reporting this error
- AddToLog(LogError, mpt::String::Print(MPT_USTRING("Unable to load sample %1: %2"), i, filename.ToUnicode()));
-#endif // MODPLUG_TRACKER
- }
- } else
- {
- sample.uFlags.reset(SMP_KEEPONDISK);
- }
+ SetSamplePath(i + 1, mpt::PathString::FromUTF8(filenameU8));
#else
AddToLog(LogWarning, mpt::String::Print(MPT_USTRING("Loading external sample %1 ('%2') failed: External samples are not supported."), i, mpt::ToUnicode(mpt::CharsetUTF8, filenameU8)));
#endif // MPT_EXTERNAL_SAMPLES
Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Load_mt2.cpp 2014-12-01 13:52:00 UTC (rev 4621)
+++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2014-12-01 16:58:22 UTC (rev 4622)
@@ -13,10 +13,7 @@
#include "Loaders.h"
#ifdef MPT_EXTERNAL_SAMPLES
// For loading external samples
-#include "../common/mptFileIO.h"
-#ifdef MODPLUG_TRACKER
-#include "../mptrack/Moddoc.h"
-#endif // MODPLUG_TRACKER
+#include "../common/mptPathString.h"
#endif // MPT_EXTERNAL_SAMPLES
OPENMPT_NAMESPACE_BEGIN
@@ -1057,36 +1054,14 @@
mpt::String::Copy(mptSmp.filename, filename);
#ifdef MPT_EXTERNAL_SAMPLES
- mpt::PathString path(mpt::PathString::FromLocale(filename));
- mpt::PathString mt2FileName;
- if(!file.GetFileName().empty())
+ if(filename.length() >= 2
+ && filename.at(0) != '\\' // Relative path on same drive
+ && filename.at(1) != ':') // Absolute path
{
- mt2FileName = file.GetFileName();
-#ifdef MODPLUG_TRACKER
- } else if(GetpModDoc() != nullptr)
- {
- mt2FileName = GetpModDoc()->GetPathNameMpt();
-#endif // MODPLUG_TRACKER
+ // Relative path in same folder or sub folder
+ filename = ".\\" + filename;
}
- if(!mt2FileName.empty())
- {
- std::wstring pathStart = path.ToWide().substr(0, 2);
- if(pathStart.length() >= 2
- && pathStart.at(0) != L'\\'
- && pathStart.at(1) != L':')
- {
- // Relative path in sub directory
- path = MPT_PATHSTRING(".\\") + path;
- }
- path = path.RelativePathToAbsolute(mt2FileName.GetPath());
- }
- if(!LoadExternalSample(i + 1, path))
- {
-#ifndef MODPLUG_TRACKER
- // OpenMPT has its own way of reporting this error
- AddToLog(LogError, mpt::String::Print(MPT_USTRING("Unable to load sample %1: %2"), i, path.ToUnicode()));
-#endif // MODPLUG_TRACKER
- }
+ SetSamplePath(i + 1, mpt::PathString::FromLocale(filename));
#else
#if defined(MPT_WITH_CHARSET_LOCALE)
AddToLog(LogWarning, mpt::String::Print(MPT_USTRING("Loading external sample %1 ('%2') failed: External samples are not supported."), i, mpt::ToUnicode(mpt::CharsetLocale, filename)));
Modified: trunk/OpenMPT/soundlib/Sndfile.cpp
===================================================================
--- trunk/OpenMPT/soundlib/Sndfile.cpp 2014-12-01 13:52:00 UTC (rev 4621)
+++ trunk/OpenMPT/soundlib/Sndfile.cpp 2014-12-01 16:58:22 UTC (rev 4622)
@@ -850,26 +850,50 @@
m_PlayState.Chn[ich].Reset(ModChannel::resetTotal, *this, ich);
}
- // Checking samples
- ModSample *pSmp = Samples;
- for(SAMPLEINDEX nSmp = 0; nSmp < MAX_SAMPLES; nSmp++, pSmp++)
+ // Checking samples, load external samples
+ for(SAMPLEINDEX nSmp = 1; nSmp < MAX_SAMPLES; nSmp++)
{
// Adjust song / sample names
mpt::String::SetNullTerminator(m_szNames[nSmp]);
+ ModSample &sample = Samples[nSmp];
- if(pSmp->pSample)
+#ifdef MPT_EXTERNAL_SAMPLES
+ if(SampleHasPath(nSmp))
{
- pSmp->PrecomputeLoops(*this, false);
+ mpt::PathString filename = GetSamplePath(nSmp);
+ if(!file.GetFileName().empty())
+ {
+ filename = filename.RelativePathToAbsolute(file.GetFileName().GetPath());
+ } else if(GetpModDoc() != nullptr)
+ {
+ filename = filename.RelativePathToAbsolute(GetpModDoc()->GetPathNameMpt().GetPath());
+ }
+ if(!LoadExternalSample(nSmp, filename))
+ {
+#ifndef MODPLUG_TRACKER
+ // OpenMPT has its own way of reporting this error in CModDoc.
+ AddToLog(LogError, mpt::String::Print(MPT_USTRING("Unable to load sample %1: %2"), i, filename.ToUnicode()));
+#endif // MODPLUG_TRACKER
+ }
} else
{
- pSmp->nLength = 0;
- pSmp->nLoopStart = 0;
- pSmp->nLoopEnd = 0;
- pSmp->nSustainStart = 0;
- pSmp->nSustainEnd = 0;
- pSmp->uFlags.reset(CHN_LOOP | CHN_PINGPONGLOOP | CHN_SUSTAINLOOP | CHN_PINGPONGSUSTAIN);
+ sample.uFlags.reset(SMP_KEEPONDISK);
}
- if(pSmp->nGlobalVol > 64) pSmp->nGlobalVol = 64;
+#endif // MPT_EXTERNAL_SAMPLES
+
+ if(sample.pSample)
+ {
+ sample.PrecomputeLoops(*this, false);
+ } else if(!sample.uFlags[SMP_KEEPONDISK])
+ {
+ sample.nLength = 0;
+ sample.nLoopStart = 0;
+ sample.nLoopEnd = 0;
+ sample.nSustainStart = 0;
+ sample.nSustainEnd = 0;
+ sample.uFlags.reset(CHN_LOOP | CHN_PINGPONGLOOP | CHN_SUSTAINLOOP | CHN_PINGPONGSUSTAIN);
+ }
+ if(sample.nGlobalVol > 64) sample.nGlobalVol = 64;
}
// Check invalid instruments
while ((m_nInstruments > 0) && (!Instruments[m_nInstruments])) m_nInstruments--;
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|