diff --git a/stepmania/src/RageSound.cpp b/stepmania/src/RageSound.cpp index 936e74b0c7..fedb9dc601 100644 --- a/stepmania/src/RageSound.cpp +++ b/stepmania/src/RageSound.cpp @@ -183,10 +183,12 @@ bool RageSound::Load( RString sSoundFilePath, bool bPrecache, const RageSoundLoa /* If this sound is already preloaded and held by SOUNDMAN, just make a copy * of that. Since RageSoundReader_Preload is refcounted, this is cheap. */ RageSoundReader *pSound = SOUNDMAN->GetLoadedSound( sSoundFilePath ); + bool bNeedBuffer = true; if( pSound == NULL ) { RString error; - pSound = RageSoundReader_FileReader::OpenFile( sSoundFilePath, error ); + bool bPrebuffer; + pSound = RageSoundReader_FileReader::OpenFile( sSoundFilePath, error, &bPrebuffer ); if( pSound == NULL ) { LOG->Warn( "RageSound::Load: error opening sound \"%s\": %s", @@ -194,11 +196,16 @@ bool RageSound::Load( RString sSoundFilePath, bool bPrecache, const RageSoundLoa pSound = new RageSoundReader_Silence; } + + /* If the sound is prebuffered into memory, we don't need to buffer reads. */ + if( bPrebuffer ) + bNeedBuffer = false; } else { /* The sound we were given from SOUNDMAN is already preloaded. */ bPrecache = false; + bNeedBuffer = false; } LoadSoundReader( pSound ); @@ -211,15 +218,12 @@ bool RageSound::Load( RString sSoundFilePath, bool bPrecache, const RageSoundLoa { /* We've preloaded the sound. Pass it to SOUNDMAN, for reuse. */ SOUNDMAN->AddLoadedSound( sSoundFilePath, (RageSoundReader_Preload *) m_pSource ); - } - else - { - bPrecache = false; + bNeedBuffer = false; } } m_pSource = new RageSoundReader_Extend( m_pSource ); - if( !bPrecache ) + if( bNeedBuffer ) m_pSource = new RageSoundReader_ThreadedBuffer( m_pSource ); m_pSource = new RageSoundReader_PostBuffering( m_pSource ); diff --git a/stepmania/src/RageSoundReader_Chain.cpp b/stepmania/src/RageSoundReader_Chain.cpp index 4d3c32dc89..df851da3ec 100644 --- a/stepmania/src/RageSoundReader_Chain.cpp +++ b/stepmania/src/RageSoundReader_Chain.cpp @@ -76,7 +76,8 @@ int RageSoundReader_Chain::LoadSound( RString sPath ) } RString sError; - RageSoundReader *pReader = RageSoundReader_FileReader::OpenFile( sPath, sError ); + bool bPrebuffer; + RageSoundReader *pReader = RageSoundReader_FileReader::OpenFile( sPath, sError, &bPrebuffer ); if( pReader == NULL ) { LOG->Warn( "RageSoundReader_Chain: error opening sound \"%s\": %s", diff --git a/stepmania/src/RageSoundReader_FileReader.cpp b/stepmania/src/RageSoundReader_FileReader.cpp index bcf68298b9..6f651f88b4 100644 --- a/stepmania/src/RageSoundReader_FileReader.cpp +++ b/stepmania/src/RageSoundReader_FileReader.cpp @@ -83,28 +83,49 @@ RageSoundReader_FileReader *RageSoundReader_FileReader::TryOpenFile( RageFileBas return NULL; } -RageSoundReader_FileReader *RageSoundReader_FileReader::OpenFile( RString filename, RString &error ) +#include "RageFileDriverMemory.h" + +RageSoundReader_FileReader *RageSoundReader_FileReader::OpenFile( RString filename, RString &error, bool *pPrebuffer ) { - RageFile *pFile = new RageFile; - if( !pFile->Open(filename) ) + RageFileBasic *pFile = NULL; { - error = pFile->GetError(); - delete pFile; - return NULL; + RageFile *pFileOpen = new RageFile; + if( !pFileOpen->Open(filename) ) + { + error = pFile->GetError(); + delete pFileOpen; + return NULL; + } + pFile = pFileOpen; } - return OpenFile( pFile, error ); -} - - -RageSoundReader_FileReader *RageSoundReader_FileReader::OpenFile( RageFileBasic *pFile, RString &error ) -{ + if( pPrebuffer ) + { + if( pFile->GetFileSize() < 1024*50 ) + { + RageFileObjMem *pMem = new RageFileObjMem; + bool bRet = FileCopy( *pFile, *pMem, error, NULL ); + delete pFile; + pFile = pMem; + if( !bRet ) + { + delete pFile; + return NULL; + } + pFile->Seek( 0 ); + *pPrebuffer = true; + } + else + { + *pPrebuffer = false; + } + } set FileTypes; FileTypes.insert("ogg"); FileTypes.insert("mp3"); FileTypes.insert("wav"); - RString format = GetExtension( pFile->GetDisplayPath() ); + RString format = GetExtension( filename ); format.MakeLower(); error = ""; diff --git a/stepmania/src/RageSoundReader_FileReader.h b/stepmania/src/RageSoundReader_FileReader.h index 6f949f8e39..7184939a33 100644 --- a/stepmania/src/RageSoundReader_FileReader.h +++ b/stepmania/src/RageSoundReader_FileReader.h @@ -31,9 +31,10 @@ public: virtual float GetStreamToSourceRatio() const { return 1.0f; } virtual RString GetError() const { return m_sError; } - /* Takes ownership of pFile (even on failure). */ - static RageSoundReader_FileReader *OpenFile( RageFileBasic *pFile, RString &error ); - static RageSoundReader_FileReader *OpenFile( RString filename, RString &error ); + /* Open a file. If pPrebuffer is non-NULL, and the file is sufficiently small, + * the (possibly compressed) data will be loaded entirely into memory, and pPrebuffer + * will be set to true. */ + static RageSoundReader_FileReader *OpenFile( RString filename, RString &error, bool *pPrebuffer = NULL ); protected: void SetError( RString sError ) const { m_sError = sError; }