[Scummvm-cvs-logs] SF.net SVN: scummvm:[46838] scummvm/trunk/sound
lordhoto at users.sourceforge.net
lordhoto at users.sourceforge.net
Fri Jan 1 17:57:23 CET 2010
Revision: 46838
http://scummvm.svn.sourceforge.net/scummvm/?rev=46838&view=rev
Author: lordhoto
Date: 2010-01-01 16:57:23 +0000 (Fri, 01 Jan 2010)
Log Message:
-----------
Fix getTotalPlayTime for MP3, FLAC, Vorbis and LinearMemoryStream after the latest loop related changes.
Modified Paths:
--------------
scummvm/trunk/sound/audiostream.cpp
scummvm/trunk/sound/audiostream.h
scummvm/trunk/sound/flac.cpp
scummvm/trunk/sound/mp3.cpp
scummvm/trunk/sound/vorbis.cpp
Modified: scummvm/trunk/sound/audiostream.cpp
===================================================================
--- scummvm/trunk/sound/audiostream.cpp 2010-01-01 16:42:35 UTC (rev 46837)
+++ scummvm/trunk/sound/audiostream.cpp 2010-01-01 16:57:23 UTC (rev 46838)
@@ -138,8 +138,11 @@
: _ptr(ptr), _end(ptr+len), _loopPtr(0), _loopEnd(0), _rate(rate), _playtime(calculatePlayTime(rate, len / (is16Bit ? 2 : 1) / (stereo ? 2 : 1))) {
if (loopLen) {
+ _numLoops = 0;
_loopPtr = _ptr + loopOffset;
_loopEnd = _loopPtr + loopLen;
+ } else {
+ _numLoops = 1;
}
_origPtr = autoFreeMemory ? ptr : 0;
@@ -153,7 +156,11 @@
bool endOfData() const { return _ptr >= _end; }
int getRate() const { return _rate; }
- int32 getTotalPlayTime() const { return _playtime; }
+ int32 getTotalPlayTime() const {
+ if (!_numLoops)
+ return kUnknownPlayTime;
+ return _playtime * _numLoops;
+ }
void setNumLoops(uint numLoops) {
_numLoops = numLoops;
@@ -181,6 +188,7 @@
_ptr += (is16Bit ? 2 : 1);
} while (--len);
// Loop, if looping was specified
+ // TODO: Handle non-infinite loops
if (_loopPtr && _ptr >= _end) {
_ptr = _loopPtr;
_end = _loopEnd;
@@ -242,7 +250,7 @@
public:
LinearDiskStream(int rate, uint beginLoop, uint endLoop, bool disposeStream, Common::SeekableReadStream *stream, LinearDiskStreamAudioBlock *block, uint numBlocks, bool loop)
: _rate(rate), _stream(stream), _beginLoop(beginLoop), _endLoop(endLoop), _disposeAfterUse(disposeStream),
- _audioBlockCount(numBlocks), _loop(loop), _numPlayedLoops(0) {
+ _audioBlockCount(numBlocks), _loop(loop), _numLoops(loop ? 0 : 1), _numPlayedLoops(0) {
assert(numBlocks > 0);
@@ -290,7 +298,11 @@
bool endOfData() const { return (_currentBlock == _audioBlockCount - 1) && (_diskLeft == 0) && (_bufferLeft == 0); }
int getRate() const { return _rate; }
- int32 getTotalPlayTime() const { return _playtime; }
+ int32 getTotalPlayTime() const {
+ if (!_numLoops)
+ return kUnknownPlayTime;
+ return _playtime * _numLoops;
+ }
};
template<bool stereo, bool is16Bit, bool isUnsigned, bool isLE>
Modified: scummvm/trunk/sound/audiostream.h
===================================================================
--- scummvm/trunk/sound/audiostream.h 2010-01-01 16:42:35 UTC (rev 46837)
+++ scummvm/trunk/sound/audiostream.h 2010-01-01 16:57:23 UTC (rev 46838)
@@ -98,10 +98,6 @@
uint32 duration = 0,
uint numLoops = 1);
- enum {
- kUnknownPlayTime = -1
- };
-
/**
* Sets number of times the stream is supposed to get looped
* @param numLoops number of loops to play, 0 - infinite
@@ -114,9 +110,13 @@
*/
virtual uint getNumPlayedLoops() { return 0; }
+ enum {
+ kUnknownPlayTime = -1
+ };
+
/**
* Returns total playtime of the AudioStream object.
- * Note that this does not require to return an playtime, if the
+ * Note that this does not require to return any playtime, if the
* playtime of the AudioStream is unknown it returns 'kUnknownPlayTime'.
* @see kUnknownPlayTime
*
Modified: scummvm/trunk/sound/flac.cpp
===================================================================
--- scummvm/trunk/sound/flac.cpp 2010-01-01 16:42:35 UTC (rev 46837)
+++ scummvm/trunk/sound/flac.cpp 2010-01-01 16:57:23 UTC (rev 46838)
@@ -143,7 +143,11 @@
return _streaminfo.channels == 0 || (_lastSampleWritten && _sampleCache.bufFill == 0);
}
- int32 getTotalPlayTime() const { return _totalPlayTime; }
+ int32 getTotalPlayTime() const {
+ if (!_numLoops)
+ return kUnknownPlayTime;
+ return _totalPlayTime * _numLoops;
+ }
bool isStreamDecoderReady() const { return getStreamDecoderState() == FLAC__STREAM_DECODER_SEARCH_FOR_FRAME_SYNC ; }
@@ -260,7 +264,7 @@
int32 seconds = samples / rate;
int32 milliseconds = (1000 * (samples % rate)) / rate;
- _totalPlayTime = (seconds * 1000 + milliseconds) * numLoops;
+ _totalPlayTime = (seconds * 1000 + milliseconds);
} else {
_totalPlayTime = kUnknownPlayTime;
}
Modified: scummvm/trunk/sound/mp3.cpp
===================================================================
--- scummvm/trunk/sound/mp3.cpp 2010-01-01 16:42:35 UTC (rev 46837)
+++ scummvm/trunk/sound/mp3.cpp 2010-01-01 16:57:23 UTC (rev 46838)
@@ -92,7 +92,11 @@
bool endOfData() const { return _state == MP3_STATE_EOS; }
bool isStereo() const { return MAD_NCHANNELS(&_frame.header) == 2; }
int getRate() const { return _frame.header.samplerate; }
- int32 getTotalPlayTime() const { return _totalPlayTime; }
+ int32 getTotalPlayTime() const {
+ if (!_numLoops)
+ return kUnknownPlayTime;
+ return _totalPlayTime * _numLoops;
+ }
void setNumLoops(uint numLoops = 1) { _numLoops = numLoops; }
uint getNumPlayedLoops() { return _numPlayedLoops; }
@@ -182,9 +186,7 @@
_totalPlayTime = mad_timer_count(length, MAD_UNITS_MILLISECONDS);
- if (numLoops && mad_timer_sign(length) >= 0)
- _totalPlayTime *= numLoops;
- else
+ if (mad_timer_sign(length) < 0)
_totalPlayTime = kUnknownPlayTime;
// Decode the first chunk of data. This is necessary so that _frame
Modified: scummvm/trunk/sound/vorbis.cpp
===================================================================
--- scummvm/trunk/sound/vorbis.cpp 2010-01-01 16:42:35 UTC (rev 46837)
+++ scummvm/trunk/sound/vorbis.cpp 2010-01-01 16:57:23 UTC (rev 46838)
@@ -92,7 +92,6 @@
bool _isStereo;
int _rate;
- const uint _totalNumLoops;
uint _numLoops; ///< Number of loops to play
uint _numPlayedLoops; ///< Number of loops which have been played
@@ -126,13 +125,13 @@
uint getNumPlayedLoops() { return _numPlayedLoops; }
int32 getTotalPlayTime() const {
- if (!_totalNumLoops)
+ if (!_numLoops)
return AudioStream::kUnknownPlayTime;
#ifdef USE_TREMOR
- return (_endTime - _startTime) * _totalNumLoops;
+ return (_endTime - _startTime) * _numLoops;
#else
- return (int32)((_endTime - _startTime) * 1000.0) * _totalNumLoops;
+ return (int32)((_endTime - _startTime) * 1000.0) * _numLoops;
#endif
}
@@ -144,7 +143,6 @@
_inStream(inStream),
_disposeAfterUse(dispose),
_numLoops(numLoops),
- _totalNumLoops(numLoops),
_bufferEnd(_buffer + ARRAYSIZE(_buffer)) {
int res = ov_open_callbacks(inStream, &_ovFile, NULL, 0, g_stream_wrap);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list