[Scummvm-cvs-logs] CVS: scummvm/sound audiostream.cpp,1.17,1.18 audiostream.h,1.13,1.14 mixer.cpp,1.91,1.92

Max Horn fingolfin at users.sourceforge.net
Fri Aug 1 09:33:08 CEST 2003


Update of /cvsroot/scummvm/scummvm/sound
In directory sc8-pr-cvs1:/tmp/cvs-serv17461

Modified Files:
	audiostream.cpp audiostream.h mixer.cpp 
Log Message:
let the input stream handle the looping (by pretending to be of infinite size -> this fixes a problem which cause 'gaps' at loop turn-over points)

Index: audiostream.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/audiostream.cpp,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- audiostream.cpp	1 Aug 2003 12:49:24 -0000	1.17
+++ audiostream.cpp	1 Aug 2003 16:32:11 -0000	1.18
@@ -40,14 +40,20 @@
 
 
 template<bool stereo, bool is16Bit, bool isUnsigned>
-class LinearMemoryStream : public LinearAudioInputStream {
+class LinearMemoryStream : public AudioInputStream {
 protected:
 	const byte *_ptr;
 	const byte *_end;
+	const byte *_loopPtr;
+	const byte *_loopEnd;
 
 public:
-	LinearMemoryStream(const byte *ptr, uint len)
-		: _ptr(ptr), _end(ptr+len) {
+	LinearMemoryStream(const byte *ptr, uint len, uint loopOffset, uint loopLen)
+		: _ptr(ptr), _end(ptr+len), _loopPtr(0), _loopEnd(0) {
+		if (loopLen) {
+			_loopPtr = _ptr + loopOffset;
+			_loopEnd = _loopPtr + loopLen;
+		}
 		if (stereo)	// Stereo requires even sized data
 			assert(len % 2 == 0);
 	}
@@ -55,6 +61,10 @@
 		assert(_ptr < _end);
 		int16 val = readSample<is16Bit, isUnsigned>(_ptr);
 		_ptr += (is16Bit ? 2 : 1);
+		if (_loopPtr && _ptr == _end) {
+			_ptr = _loopPtr;
+			_end = _loopEnd;
+		}
 		return val;
 	}
 	bool eof() const {
@@ -63,12 +73,6 @@
 	bool isStereo() const {
 		return stereo;
 	}
-	void reset(const byte *data, uint32 len) {
-		_ptr = data;
-		_end = data + len;
-		if (stereo)	// Stereo requires even sized data
-			assert(len % 2 == 0);
-	}
 };
 
 
@@ -419,17 +423,17 @@
 
 
 template<bool stereo>
-static LinearAudioInputStream *makeLinearInputStream(const byte *ptr, uint32 len, bool is16Bit, bool isUnsigned) {
+static AudioInputStream *makeLinearInputStream(const byte *ptr, uint32 len, bool is16Bit, bool isUnsigned, uint loopOffset, uint loopLen) {
 	if (isUnsigned) {
 		if (is16Bit)
-			return new LinearMemoryStream<stereo, true, true>(ptr, len);
+			return new LinearMemoryStream<stereo, true, true>(ptr, len, loopOffset, loopLen);
 		else
-			return new LinearMemoryStream<stereo, false, true>(ptr, len);
+			return new LinearMemoryStream<stereo, false, true>(ptr, len, loopOffset, loopLen);
 	} else {
 		if (is16Bit)
-			return new LinearMemoryStream<stereo, true, false>(ptr, len);
+			return new LinearMemoryStream<stereo, true, false>(ptr, len, loopOffset, loopLen);
 		else
-			return new LinearMemoryStream<stereo, false, false>(ptr, len);
+			return new LinearMemoryStream<stereo, false, false>(ptr, len, loopOffset, loopLen);
 	}
 }
 
@@ -450,13 +454,13 @@
 }
 
 
-LinearAudioInputStream *makeLinearInputStream(byte _flags, const byte *ptr, uint32 len) {
+AudioInputStream *makeLinearInputStream(byte _flags, const byte *ptr, uint32 len, uint loopOffset, uint loopLen) {
 	const bool is16Bit = (_flags & SoundMixer::FLAG_16BITS) != 0;
 	const bool isUnsigned = (_flags & SoundMixer::FLAG_UNSIGNED) != 0;
 	if (_flags & SoundMixer::FLAG_STEREO) {
-		return makeLinearInputStream<true>(ptr, len, is16Bit, isUnsigned);
+		return makeLinearInputStream<true>(ptr, len, is16Bit, isUnsigned, loopOffset, loopLen);
 	} else {
-		return makeLinearInputStream<false>(ptr, len, is16Bit, isUnsigned);
+		return makeLinearInputStream<false>(ptr, len, is16Bit, isUnsigned, loopOffset, loopLen);
 	}
 }
 

Index: audiostream.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/audiostream.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- audiostream.h	1 Aug 2003 12:49:24 -0000	1.13
+++ audiostream.h	1 Aug 2003 16:32:11 -0000	1.14
@@ -53,11 +53,6 @@
 	virtual bool eof() const = 0;
 };
 
-class LinearAudioInputStream : public AudioInputStream {
-public:
-	virtual void reset(const byte *data, uint32 len) = 0;
-};
-
 class WrappedAudioInputStream : public AudioInputStream {
 public:
 	virtual void append(const byte *data, uint32 len) = 0;
@@ -123,7 +118,7 @@
 
 
 
-LinearAudioInputStream *makeLinearInputStream(byte _flags, const byte *ptr, uint32 len);
+AudioInputStream *makeLinearInputStream(byte _flags, const byte *ptr, uint32 len, uint loopOffset, uint loopLen);
 WrappedAudioInputStream *makeWrappedInputStream(byte _flags, uint32 len);
 
 

Index: mixer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -d -r1.91 -r1.92
--- mixer.cpp	1 Aug 2003 12:49:24 -0000	1.91
+++ mixer.cpp	1 Aug 2003 16:32:11 -0000	1.92
@@ -67,16 +67,16 @@
 	byte _flags;
 #ifdef SOX_HACK
 	RateConverter *_converter;
-	LinearAudioInputStream *_input;
+	AudioInputStream *_input;
 #else
 	uint32 _pos;
 	uint32 _size;
 	uint32 _fpSpeed;
 	uint32 _fpPos;
 	uint32 _realSize, _rate;
-#endif
 	byte *_loop_ptr;
 	uint32 _loop_size;
+#endif
 
 public:
 	ChannelRaw(SoundMixer *mixer, PlayingSoundHandle *handle, void *sound, uint32 size, uint rate, byte flags, int id, uint32 loopStart, uint32 loopEnd);
@@ -660,7 +660,16 @@
 #ifdef SOX_HACK
 	
 	// Create the input stream
-	_input = makeLinearInputStream(flags, _ptr, size);
+	if (flags & SoundMixer::FLAG_LOOP) {
+		if (loopEnd == 0) {
+			_input = makeLinearInputStream(flags, _ptr, size, 0, size);
+		} else {
+			assert(loopStart < loopEnd && loopEnd <= size);
+			_input = makeLinearInputStream(flags, _ptr, size, loopStart, loopEnd - loopStart);
+		}
+	} else {
+		_input = makeLinearInputStream(flags, _ptr, size, 0, 0);
+	}
 	// TODO: add support for SoundMixer::FLAG_REVERSE_STEREO
 
 	// Get a rate converter instance
@@ -669,19 +678,6 @@
 			((flags & SoundMixer::FLAG_16BITS) ? 16 : 8),
 			((flags & SoundMixer::FLAG_UNSIGNED) ? "unsigned" : "signed"));
 
-	if (flags & SoundMixer::FLAG_LOOP) {
-		if (loopEnd == 0) {
-			_loop_ptr = _ptr;
-			_loop_size = size;
-		} else {
-			assert(loopStart < loopEnd && loopEnd <= size);
-			_loop_ptr = _ptr + loopStart;
-			_loop_size = loopEnd - loopStart;
-		}
-	} else {
-		_loop_ptr = 0;
-		_loop_size = 0;
-	}
 #else
 	_pos = 0;
 	_fpPos = 0;
@@ -722,18 +718,13 @@
 
 	if (_input->eof()) {
 		// TODO: call drain method
-		// Loop if requested
-		if (_loop_ptr) {
-			_input->reset(_loop_ptr, _loop_size);
-		} else {
-			destroy();
-			return;
-		}
+		destroy();
+		return;
 	}
 
 	const int volume = _mixer->getVolume();
-	uint tmpLen = len;
-	_converter->flow(*_input, data, (st_size_t *) &tmpLen, volume);
+	st_size_t tmpLen = len;
+	_converter->flow(*_input, data, &tmpLen, volume);
 #else
 	byte *s, *end;
 
@@ -856,8 +847,8 @@
 	}
 
 	const int volume = _mixer->getVolume();
-	uint tmpLen = len;
-	_converter->flow(*_input, data, (st_size_t *) &tmpLen, volume);
+	st_size_t tmpLen = len;
+	_converter->flow(*_input, data, &tmpLen, volume);
 #else
 	if (_pos == _endOfData) {
 		// Normally, the stream stays around even if all its data is used up.
@@ -1043,7 +1034,7 @@
 	}
 
 	const int volume = _mixer->getVolume();
-	uint tmpLen = len;
+	st_size_t tmpLen = len;
 	_converter->flow(*_input, data, &tmpLen, volume);
 #else
 	mad_timer_t frame_duration;
@@ -1205,7 +1196,7 @@
 	}
 
 	const int volume = _mixer->getVolume();
-	uint tmpLen = len;
+	st_size_t tmpLen = len;
 	_converter->flow(*_input, data, &tmpLen, volume);
 #else
 	if (_end_pos > 0 && ov_pcm_tell(_ov_file) >= _end_pos) {





More information about the Scummvm-git-logs mailing list