[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