[Scummvm-cvs-logs] CVS: scummvm/sound mixer.cpp,1.7,1.8 mixer.h,1.4,1.5

Pawe? Ko?odziejski aquadran at users.sourceforge.net
Sat Sep 14 05:13:03 CEST 2002


Update of /cvsroot/scummvm/scummvm/sound
In directory usw-pr-cvs1:/tmp/cvs-serv31946

Modified Files:
	mixer.cpp mixer.h 
Log Message:
fixed stream in mixer, not completed yet - bad wrap around.

Index: mixer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- mixer.cpp	8 Sep 2002 01:08:12 -0000	1.7
+++ mixer.cpp	14 Sep 2002 12:12:25 -0000	1.8
@@ -593,10 +593,11 @@
 										 byte flags) {
 	_mixer = mixer;
 	_flags = flags;
-	_bufferSize = 1024 * size;
+	_bufferSize = 850000;
 	_ptr = (byte *)malloc(_bufferSize);
 	memcpy(_ptr, sound, size);
 	_endOfData = _ptr + size;
+	_endOfBuffer = _ptr + _bufferSize;
 	if (_flags & FLAG_AUTOFREE)
 		free(sound);
 	_pos = _ptr;
@@ -616,14 +617,15 @@
 	byte *cur_pos = _pos;					/* This is just to prevent the variable to move during the tests :-) */
 	if (new_end > (_ptr + _bufferSize)) {
 		/* Wrap-around case */
-		new_end = _ptr + len - ((_ptr + _bufferSize) - _endOfData);
+		uint32 size_to_end_of_buffer = _endOfBuffer - _endOfData;
+		uint32 new_size = len - size_to_end_of_buffer; 
+		new_end = _ptr + new_size;
 		if ((_endOfData < cur_pos) || (new_end >= cur_pos)) {
 			warning("Mixer full... Trying to not break too much ");
 			return;
 		}
-		memcpy(_endOfData, data, (_ptr + _bufferSize) - _endOfData);
-		memcpy(_ptr, (byte *)data + ((_ptr + _bufferSize) - _endOfData),
-					 len - ((_ptr + _bufferSize) - _endOfData));
+		memcpy(_endOfData, (byte*)data, size_to_end_of_buffer);
+		memcpy(_ptr, (byte *)data + size_to_end_of_buffer, new_size);
 	} else {
 		if ((_endOfData < cur_pos) && (new_end >= cur_pos)) {
 			warning("Mixer full... Trying to not break too much ");
@@ -640,8 +642,10 @@
 	const int16 * vol_tab = _mixer->_volumeTable;
 	byte * end_of_data = _endOfData;
 
-	if (_toBeDestroyed) {
-		realDestroy();
+	if (_pos == end_of_data) {
+		if (--_timeOut == 0) {
+			realDestroy();
+		}
 		return;
 	}
 
@@ -650,9 +654,13 @@
 	if (_pos < end_of_data) {
 		mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, end_of_data);
 	} else {
-		_toBeDestroyed = true;
+		mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, _endOfBuffer);
+		if (len != 0) {
+			_pos = _ptr;
+			mixer_helper_table[_flags & 0x07] (data, &len, &_pos, &fp_pos, fp_speed, vol_tab, end_of_data);
+		}
 	}
-
+	_timeOut = 2;
 	_fpPos = fp_pos;
 }
 

Index: mixer.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/mixer.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -d -r1.4 -r1.5
--- mixer.h	8 Sep 2002 01:08:12 -0000	1.4
+++ mixer.h	14 Sep 2002 12:12:25 -0000	1.5
@@ -73,11 +73,13 @@
 		SoundMixer * _mixer;
 		byte * _ptr;
 		byte * _endOfData;
+		byte * _endOfBuffer;
 		byte * _pos;
 		uint32 _fpSpeed;
 		uint32 _fpPos;
 		uint32 _bufferSize;
 		uint32 _rate;
+		uint32 _timeOut;
 		byte _flags;
 
 	public:





More information about the Scummvm-git-logs mailing list