[Scummvm-cvs-logs] SF.net SVN: scummvm: [27499] scummvm/trunk/sound/rate.cpp

fingolfin at users.sourceforge.net fingolfin at users.sourceforge.net
Sun Jun 17 01:07:27 CEST 2007


Revision: 27499
          http://scummvm.svn.sourceforge.net/scummvm/?rev=27499&view=rev
Author:   fingolfin
Date:     2007-06-16 16:07:25 -0700 (Sat, 16 Jun 2007)

Log Message:
-----------
Avoid using the 'st_sample_t out[2]' arrays inside tight loops, as some compilers are bad at optimizing array access due to pointer aliasing

Modified Paths:
--------------
    scummvm/trunk/sound/rate.cpp

Modified: scummvm/trunk/sound/rate.cpp
===================================================================
--- scummvm/trunk/sound/rate.cpp	2007-06-16 22:08:13 UTC (rev 27498)
+++ scummvm/trunk/sound/rate.cpp	2007-06-16 23:07:25 UTC (rev 27499)
@@ -137,18 +137,20 @@
 			}
 		} while (opos >= 0);
 
-		st_sample_t out[2];
-		out[reverseStereo    ] = *inPtr++;
-		out[reverseStereo ^ 1] = (stereo ? *inPtr++ : out[reverseStereo]);
+		st_sample_t out0, out1;
+		out0 = *inPtr++;
+		out1 = (stereo ? *inPtr++ : out0);
 
 		// Increment output position
 		opos += opos_inc;
 
 		// output left channel
-		clampedAdd(*obuf++, (out[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+		clampedAdd(obuf[reverseStereo    ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
 
 		// output right channel
-		clampedAdd(*obuf++, (out[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+		clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+		
+		obuf += 2;
 	}
 the_end:
 	return (ST_SUCCESS);
@@ -258,17 +260,19 @@
 		// still space in the output buffer.
 		while (0 > opos) {
 			// interpolate
-			st_sample_t out[2];
-			out[reverseStereo    ] =  (st_sample_t)(ilast0 + (((icur0 - ilast0) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
-			out[reverseStereo ^ 1] = (stereo ?
+			st_sample_t out0, out1;
+			out0 =  (st_sample_t)(ilast0 + (((icur0 - ilast0) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS));
+			out1 = (stereo ?
 						  (st_sample_t)(ilast1 + (((icur1 - ilast1) * opos_frac + (1UL << (FRAC_BITS-1))) >> FRAC_BITS)) :
-						  out[reverseStereo]);
+						  out0);
 
 			// output left channel
-			clampedAdd(*obuf++, (out[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+			clampedAdd(obuf[reverseStereo    ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
 
 			// output right channel
-			clampedAdd(*obuf++, (out[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+			clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+			
+			obuf += 2;
 
 			// Increment output position
 			long tmp = opos_frac + opos_inc_frac;
@@ -323,15 +327,17 @@
 		// Mix the data into the output buffer
 		ptr = _buffer;
 		for (; len > 0; len -= (stereo ? 2 : 1)) {
-			st_sample_t tmp[2];
-			tmp[reverseStereo    ] = *ptr++;
-			tmp[reverseStereo ^ 1] = (stereo ? *ptr++ : tmp[reverseStereo]);
+			st_sample_t out0, out1;
+			out0 = *ptr++;
+			out1 = (stereo ? *ptr++ : out0);
 
 			// output left channel
-			clampedAdd(*obuf++, (tmp[0] * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
+			clampedAdd(obuf[reverseStereo    ], (out0 * (int)vol_l) / Audio::Mixer::kMaxMixerVolume);
 
 			// output right channel
-			clampedAdd(*obuf++, (tmp[1] * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+			clampedAdd(obuf[reverseStereo ^ 1], (out1 * (int)vol_r) / Audio::Mixer::kMaxMixerVolume);
+			
+			obuf += 2;
 		}
 		return (ST_SUCCESS);
 	}


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