[Scummvm-cvs-logs] CVS: scummvm/sound mixer.cpp,1.38,1.39

Max Horn fingolfin at users.sourceforge.net
Fri Jul 26 16:31:02 CEST 2002


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

Modified Files:
	mixer.cpp 
Log Message:
when mixing data, clamp the addition - otherwise we might get overflows for high volumes

Index: mixer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/sound/mixer.cpp,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -d -r1.38 -r1.39
--- mixer.cpp	23 Jul 2002 14:54:02 -0000	1.38
+++ mixer.cpp	26 Jul 2002 23:30:35 -0000	1.39
@@ -301,6 +301,15 @@
 	}
 };
 
+static inline int clamped_add_16(int a, int b)
+{
+	int val = a + b;
+	if (val > 0xFFFF)
+		return 0xFFFF;
+	else
+		return val;
+}
+
 static int16 *mix_signed_mono_8(int16 *data, uint * len_ptr, byte **s_ptr, uint32 *fp_pos_ptr,
 																int fp_speed, const int16 *vol_tab, byte *s_end)
 {
@@ -314,9 +323,11 @@
 	do {
 		do {
 			result = interp.interpolate(fp_pos);
-	
-			*data++ += result;
-			*data++ += result;
+			
+			*data = clamped_add_16(*data, result);
+			*data++;
+			*data = clamped_add_16(*data, result);
+			*data++;
 	
 			fp_pos += fp_speed;
 			inc = fp_pos >> 16;
@@ -341,24 +352,6 @@
 static int16 *mix_unsigned_mono_8(int16 *data, uint * len_ptr, byte **s_ptr, uint32 *fp_pos_ptr,
 																	int fp_speed, const int16 *vol_tab, byte *s_end)
 {
-#if OLD
-	uint32 fp_pos = *fp_pos_ptr;
-	byte *s = *s_ptr;
-	uint len = *len_ptr;
-	do {
-		fp_pos += fp_speed;
-		*data++ += vol_tab[*s ^ 0x80];
-		*data++ += vol_tab[*s ^ 0x80];
-		s += fp_pos >> 16;
-		fp_pos &= 0x0000FFFF;
-	} while ((--len) && (s < s_end));
-
-	*fp_pos_ptr = fp_pos;
-	*s_ptr = s;
-	*len_ptr = len;
-
-	return data;
-#else
 	uint32 fp_pos = *fp_pos_ptr;
 	byte *s = *s_ptr;
 	uint len = *len_ptr;
@@ -370,8 +363,10 @@
 		do {
 			result = interp.interpolate(fp_pos);
 	
-			*data++ += result;
-			*data++ += result;
+			*data = clamped_add_16(*data, result);
+			*data++;
+			*data = clamped_add_16(*data, result);
+			*data++;
 	
 			fp_pos += fp_speed;
 			inc = fp_pos >> 16;
@@ -392,7 +387,6 @@
 	*len_ptr = len;
 
 	return data;
-#endif
 }
 static int16 *mix_signed_stereo_8(int16 *data, uint * len_ptr, byte **s_ptr, uint32 *fp_pos_ptr,
 																	int fp_speed, const int16 *vol_tab, byte *s_end)
@@ -404,24 +398,6 @@
 static int16 *mix_unsigned_stereo_8(int16 *data, uint * len_ptr, byte **s_ptr, uint32 *fp_pos_ptr,
 																		int fp_speed, const int16 *vol_tab, byte *s_end)
 {
-#if OLD
-	uint32 fp_pos = *fp_pos_ptr;
-	byte *s = *s_ptr;
-	uint len = *len_ptr;
-	do {
-		fp_pos += fp_speed;
-		*data++ += vol_tab[*s ^ 0x80];
-		*data++ += vol_tab[*(s + 1) ^ 0x80];
-		s += (fp_pos >> 16) << 1;
-		fp_pos &= 0x0000FFFF;
-	} while ((--len) && (s < s_end));
-
-	*fp_pos_ptr = fp_pos;
-	*s_ptr = s;
-	*len_ptr = len;
-
-	return data;
-#else
 	uint32 fp_pos = *fp_pos_ptr;
 	byte *s = *s_ptr;
 	uint len = *len_ptr;
@@ -432,9 +408,11 @@
 
 	do {
 		do {
-			*data++ += left.interpolate(fp_pos);
-			*data++ += right.interpolate(fp_pos);
-	
+			*data = clamped_add_16(*data, left.interpolate(fp_pos));
+			*data++;
+			*data = clamped_add_16(*data, right.interpolate(fp_pos));
+			*data++;
+
 			fp_pos += fp_speed;
 			inc = (fp_pos >> 16) << 1;
 			s += inc;
@@ -457,7 +435,6 @@
 	*len_ptr = len;
 
 	return data;
-#endif
 }
 static int16 *mix_signed_mono_16(int16 *data, uint * len_ptr, byte **s_ptr, uint32 *fp_pos_ptr,
 																 int fp_speed, const int16 *vol_tab, byte *s_end)
@@ -470,8 +447,12 @@
 	do {
 		int16 sample = (((int16)(*s << 8) | *(s + 1)) * volume) / 32;
 		fp_pos += fp_speed;
-		*data++ += sample;
-		*data++ += sample;
+
+		*data = clamped_add_16(*data, sample);
+		*data++;
+		*data = clamped_add_16(*data, sample);
+		*data++;
+
 		s += (fp_pos >> 16) << 1;
 		fp_pos &= 0x0000FFFF;
 	} while ((--len) && (s < s_end));
@@ -499,8 +480,12 @@
 	uint len = *len_ptr;
 	do {
 		fp_pos += fp_speed;
-		*data++ += (((int16)(*(s) << 8) | *(s + 1)) * volume) / 32;
-		*data++ += (((int16)(*(s + 2) << 8) | *(s + 3)) * volume) / 32;
+
+		*data = clamped_add_16(*data, (((int16)(*(s) << 8) | *(s + 1)) * volume) / 32);
+		*data++;
+		*data = clamped_add_16(*data, (((int16)(*(s + 2) << 8) | *(s + 3)) * volume) / 32);
+		*data++;
+
 		s += (fp_pos >> 16) << 2;
 		fp_pos &= 0x0000FFFF;
 	} while ((--len) && (s < s_end));





More information about the Scummvm-git-logs mailing list