s/SoundReader_Preload/RageSoundReader_Preload/
split RageSoundReader_Preload::PreloadSound split RageSound::LoadSoundReader
This commit is contained in:
+31
-33
@@ -172,52 +172,50 @@ bool RageSound::Load( CString sSoundFilePath, int precache )
|
|||||||
if(precache == 2)
|
if(precache == 2)
|
||||||
precache = false;
|
precache = false;
|
||||||
|
|
||||||
/* Don't load over copies. */
|
|
||||||
ASSERT(original == this || m_sFilePath == "");
|
|
||||||
|
|
||||||
Unload();
|
|
||||||
|
|
||||||
m_sFilePath = sSoundFilePath;
|
|
||||||
decode_position = stopped_position = 0;
|
|
||||||
|
|
||||||
CString error;
|
CString error;
|
||||||
Sample = SoundReader_FileReader::OpenFile( m_sFilePath, error );
|
SoundReader *pSound = SoundReader_FileReader::OpenFile( sSoundFilePath, error );
|
||||||
if( Sample == NULL )
|
if( pSound == NULL )
|
||||||
{
|
{
|
||||||
LOG->Warn( "RageSound::Load: error opening sound \"%s\": %s",
|
LOG->Warn( "RageSound::Load: error opening sound \"%s\": %s",
|
||||||
m_sFilePath.c_str(), error.c_str() );
|
sSoundFilePath.c_str(), error.c_str() );
|
||||||
|
|
||||||
Sample = new RageSoundReader_Silence;
|
pSound = new RageSoundReader_Silence;
|
||||||
}
|
|
||||||
|
|
||||||
const int NeededRate = SOUNDMAN->GetDriverSampleRate( Sample->GetSampleRate() );
|
|
||||||
if( NeededRate != Sample->GetSampleRate() )
|
|
||||||
{
|
|
||||||
RageSoundReader_Resample *Resample = RageSoundReader_Resample::MakeResampler( (RageSoundReader_Resample::ResampleQuality) PREFSMAN->m_iSoundResampleQuality );
|
|
||||||
Resample->Open(Sample);
|
|
||||||
Resample->SetSampleRate( NeededRate );
|
|
||||||
Sample = Resample;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try to precache. */
|
/* Try to precache. */
|
||||||
if(precache)
|
if( precache )
|
||||||
{
|
RageSoundReader_Preload::PreloadSound( pSound );
|
||||||
SoundReader_Preload *Preload = new SoundReader_Preload;
|
|
||||||
if(Preload->Open(Sample)) {
|
LoadSoundReader( pSound );
|
||||||
Sample = Preload;
|
|
||||||
} else {
|
m_sFilePath = sSoundFilePath;
|
||||||
/* Preload failed. It read some data, so we need to rewind the
|
|
||||||
* reader. */
|
|
||||||
Sample->SetPosition_Fast(0);
|
|
||||||
delete Preload;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m_Mutex.SetName( ssprintf("RageSound (%s)", Basename(sSoundFilePath).c_str() ) );
|
m_Mutex.SetName( ssprintf("RageSound (%s)", Basename(sSoundFilePath).c_str() ) );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RageSound::LoadSoundReader( SoundReader *pSound )
|
||||||
|
{
|
||||||
|
/* Don't load over copies. */
|
||||||
|
ASSERT( original == this || m_sFilePath == "" );
|
||||||
|
|
||||||
|
Unload();
|
||||||
|
|
||||||
|
decode_position = stopped_position = 0;
|
||||||
|
|
||||||
|
const int NeededRate = SOUNDMAN->GetDriverSampleRate( pSound->GetSampleRate() );
|
||||||
|
if( NeededRate != pSound->GetSampleRate() )
|
||||||
|
{
|
||||||
|
RageSoundReader_Resample *Resample = RageSoundReader_Resample::MakeResampler( (RageSoundReader_Resample::ResampleQuality) PREFSMAN->m_iSoundResampleQuality );
|
||||||
|
Resample->Open( pSound );
|
||||||
|
Resample->SetSampleRate( NeededRate );
|
||||||
|
pSound = Resample;
|
||||||
|
}
|
||||||
|
|
||||||
|
Sample = pSound;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return the number of bytes available in the input buffer. */
|
/* Return the number of bytes available in the input buffer. */
|
||||||
int RageSound::Bytes_Available() const
|
int RageSound::Bytes_Available() const
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -92,6 +92,10 @@ public:
|
|||||||
* they can be ignored most of the time, so we continue to work if a file
|
* they can be ignored most of the time, so we continue to work if a file
|
||||||
* is broken or missing.) */
|
* is broken or missing.) */
|
||||||
bool Load(CString fn, int precache = 2);
|
bool Load(CString fn, int precache = 2);
|
||||||
|
|
||||||
|
/* Load a SoundReader that you've set up yourself. Sample rate conversion will
|
||||||
|
* be set up only if needed. Doesn't fail. */
|
||||||
|
void LoadSoundReader( SoundReader *pSound );
|
||||||
void Unload();
|
void Unload();
|
||||||
|
|
||||||
void StartPlaying();
|
void StartPlaying();
|
||||||
|
|||||||
@@ -10,12 +10,27 @@
|
|||||||
/* If a sound is smaller than this, we'll load it entirely into memory. */
|
/* If a sound is smaller than this, we'll load it entirely into memory. */
|
||||||
const unsigned max_prebuf_size = 1024*256;
|
const unsigned max_prebuf_size = 1024*256;
|
||||||
|
|
||||||
int SoundReader_Preload::total_samples() const
|
bool RageSoundReader_Preload::PreloadSound( SoundReader *&pSound )
|
||||||
|
{
|
||||||
|
RageSoundReader_Preload *pPreload = new RageSoundReader_Preload;
|
||||||
|
if( !pPreload->Open(pSound) )
|
||||||
|
{
|
||||||
|
/* Preload failed. It read some data, so we need to rewind the reader. */
|
||||||
|
pSound->SetPosition_Fast( 0 );
|
||||||
|
delete pPreload;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
pSound = pPreload;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
int RageSoundReader_Preload::total_samples() const
|
||||||
{
|
{
|
||||||
return buf.get().size() / samplesize;
|
return buf.get().size() / samplesize;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SoundReader_Preload::Open(SoundReader *source)
|
bool RageSoundReader_Preload::Open(SoundReader *source)
|
||||||
{
|
{
|
||||||
ASSERT(source);
|
ASSERT(source);
|
||||||
samplerate = source->GetSampleRate();
|
samplerate = source->GetSampleRate();
|
||||||
@@ -58,17 +73,17 @@ bool SoundReader_Preload::Open(SoundReader *source)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoundReader_Preload::GetLength() const
|
int RageSoundReader_Preload::GetLength() const
|
||||||
{
|
{
|
||||||
return int(float(total_samples()) * 1000.f / samplerate);
|
return int(float(total_samples()) * 1000.f / samplerate);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoundReader_Preload::GetLength_Fast() const
|
int RageSoundReader_Preload::GetLength_Fast() const
|
||||||
{
|
{
|
||||||
return GetLength();
|
return GetLength();
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoundReader_Preload::SetPosition_Accurate(int ms)
|
int RageSoundReader_Preload::SetPosition_Accurate(int ms)
|
||||||
{
|
{
|
||||||
const int sample = int((ms / 1000.0f) * samplerate);
|
const int sample = int((ms / 1000.0f) * samplerate);
|
||||||
position = sample * samplesize;
|
position = sample * samplesize;
|
||||||
@@ -82,12 +97,12 @@ int SoundReader_Preload::SetPosition_Accurate(int ms)
|
|||||||
return position;
|
return position;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoundReader_Preload::SetPosition_Fast(int ms)
|
int RageSoundReader_Preload::SetPosition_Fast(int ms)
|
||||||
{
|
{
|
||||||
return SetPosition_Accurate(ms);
|
return SetPosition_Accurate(ms);
|
||||||
}
|
}
|
||||||
|
|
||||||
int SoundReader_Preload::Read(char *buffer, unsigned len)
|
int RageSoundReader_Preload::Read(char *buffer, unsigned len)
|
||||||
{
|
{
|
||||||
const unsigned bytes_avail = buf.get().size() - position;
|
const unsigned bytes_avail = buf.get().size() - position;
|
||||||
|
|
||||||
@@ -98,9 +113,9 @@ int SoundReader_Preload::Read(char *buffer, unsigned len)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
SoundReader *SoundReader_Preload::Copy() const
|
SoundReader *RageSoundReader_Preload::Copy() const
|
||||||
{
|
{
|
||||||
return new SoundReader_Preload(*this);
|
return new RageSoundReader_Preload(*this);
|
||||||
}
|
}
|
||||||
|
|
||||||
rc_string::rc_string()
|
rc_string::rc_string()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SoundReader_Preload - Preload sounds from another reader
|
* RageSoundReader_Preload - Preload sounds from another reader
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef RAGE_SOUND_READER_PRELOAD
|
#ifndef RAGE_SOUND_READER_PRELOAD
|
||||||
@@ -22,7 +22,7 @@ public:
|
|||||||
const string &get() const;
|
const string &get() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SoundReader_Preload: public SoundReader
|
class RageSoundReader_Preload: public SoundReader
|
||||||
{
|
{
|
||||||
rc_string buf;
|
rc_string buf;
|
||||||
|
|
||||||
@@ -49,7 +49,10 @@ public:
|
|||||||
bool IsStreamingFromDisk() const { return false; }
|
bool IsStreamingFromDisk() const { return false; }
|
||||||
|
|
||||||
SoundReader *Copy() const;
|
SoundReader *Copy() const;
|
||||||
~SoundReader_Preload() { }
|
~RageSoundReader_Preload() { }
|
||||||
|
|
||||||
|
/* Attempt to preload a sound. pSound must be rewound. */
|
||||||
|
static bool PreloadSound( SoundReader *&pSound );
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
Reference in New Issue
Block a user