svn-id: r12116
This commit is contained in:
Max Horn 2004-01-03 19:12:23 +00:00
parent ee3558b748
commit cf6a5c0a04
2 changed files with 46 additions and 53 deletions

View File

@ -175,64 +175,58 @@ void MusicHandle::stop(void) {
} }
int MusicHandle::readBuffer(int16 *buffer, const int numSamples) { int MusicHandle::readBuffer(int16 *buffer, const int numSamples) {
assert(numSamples > 0);
int samples; int samples;
for (samples = 0; samples < numSamples && !endOfData(); samples++)
*buffer++ = read();
return samples;
}
int16 MusicHandle::read(void) {
uint8 in;
uint16 delta;
int16 out;
if (!_streaming)
return 0;
if (_firstTime) {
_lastSample = fpMus.readUint16LE();
_filePos += 2;
_firstTime = false;
return _lastSample;
}
// Assume the file handle has been correctly positioned already. // Assume the file handle has been correctly positioned already.
in = fpMus.readByte(); for (samples = 0; samples < numSamples && !endOfData(); samples++) {
delta = GetCompressedAmplitude(in) << GetCompressedShift(in); int16 out;
if (_firstTime) {
if (GetCompressedSign(in)) _lastSample = fpMus.readUint16LE();
out = _lastSample - delta; _filePos += 2;
else _firstTime = false;
out = _lastSample + delta; out = _lastSample;
} else {
_filePos++; uint8 in = fpMus.readByte();
_lastSample = out; uint16 delta = GetCompressedAmplitude(in) << GetCompressedShift(in);
if (_looping) { if (GetCompressedSign(in))
if (_filePos >= _fileEnd) { out = _lastSample - delta;
_firstTime = true; else
_filePos = _fileStart; out = _lastSample + delta;
fpMus.seek(_filePos, SEEK_SET);
_filePos++;
_lastSample = out;
if (_looping) {
if (_filePos >= _fileEnd) {
_firstTime = true;
_filePos = _fileStart;
fpMus.seek(_filePos, SEEK_SET);
}
} else {
// Fade out at the end of the music, unless it already is.
if (_fileEnd - _filePos <= FADE_SAMPLES && _fading <= 0)
fadeDown();
}
if (_fading > 0) {
if (--_fading == 0) {
_streaming = false;
_looping = false;
}
out = (out * _fading) / FADE_SAMPLES;
} else if (_fading < 0) {
_fading++;
out = (out * (FADE_SAMPLES + _fading)) / FADE_SAMPLES;
}
} }
} else {
// Fade out at the end of the music, unless it already is. *buffer++ = out;
if (_fileEnd - _filePos <= FADE_SAMPLES && _fading <= 0)
fadeDown();
} }
if (_fading > 0) { return samples;
if (--_fading == 0) {
_streaming = false;
_looping = false;
}
out = (out * _fading) / FADE_SAMPLES;
} else if (_fading < 0) {
_fading++;
out = (out * (FADE_SAMPLES + _fading)) / FADE_SAMPLES;
}
return out;
} }
bool MusicHandle::endOfData(void) const { bool MusicHandle::endOfData(void) const {

View File

@ -63,8 +63,7 @@ public:
void fadeUp(void); void fadeUp(void);
int32 play(const char *filename, uint32 musicId, bool looping); int32 play(const char *filename, uint32 musicId, bool looping);
void stop(void); void stop(void);
virtual int readBuffer(int16 *buffer, const int numSamples); int readBuffer(int16 *buffer, const int numSamples);
int16 read(void);
bool endOfData(void) const; bool endOfData(void) const;
// This stream never 'ends' // This stream never 'ends'
bool endOfStream(void) const { return false; } bool endOfStream(void) const { return false; }