From: <man...@us...> - 2014-10-25 12:47:56
|
Revision: 4487 http://sourceforge.net/p/modplug/code/4487 Author: manxorist Date: 2014-10-25 12:47:41 +0000 (Sat, 25 Oct 2014) Log Message: ----------- [Ref] Move CMappedFile to mptFstream.h. [Ref] Add class Inputfile that wraps the differences of using either mpt::ifstream or CMappedFile. [Ref] Convert CMappedFile::GetFile() to GetFileReader(CMappedFile&) or GetFileReader(InputFile&). [Ref] Note: Work left to do (not done here in order to separate functional refactoring from moving files around): common/mptFstream.h should be renamed to commmon/mptFileIO.h. common/mptFileIO.cpp and soundlib/FileReader.cpp should be introduced. mptrack/MemoryMappedFile.* should be deleted. Modified Paths: -------------- trunk/OpenMPT/common/mptFstream.h trunk/OpenMPT/common/mptIO.cpp trunk/OpenMPT/mptrack/Ctrl_ins.cpp trunk/OpenMPT/mptrack/Ctrl_smp.cpp trunk/OpenMPT/mptrack/MainFrm.cpp trunk/OpenMPT/mptrack/MemoryMappedFile.cpp trunk/OpenMPT/mptrack/MemoryMappedFile.h trunk/OpenMPT/mptrack/Moddoc.cpp trunk/OpenMPT/mptrack/View_tre.cpp trunk/OpenMPT/mptrack/Vstplug.cpp trunk/OpenMPT/soundlib/FileReader.h trunk/OpenMPT/soundlib/Load_itp.cpp trunk/OpenMPT/soundlib/Load_mt2.cpp trunk/OpenMPT/soundlib/Sndfile.cpp Modified: trunk/OpenMPT/common/mptFstream.h =================================================================== --- trunk/OpenMPT/common/mptFstream.h 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/common/mptFstream.h 2014-10-25 12:47:41 UTC (rev 4487) @@ -18,6 +18,7 @@ #include "../common/mptPathString.h" #if defined(MPT_WITH_PATHSTRING) #include "../common/mptIO.h" +#include <utility> #endif @@ -489,6 +490,64 @@ } // namespace mpt + +#ifdef MODPLUG_TRACKER +//=============== +class CMappedFile +//=============== +{ +protected: + HANDLE m_hFile; + HANDLE m_hFMap; + void *m_pData; + mpt::PathString m_FileName; + +public: + CMappedFile() : m_hFile(nullptr), m_hFMap(nullptr), m_pData(nullptr) { } + ~CMappedFile(); + +public: + bool Open(const mpt::PathString &filename); + bool IsOpen() const { return m_hFile != NULL && m_hFile != INVALID_HANDLE_VALUE; } + const mpt::PathString * GetpFilename() const { return &m_FileName; } + void Close(); + size_t GetLength(); + const void *Lock(); +}; +#endif // MODPLUG_TRACKER + + +//============= +class InputFile +//============= +{ +private: + mpt::PathString m_Filename; + #ifdef MPT_FILEREADER_STD_ISTREAM + mpt::ifstream m_File; + #else + CMappedFile m_File; + #endif +public: + InputFile(); + InputFile(const mpt::PathString &filename); + ~InputFile(); + bool Open(const mpt::PathString &filename); + bool IsValid() const; +#if defined(MPT_FILEREADER_STD_ISTREAM) + typedef std::pair<std::istream*, const mpt::PathString*> ContentsRef; +#else + struct Data + { + const char *data; + std::size_t size; + }; + typedef std::pair<InputFile::Data, const mpt::PathString*> ContentsRef; +#endif + InputFile::ContentsRef Get(); +}; + + #endif // MPT_WITH_PATHSTRING Modified: trunk/OpenMPT/common/mptIO.cpp =================================================================== --- trunk/OpenMPT/common/mptIO.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/common/mptIO.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -255,3 +255,219 @@ OPENMPT_NAMESPACE_END + + +// following ode should be moved to common/mptFileIO.cpp and common/mptFstream.h should be renamed to common/mptFileIO.h. + +#include "mptFstream.h" + + +OPENMPT_NAMESPACE_BEGIN + + +#ifdef MODPLUG_TRACKER + +CMappedFile::~CMappedFile() +//------------------------- +{ + Close(); +} + + +bool CMappedFile::Open(const mpt::PathString &filename) +//----------------------------------------------------- +{ + m_hFile = CreateFileW( + filename.AsNative().c_str(), + GENERIC_READ, + FILE_SHARE_READ, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + if(m_hFile == INVALID_HANDLE_VALUE) + { + m_hFile = nullptr; + return false; + } + m_FileName = filename; + return true; +} + + +void CMappedFile::Close() +//----------------------- +{ + m_FileName = mpt::PathString(); + // Unlock file + if(m_hFMap) + { + if(m_pData) + { + UnmapViewOfFile(m_pData); + m_pData = nullptr; + } + CloseHandle(m_hFMap); + m_hFMap = nullptr; + } else if(m_pData) + { + free(m_pData); + m_pData = nullptr; + } + + // Close file handle + if(m_hFile) + { + CloseHandle(m_hFile); + m_hFile = nullptr; + } +} + + +size_t CMappedFile::GetLength() +//----------------------------- +{ + LARGE_INTEGER size; + if(GetFileSizeEx(m_hFile, &size) == FALSE) + { + return 0; + } + return mpt::saturate_cast<size_t>(size.QuadPart); +} + + +const void *CMappedFile::Lock() +//----------------------------- +{ + size_t length = GetLength(); + if(!length) return nullptr; + + void *lpStream; + + HANDLE hmf = CreateFileMapping( + m_hFile, + NULL, + PAGE_READONLY, + 0, 0, + NULL); + + // Try memory-mapping first + if(hmf) + { + lpStream = MapViewOfFile( + hmf, + FILE_MAP_READ, + 0, 0, + length); + if(lpStream) + { + m_hFMap = hmf; + m_pData = lpStream; + return lpStream; + } + CloseHandle(hmf); + hmf = nullptr; + } + + // Fallback if memory-mapping fails for some weird reason + if((lpStream = malloc(length)) == nullptr) return nullptr; + memset(lpStream, 0, length); + size_t bytesToRead = length; + size_t bytesRead = 0; + while(bytesToRead > 0) + { + DWORD chunkToRead = mpt::saturate_cast<DWORD>(length); + DWORD chunkRead = 0; + if(ReadFile(m_hFile, (char*)lpStream + bytesRead, chunkToRead, &chunkRead, NULL) == FALSE) + { + // error + free(lpStream); + return nullptr; + } + bytesRead += chunkRead; + bytesToRead -= chunkRead; + } + m_pData = lpStream; + return lpStream; +} + + +#endif // MODPLUG_TRACKER + + + +InputFile::InputFile() +{ + return; +} + +InputFile::InputFile(const mpt::PathString &filename) + : m_Filename(filename) +{ + #if defined(MPT_FILEREADER_STD_ISTREAM) + m_File.open(m_Filename, std::ios::binary | std::ios::in); + #else + m_File.Open(m_Filename); + #endif +} + +InputFile::~InputFile() +{ + return; +} + + +bool InputFile::Open(const mpt::PathString &filename) +{ + m_Filename = filename; + #if defined(MPT_FILEREADER_STD_ISTREAM) + m_File.open(m_Filename, std::ios::binary | std::ios::in); + return m_File.good(); + #else + return m_File.Open(m_Filename); + #endif +} + + +bool InputFile::IsValid() const +{ + #if defined(MPT_FILEREADER_STD_ISTREAM) + return m_File.good(); + #else + return m_File.IsOpen(); + #endif +} + +#if defined(MPT_FILEREADER_STD_ISTREAM) + +InputFile::ContentsRef InputFile::Get() +{ + InputFile::ContentsRef result; + result.first = &m_File; + result.second = m_File.good() ? &m_Filename : nullptr; + return result; +} + +#else + +InputFile::ContentsRef InputFile::Get() +{ + InputFile::ContentsRef result; + result.first.data = nullptr; + result.first.size = 0; + result.second = nullptr; + if(!m_File.IsOpen()) + { + return result; + } + result.first.data = reinterpret_cast<const char*>(m_File.Lock()); + result.first.size = m_File.GetLength(); + result.second = &m_Filename; + return result; +} + +#endif + + + +OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/Ctrl_ins.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/Ctrl_ins.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -1433,7 +1433,7 @@ } bFirst = FALSE; - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); bOk = FALSE; if (file.IsValid()) Modified: trunk/OpenMPT/mptrack/Ctrl_smp.cpp =================================================================== --- trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/Ctrl_smp.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -786,7 +786,7 @@ return false; } - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); if(!file.IsValid()) { EndWaitCursor(); Modified: trunk/OpenMPT/mptrack/MainFrm.cpp =================================================================== --- trunk/OpenMPT/mptrack/MainFrm.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/MainFrm.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -1528,7 +1528,7 @@ if(f.Open(filename)) { - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); if(file.IsValid()) { InitPreview(); Modified: trunk/OpenMPT/mptrack/MemoryMappedFile.cpp =================================================================== --- trunk/OpenMPT/mptrack/MemoryMappedFile.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/MemoryMappedFile.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -15,136 +15,6 @@ OPENMPT_NAMESPACE_BEGIN -CMappedFile::~CMappedFile() -//------------------------- -{ - Close(); -} -bool CMappedFile::Open(const mpt::PathString &filename) -//----------------------------------------------------- -{ - m_hFile = CreateFileW( - filename.AsNative().c_str(), - GENERIC_READ, - FILE_SHARE_READ, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - if(m_hFile == INVALID_HANDLE_VALUE) - { - m_hFile = nullptr; - return false; - } - m_FileName = filename; - return true; -} - - -void CMappedFile::Close() -//----------------------- -{ - m_FileName = mpt::PathString(); - // Unlock file - if(m_hFMap) - { - if(m_pData) - { - UnmapViewOfFile(m_pData); - m_pData = nullptr; - } - CloseHandle(m_hFMap); - m_hFMap = nullptr; - } else if(m_pData) - { - free(m_pData); - m_pData = nullptr; - } - - // Close file handle - if(m_hFile) - { - CloseHandle(m_hFile); - m_hFile = nullptr; - } -} - - -size_t CMappedFile::GetLength() -//----------------------------- -{ - LARGE_INTEGER size; - if(GetFileSizeEx(m_hFile, &size) == FALSE) - { - return 0; - } - return mpt::saturate_cast<size_t>(size.QuadPart); -} - - -const void *CMappedFile::Lock() -//----------------------------- -{ - size_t length = GetLength(); - if(!length) return nullptr; - - void *lpStream; - - HANDLE hmf = CreateFileMapping( - m_hFile, - NULL, - PAGE_READONLY, - 0, 0, - NULL); - - // Try memory-mapping first - if(hmf) - { - lpStream = MapViewOfFile( - hmf, - FILE_MAP_READ, - 0, 0, - length); - if(lpStream) - { - m_hFMap = hmf; - m_pData = lpStream; - return lpStream; - } - CloseHandle(hmf); - hmf = nullptr; - } - - // Fallback if memory-mapping fails for some weird reason - if((lpStream = malloc(length)) == nullptr) return nullptr; - memset(lpStream, 0, length); - size_t bytesToRead = length; - size_t bytesRead = 0; - while(bytesToRead > 0) - { - DWORD chunkToRead = mpt::saturate_cast<DWORD>(length); - DWORD chunkRead = 0; - if(ReadFile(m_hFile, (char*)lpStream + bytesRead, chunkToRead, &chunkRead, NULL) == FALSE) - { - // error - free(lpStream); - return nullptr; - } - bytesRead += chunkRead; - bytesToRead -= chunkRead; - } - m_pData = lpStream; - return lpStream; -} - - -FileReader CMappedFile::GetFile() -//------------------------------- -{ - return FileReader(Lock(), GetLength(), &m_FileName); -} - - OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/MemoryMappedFile.h =================================================================== --- trunk/OpenMPT/mptrack/MemoryMappedFile.h 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/MemoryMappedFile.h 2014-10-25 12:47:41 UTC (rev 4487) @@ -11,32 +11,8 @@ #pragma once #include "../soundlib/FileReader.h" +#include "../common/mptFstream.h" OPENMPT_NAMESPACE_BEGIN -////////////////////////////////////////////////////////////////// -// File Mapping Class - -//=============== -class CMappedFile -//=============== -{ -protected: - HANDLE m_hFile; - HANDLE m_hFMap; - void *m_pData; - mpt::PathString m_FileName; - -public: - CMappedFile() : m_hFile(nullptr), m_hFMap(nullptr), m_pData(nullptr) { } - ~CMappedFile(); - -public: - bool Open(const mpt::PathString &filename); - void Close(); - size_t GetLength(); - const void *Lock(); - FileReader GetFile(); -}; - OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/mptrack/Moddoc.cpp =================================================================== --- trunk/OpenMPT/mptrack/Moddoc.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/Moddoc.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -219,25 +219,16 @@ if(filename.empty()) return OnNewDocument(); BeginWaitCursor(); - #if defined(MPT_FILEREADER_STD_ISTREAM) - mpt::ifstream f(filename, std::ios_base::binary); - m_SndFile.Create(FileReader(&f, &filename), CSoundFile::loadCompleteModule, this); - #else + + InputFile f(filename); + if(f.IsValid()) { - CMappedFile f; - if (f.Open(filename)) - { - FileReader file = f.GetFile(); - if(file.IsValid()) - { - ASSERT(GetPathNameMpt() == mpt::PathString()); - SetPathName(filename, FALSE); // Path is not set yet, but ITP loader needs this for relative paths. + FileReader file = GetFileReader(f); + ASSERT(GetPathNameMpt() == mpt::PathString()); + SetPathName(filename, FALSE); // Path is not set yet, but ITP loader needs this for relative paths. + m_SndFile.Create(file, CSoundFile::loadCompleteModule, this); + } - m_SndFile.Create(file, CSoundFile::loadCompleteModule, this); - } - } - } - #endif EndWaitCursor(); logcapturer.ShowLog(std::wstring() @@ -345,7 +336,7 @@ if(f.Open(pszMidiMapName)) { - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); if(file.IsValid()) { m_SndFile.ReadInstrumentFromFile(nIns, file, false); @@ -687,7 +678,7 @@ for(size_t counter = 0; counter < files.size(); counter++) { CMappedFile mappedFile; - if(mappedFile.Open(files[counter]) && source.Create(mappedFile.GetFile(), CSoundFile::loadCompleteModule)) + if(mappedFile.Open(files[counter]) && source.Create(GetFileReader(mappedFile), CSoundFile::loadCompleteModule)) { AppendModule(source); source.Destroy(); Modified: trunk/OpenMPT/mptrack/View_tre.cpp =================================================================== --- trunk/OpenMPT/mptrack/View_tre.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/View_tre.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -364,7 +364,7 @@ if(f.Open(libPath + songName)) { - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); if(file.IsValid()) { if(m_SongFile != nullptr) Modified: trunk/OpenMPT/mptrack/Vstplug.cpp =================================================================== --- trunk/OpenMPT/mptrack/Vstplug.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/mptrack/Vstplug.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -1048,7 +1048,7 @@ const char *errorStr = nullptr; if(f.Open(fileName)) { - FileReader file = f.GetFile(); + FileReader file = GetFileReader(f); errorStr = VSTPresets::GetErrorMessage(VSTPresets::LoadFile(file, *this)); } else { Modified: trunk/OpenMPT/soundlib/FileReader.h =================================================================== --- trunk/OpenMPT/soundlib/FileReader.h 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/soundlib/FileReader.h 2014-10-25 12:47:41 UTC (rev 4487) @@ -58,7 +58,7 @@ off_t streamPos; // Cursor location in the file #if defined(MODPLUG_TRACKER) - mpt::PathString *fileName; // Filename that corresponds to this FileReader. It is only set if this FileReader represents the whole contents of fileName. May be nullptr. + const mpt::PathString *fileName; // Filename that corresponds to this FileReader. It is only set if this FileReader represents the whole contents of fileName. May be nullptr. #define MPT_FILEREADER_INIT_FILENAME ,fileName(nullptr) #else #define MPT_FILEREADER_INIT_FILENAME @@ -76,15 +76,15 @@ FileReader(const char *chardata, off_t length) : data(mpt::make_shared<FileDataContainerMemory>(chardata, length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } FileReader(const uint8 *uint8data, off_t length) : data(mpt::make_shared<FileDataContainerMemory>(reinterpret_cast<const char *>(uint8data), length)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } #if defined(MODPLUG_TRACKER) - FileReader(const void *voiddata, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(static_cast<const char *>(voiddata), length)), streamPos(0), fileName(filename) { } - FileReader(const char *chardata, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(chardata, length)), streamPos(0), fileName(filename) { } - FileReader(const uint8 *uint8data, off_t length, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(reinterpret_cast<const char *>(uint8data), length)), streamPos(0), fileName(filename) { } + FileReader(const void *voiddata, off_t length, const mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(static_cast<const char *>(voiddata), length)), streamPos(0), fileName(filename) { } + FileReader(const char *chardata, off_t length, const mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(chardata, length)), streamPos(0), fileName(filename) { } + FileReader(const uint8 *uint8data, off_t length, const mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerMemory>(reinterpret_cast<const char *>(uint8data), length)), streamPos(0), fileName(filename) { } #endif // Initialize file reader object with a std::istream. FileReader(std::istream *s) : data(mpt::make_shared<FileDataContainerStdStream>(s)), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } #if defined(MODPLUG_TRACKER) - FileReader(std::istream *s, mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerStdStream>(s)), streamPos(0), fileName(filename) { } + FileReader(std::istream *s, const mpt::PathString *filename) : data(mpt::make_shared<FileDataContainerStdStream>(s)), streamPos(0), fileName(filename) { } #endif // Initialize file reader object based on an existing file reader object window. @@ -107,9 +107,9 @@ FileReader(const char *chardata, off_t length) : data(chardata, length), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } FileReader(const uint8 *uint8data, off_t length) : data(reinterpret_cast<const char *>(uint8data), length), streamPos(0) MPT_FILEREADER_INIT_FILENAME { } #if defined(MODPLUG_TRACKER) - FileReader(const void *voiddata, off_t length, mpt::PathString *filename) : data(static_cast<const char *>(voiddata), length), streamPos(0), fileName(filename) { } - FileReader(const char *chardata, off_t length, mpt::PathString *filename) : data(chardata, length), streamPos(0), fileName(filename) { } - FileReader(const uint8 *uint8data, off_t length, mpt::PathString *filename) : data(reinterpret_cast<const char *>(uint8data), length), streamPos(0), fileName(filename) { } + FileReader(const void *voiddata, off_t length, const mpt::PathString *filename) : data(static_cast<const char *>(voiddata), length), streamPos(0), fileName(filename) { } + FileReader(const char *chardata, off_t length, const mpt::PathString *filename) : data(chardata, length), streamPos(0), fileName(filename) { } + FileReader(const uint8 *uint8data, off_t length, const mpt::PathString *filename) : data(reinterpret_cast<const char *>(uint8data), length), streamPos(0), fileName(filename) { } #endif // Initialize file reader object based on an existing file reader object. The other object's stream position is copied. @@ -775,4 +775,14 @@ }; +#if defined(MPT_WITH_PATHSTRING) +class InputFile; +FileReader GetFileReader(InputFile &file); +#ifdef MODPLUG_TRACKER +class CMappedFile; +FileReader GetFileReader(CMappedFile &file); +#endif +#endif // MPT_WITH_PATHSTRING + + OPENMPT_NAMESPACE_END Modified: trunk/OpenMPT/soundlib/Load_itp.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_itp.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/soundlib/Load_itp.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -20,12 +20,7 @@ #include "ITTools.h" #ifdef MODPLUG_TRACKER #include "../mptrack/TrackerSettings.h" -#if !defined(MPT_FILEREADER_STD_ISTREAM) -#include "../mptrack/MemoryMappedFile.h" -#endif -#ifndef MODPLUG_NO_FILESAVE #include "../common/mptFstream.h" -#endif #include "../mptrack/Moddoc.h" #endif @@ -263,17 +258,10 @@ { if(m_szInstrumentPath[ins].empty()) continue; -#if defined(MPT_FILEREADER_STD_ISTREAM) - mpt::ifstream f(m_szInstrumentPath[ins], std::ios_base::binary); - if(!f.good()) + InputFile f(m_szInstrumentPath[ins]); + if(!f.IsValid()) continue; - FileReader file(&f, &m_szInstrumentPath[ins]); -#else - CMappedFile f; - if(!f.Open(m_szInstrumentPath[ins])) - continue; - FileReader file = f.GetFile(); -#endif + FileReader file = GetFileReader(f); if(file.IsValid()) ReadInstrumentFromFile(ins + 1, file, TrackerSettings::Instance().m_MayNormalizeSamplesOnLoad); Modified: trunk/OpenMPT/soundlib/Load_mt2.cpp =================================================================== --- trunk/OpenMPT/soundlib/Load_mt2.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/soundlib/Load_mt2.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -13,11 +13,7 @@ #include "Loaders.h" #ifdef MODPLUG_TRACKER // For loading external samples -#if defined(MPT_FILEREADER_STD_ISTREAM) #include "../common/mptFstream.h" -#else -#include "../mptrack/MemoryMappedFile.h" -#endif #include "../mptrack/Moddoc.h" #endif @@ -1081,19 +1077,16 @@ path = path.RelativePathToAbsolute(mt2FileName.GetPath()); } -#if defined(MPT_FILEREADER_STD_ISTREAM) - mpt::ifstream f(path, std::ios_base::binary); - if(f.good()) - sampleFile = FileReader(&f, &path); -#else - CMappedFile f; - FileReader sampleFile; - if(f.Open(path)) - sampleFile = f.GetFile(); + InputFile f(path); + if(f.IsValid()) + { + FileReader sampleFile = GetFileReader(f); + if(sampleFile.IsValid()) + { + ReadSampleFromFile(i + 1, sampleFile, false); + } + } #endif - if(sampleFile.IsValid()) - ReadSampleFromFile(i + 1, sampleFile, false); -#endif } mptSmp.nC5Speed = freq; mptSmp.nFineTune = 0; Modified: trunk/OpenMPT/soundlib/Sndfile.cpp =================================================================== --- trunk/OpenMPT/soundlib/Sndfile.cpp 2014-10-25 11:43:51 UTC (rev 4486) +++ trunk/OpenMPT/soundlib/Sndfile.cpp 2014-10-25 12:47:41 UTC (rev 4487) @@ -24,6 +24,7 @@ #include "tuningcollection.h" #include "../common/StringFixer.h" #include "FileReader.h" +#include "../common/mptFstream.h" #include <sstream> #include <time.h> @@ -35,6 +36,56 @@ OPENMPT_NAMESPACE_BEGIN + +// Note: Following code should be moved to FileReader.cpp + +#ifdef MPT_WITH_PATHSTRING + +FileReader GetFileReader(InputFile &file) +{ + #if defined(MPT_FILEREADER_STD_ISTREAM) + InputFile::ContentsRef tmp = file.Get(); + if(!tmp.first) + { + return FileReader(); + } + if(!tmp.first->good()) + { + return FileReader(); + } + #ifdef MDPLUG_TRACKER + return FileReader(tmp.first, tmp.second); + #else + return FileReader(tmp.first); + #endif + #else + InputFile::ContentsRef tmp = file.Get(); + #ifdef MDPLUG_TRACKER + return FileReader(tmp.first.data, tmp.first.size, tmp.second); + #else + return FileReader(tmp.first.data, tmp.first.size); + #endif + #endif +} + +#ifdef MODPLUG_TRACKER + +FileReader GetFileReader(CMappedFile &file) +{ + if(!file.IsOpen()) + { + return FileReader(); + } + return FileReader(file.Lock(), file.GetLength(), file.GetpFilename()); +} + +#endif + +#endif // MPT_WITH_PATHSTRING + + + + // -> CODE#0027 // -> DESC="per-instrument volume ramping setup (refered as attack)" This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |