measure start and length in samples

This commit is contained in:
Glenn Maynard
2002-12-20 02:00:43 +00:00
parent 13fee58c65
commit 878ebe7aae
2 changed files with 23 additions and 23 deletions
+22 -22
View File
@@ -77,8 +77,8 @@ RageSound::RageSound()
AutoStop = true;
speed = 1.0f;
stream.buf.reserve(internal_buffer_size);
m_StartSeconds = 0;
m_LengthSeconds = -1;
m_StartSample = 0;
m_LengthSamples = -1;
AccurateSync = false;
/* Register ourselves, so we receive Update()s. */
SOUNDMAN->all_sounds.insert(this);
@@ -102,8 +102,8 @@ RageSound::RageSound(const RageSound &cpy)
full_buf = cpy.full_buf;
big = cpy.big;
m_sFilePath = cpy.m_sFilePath;
m_StartSeconds = cpy.m_StartSeconds;
m_LengthSeconds = cpy.m_LengthSeconds;
m_StartSample = cpy.m_StartSample;
m_LengthSamples = cpy.m_LengthSamples;
Loop = cpy.Loop;
position = cpy.position;
playing = false;
@@ -214,12 +214,12 @@ void RageSound::Load(CString sSoundFilePath, bool cache)
void RageSound::SetStartSeconds( float secs )
{
m_StartSeconds = secs;
m_StartSample = int(secs*samplerate);
}
void RageSound::SetLengthSeconds(float secs)
{
m_LengthSeconds = secs;
m_LengthSamples = int(secs*samplerate);
}
/* Start playing from the current position. If the sound is already
@@ -315,11 +315,11 @@ int RageSound::GetPCM(char *buffer, int size, int sampleno)
{
int got;
int MaxBytes;
if(m_LengthSeconds != -1)
if(m_LengthSamples != -1)
{
/* We have a length; only read up to the end. MaxPosition is the
* sample position of the end. */
int MaxPosition = int((m_StartSeconds + m_LengthSeconds) * samplerate);
int MaxPosition = m_StartSample + m_LengthSamples;
/* Number of bytes until MaxPosition. */
MaxBytes = (MaxPosition - position) * samplesize;
@@ -368,16 +368,16 @@ int RageSound::GetPCM(char *buffer, int size, int sampleno)
HitEOF = false; /* we have more */
}
/* If we've passed the stop point (m_StartSeconds+m_LengthSeconds), pretend
/* If we've passed the stop point (m_StartSample+m_LengthSamples), pretend
* we've hit EOF. */
if(m_LengthSeconds != -1 &&
float(position)/samplerate >= m_StartSeconds+m_LengthSeconds)
if(m_LengthSamples != -1 &&
position >= m_StartSample+m_LengthSamples)
HitEOF = true;
if(!HitEOF)
continue;
if(Loop && m_LengthSeconds == 0)
if(Loop && m_LengthSamples == 0)
{
/* Oops. Looping with seconds == 0 doesn't make much sense.
* It might happen if we're given an empty sound file as input,
@@ -386,10 +386,10 @@ int RageSound::GetPCM(char *buffer, int size, int sampleno)
}
/* We're at EOF. If we're not looping, just stop. */
if(Loop && m_LengthSeconds != 0)
if(Loop && m_LengthSamples != 0)
{
/* Rewind and start over. */
SetPositionSeconds(m_StartSeconds);
SetPositionSeconds(float(m_StartSample) / samplerate);
continue;
}
if(AutoStop)
@@ -410,18 +410,18 @@ int RageSound::GetPCM(char *buffer, int size, int sampleno)
const float FADE_TIME = 1.5f;
/* XXX: Loop shouldn't set fading; add a Fade_Time member?
*
* We want to fade when there's FADE_TIME seconds left, but if
* m_LengthSeconds is -1, we don't know the length we're playing.
* (m_LengthSeconds is the length to play, not the length of the
* source.) If we don't know the length, don't fade. */
if(Loop && m_LengthSeconds != -1) {
*
* We want to fade when there's FADE_TIME seconds left, but if
* m_LengthSamples is -1, we don't know the length we're playing.
* (m_LengthSamples is the length to play, not the length of the
* source.) If we don't know the length, don't fade. */
if(Loop && m_LengthSamples != -1) {
Sint16 *p = (Sint16 *) buffer;
int this_position = position;
for(int samp = 0; samp < got_samples; ++samp)
{
float fSecsUntilSilent = (m_StartSeconds + m_LengthSeconds) - float(this_position)/samplerate;
float fSecsUntilSilent = float(m_StartSample + m_LengthSamples - this_position) / samplerate;
float fVolPercent = fSecsUntilSilent / FADE_TIME;
fVolPercent = clamp(fVolPercent, 0.f, 1.f);
@@ -468,7 +468,7 @@ void RageSound::Stop()
/* Tell the sound manager to stop mixing this sound. */
SOUNDMAN->StopMixing(this);
SetPositionSeconds(m_StartSeconds);
SetPositionSeconds(float(m_StartSample)/samplerate);
playing = false;
for(int i = 0; i < 4; ++i)
+1 -1
View File
@@ -58,7 +58,7 @@ class RageSound
// float m_Rate;
/* The amount of data to play (or loop): */
float m_StartSeconds, m_LengthSeconds;
int m_StartSample, m_LengthSamples;
bool Loop;
/* Current position of the output sound; if < 0, nothing will play until it