diff --git a/Source/Core/AudioCommon/DPL2Decoder.cpp b/Source/Core/AudioCommon/DPL2Decoder.cpp
index 97bdb5413d..0c9fd65400 100644
--- a/Source/Core/AudioCommon/DPL2Decoder.cpp
+++ b/Source/Core/AudioCommon/DPL2Decoder.cpp
@@ -13,6 +13,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "DPL2Decoder.h"
+#include "MathUtil.h"
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846
@@ -72,17 +73,6 @@ template<class T> static T firfilter(const T *buf, int pos, int len, int count,
 	return T(r1+r2);
 }
 
-template<class T> inline const T& limit(const T& val, const T& min, const T& max)
-{
-	if (val < min) {
-		return min;
-	} else if (val > max) {
-		return max;
-	} else {
-		return val;
-	}
-}
-
 /*
 // Hamming
 //                        2*pi*k
@@ -133,7 +123,7 @@ float* design_fir(unsigned int *n, float* fc, float opt)
 
 	// Sanity check
 	if(*n==0) return NULL;
-	fc[0]=limit(fc[0],float(0.001),float(1));
+	MathUtil::Clamp(fc[0],float(0.001),float(1));
 
 	float *w=(float*)calloc(sizeof(float),*n);
 
diff --git a/Source/Core/Common/MathUtil.h b/Source/Core/Common/MathUtil.h
index f085c6ed2b..fd798d7451 100644
--- a/Source/Core/Common/MathUtil.h
+++ b/Source/Core/Common/MathUtil.h
@@ -13,6 +13,15 @@
 
 namespace MathUtil
 {
+template<class T>
+inline void Clamp(T& val, const T& min, const T& max)
+{
+	if (val < min)
+		val = min;
+	else if (val > max)
+		val = max;
+}
+
 
 static const u64 DOUBLE_SIGN = 0x8000000000000000ULL,
 	DOUBLE_EXP  = 0x7FF0000000000000ULL,
diff --git a/Source/Core/Core/DSP/DSPAccelerator.cpp b/Source/Core/Core/DSP/DSPAccelerator.cpp
index 8b493e0599..0db54078ef 100644
--- a/Source/Core/Core/DSP/DSPAccelerator.cpp
+++ b/Source/Core/Core/DSP/DSPAccelerator.cpp
@@ -3,6 +3,7 @@
 // Refer to the license.txt file included.
 
 #include "Common.h"
+#include "MathUtil.h"
 
 #include "DSPCore.h"
 #include "DSPHost.h"
@@ -36,11 +37,7 @@ static s16 ADPCM_Step(u32& _rSamplePos)
 	// 0x400 = 0.5  in 11-bit fixed point
 	int val = (scale * temp) + ((0x400 + coef1 * (s16)g_dsp.ifx_regs[DSP_YN1] + coef2 * (s16)g_dsp.ifx_regs[DSP_YN2]) >> 11);
 
-	// Clamp values.
-	if (val > 0x7FFF)
-		val = 0x7FFF;
-	else if (val < -0x7FFF)
-		val = -0x7FFF;
+	MathUtil::Clamp(val, -0x7FFF, 0x7FFF);
 
 	g_dsp.ifx_regs[DSP_YN2] = g_dsp.ifx_regs[DSP_YN1];
 	g_dsp.ifx_regs[DSP_YN1] = val;
diff --git a/Source/Core/Core/HW/AudioInterface.cpp b/Source/Core/Core/HW/AudioInterface.cpp
index 5998b53b04..6ef12134c1 100644
--- a/Source/Core/Core/HW/AudioInterface.cpp
+++ b/Source/Core/Core/HW/AudioInterface.cpp
@@ -51,6 +51,7 @@ This file mainly deals with the [Drive I/F], however [AIDFR] controls
 */
 
 #include "Common.h"
+#include "MathUtil.h"
 
 #include "StreamADPCM.h"
 #include "AudioInterface.h"
@@ -153,7 +154,7 @@ void Init()
 	m_Control.hex = 0;
 	m_Control.AISFR = AIS_48KHz;
 	m_Volume.hex = 0;
-	m_SampleCounter	= 0;
+	m_SampleCounter = 0;
 	m_InterruptTiming = 0;
 
 	g_LastCPUTime = 0;
@@ -207,8 +208,8 @@ void Write32(const u32 _Value, const u32 _Address)
 		{
 			AICR tmpAICtrl(_Value);
 
-			m_Control.AIINTMSK	= tmpAICtrl.AIINTMSK;
-			m_Control.AIINTVLD	= tmpAICtrl.AIINTVLD;
+			m_Control.AIINTMSK = tmpAICtrl.AIINTMSK;
+			m_Control.AIINTVLD = tmpAICtrl.AIINTVLD;
 
 			// Set frequency of streaming audio
 			if (tmpAICtrl.AISFR != m_Control.AISFR)
@@ -232,7 +233,7 @@ void Write32(const u32 _Value, const u32 _Address)
 			if (tmpAICtrl.PSTAT != m_Control.PSTAT)
 			{
 				DEBUG_LOG(AUDIO_INTERFACE, "%s streaming audio", tmpAICtrl.PSTAT ? "start":"stop");
-				m_Control.PSTAT	= tmpAICtrl.PSTAT;
+				m_Control.PSTAT = tmpAICtrl.PSTAT;
 				g_LastCPUTime = CoreTiming::GetTicks();
 
 				// Tell Drive Interface to start/stop streaming
@@ -338,13 +339,11 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples
 				if (i % 3)
 				{
 					pcm_l = (((pcm_l + (int)pcm[pos*2]) / 2  * lvolume) >> 8) + (int)(*_pDestBuffer);
-					if (pcm_l > 32767)			pcm_l = 32767;
-					else if (pcm_l < -32767)	pcm_l = -32767;
+					MathUtil::Clamp(pcm_l, -32767, 32767);
 					*_pDestBuffer++ = pcm_l;
 
 					pcm_r = (((pcm_r + (int)pcm[pos*2+1]) / 2 * rvolume) >> 8) + (int)(*_pDestBuffer);
- 					if (pcm_r > 32767)			pcm_r = 32767;
-					else if (pcm_r < -32767)	pcm_r = -32767;
+					MathUtil::Clamp(pcm_r, -32767, 32767);
 					*_pDestBuffer++ = pcm_r;
 				}
 				pcm_l = pcm[pos*2];
@@ -361,7 +360,7 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples
 				static s16 l1 = 0;
 				static s16 l2 = 0;
 
-				if ( frac >= 0x10000 || frac == 0)
+				if (frac >= 0x10000 || frac == 0)
 				{
 					frac &= 0xffff;
 
@@ -374,13 +373,11 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples
 
 
 				pcm_l = (pcm_l * lvolume >> 8) + (int)(*_pDestBuffer);
-				if (pcm_l > 32767)			pcm_l = 32767;
-				else if (pcm_l < -32767)	pcm_l = -32767;
+				MathUtil::Clamp(pcm_l, -32767, 32767);
 				*_pDestBuffer++ = pcm_l;
 
 				pcm_r = (pcm_r * lvolume >> 8) + (int)(*_pDestBuffer);
-				if (pcm_r > 32767)			pcm_r = 32767;
-				else if (pcm_r < -32767)	pcm_r = -32767;
+				MathUtil::Clamp(pcm_r, -32767, 32767);
 				*_pDestBuffer++ = pcm_r;
 
 				frac += ratio;
@@ -390,13 +387,11 @@ unsigned int Callback_GetStreaming(short* _pDestBuffer, unsigned int _numSamples
 			else //1:1 no resampling
 			{
 				pcm_l = (((int)pcm[pos*2] * lvolume) >> 8) + (int)(*_pDestBuffer);
-				if (pcm_l > 32767)		pcm_l = 32767;
-				else if (pcm_l < -32767)	pcm_l = -32767;
+				MathUtil::Clamp(pcm_l, -32767, 32767);
 				*_pDestBuffer++ = pcm_l;
 
 				pcm_r = (((int)pcm[pos*2+1] * rvolume) >> 8) + (int)(*_pDestBuffer);
-				if (pcm_r > 32767)		pcm_r = 32767;
-				else if (pcm_r < -32767)	pcm_r = -32767;
+				MathUtil::Clamp(pcm_r, -32767, 32767);
 				*_pDestBuffer++ = pcm_r;
 
 				pos++;
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX.cpp
index 2be8ce4b87..b9649dda0c 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX.cpp
@@ -6,6 +6,7 @@
 #include "../../DSP.h"
 #include "FileUtil.h"
 #include "ConfigManager.h"
+#include "MathUtil.h"
 
 #define AX_GC
 #include "UCode_AX_Voice.h"
@@ -559,12 +560,10 @@ void CUCode_AX::OutputSamples(u32 lr_addr, u32 surround_addr)
 		int left  = m_samples_left[i];
 		int right = m_samples_right[i];
 
-		if (left < -32767)  left = -32767;
-		if (left > 32767)   left = 32767;
-		if (right < -32767) right = -32767;
-		if (right >  32767) right = 32767;
+		MathUtil::Clamp(left, -32767, 32767);
+		MathUtil::Clamp(right, -32767, 32767);
 
-		buffer[2 * i] = Common::swap16(right);
+		buffer[2 * i + 0] = Common::swap16(right);
 		buffer[2 * i + 1] = Common::swap16(left);
 	}
 
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AXWii.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AXWii.cpp
index 72e5c4a3fa..553f3bc3d0 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AXWii.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AXWii.cpp
@@ -2,6 +2,7 @@
 // Licensed under GPLv2
 // Refer to the license.txt file included.
 
+#include "MathUtil.h"
 #include "StringUtil.h"
 
 #include "../MailHandler.h"
@@ -617,10 +618,8 @@ void CUCode_AXWii::OutputSamples(u32 lr_addr, u32 surround_addr, u16 volume,
 		left = ((s64)left * volume_ramp[i]) >> 15;
 		right = ((s64)right * volume_ramp[i]) >> 15;
 
-		if (left < -32767)  left = -32767;
-		if (left > 32767)   left = 32767;
-		if (right < -32767) right = -32767;
-		if (right >  32767) right = 32767;
+		MathUtil::Clamp(left, -32767, 32767);
+		MathUtil::Clamp(right, -32767, 32767);
 
 		m_samples_left[i] = left;
 		m_samples_right[i] = right;
@@ -655,8 +654,7 @@ void CUCode_AXWii::OutputWMSamples(u32* addresses)
 		for (u32 j = 0; j < 3 * 6; ++j)
 		{
 			int sample = in[j];
-			if (sample < -32767) sample = -32767;
-			if (sample > 32767) sample = 32767;
+			MathUtil::Clamp(sample, -32767, 32767);
 			out[j] = Common::swap16((u16)sample);
 		}
 	}
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX_Voice.h b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX_Voice.h
index fce6cdf6a2..6baf134482 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX_Voice.h
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_AX_Voice.h
@@ -14,6 +14,7 @@
 #endif
 
 #include "Common.h"
+#include "MathUtil.h"
 #include "UCode_AXStructs.h"
 #include "../../DSP.h"
 
@@ -216,9 +217,7 @@ u16 AcceleratorGetSample()
 				temp -= 16;
 
 			int val = (scale * temp) + ((0x400 + coef1 * acc_pb->adpcm.yn1 + coef2 * acc_pb->adpcm.yn2) >> 11);
-
-			if (val > 0x7FFF) val = 0x7FFF;
-			else if (val < -0x7FFF) val = -0x7FFF;
+			MathUtil::Clamp(val, -0x7FFF, 0x7FFF);
 
 			acc_pb->adpcm.yn2 = acc_pb->adpcm.yn1;
 			acc_pb->adpcm.yn1 = val;
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp
index 3ff7a55546..a66228a2c3 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_ADPCM.cpp
@@ -3,6 +3,7 @@
 // Refer to the license.txt file included.
 
 #include "Common.h"
+#include "MathUtil.h"
 #include "UCode_Zelda.h"
 
 void CUCode_Zelda::AFCdecodebuffer(const s16 *coef, const char *src, signed short *out, short *histp, short *hist2p, int type)
@@ -55,10 +56,7 @@ void CUCode_Zelda::AFCdecodebuffer(const s16 *coef, const char *src, signed shor
 	{
 		int sample = delta * nibbles[i] + ((int)hist * coef[idx * 2]) + ((int)hist2 * coef[idx * 2 + 1]);
 		sample >>= 11;
-		if (sample > 32767)
-			sample = 32767;
-		if (sample < -32768)
-			sample = -32768;
+		MathUtil::Clamp(sample, -32768, 32767);
 		out[i] = sample;
 		hist2 = hist;
 		hist = (short)sample;
diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp
index ab3a4bef2c..20ffe61ff8 100644
--- a/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp
+++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCode_Zelda_Voice.cpp
@@ -8,6 +8,7 @@
 #include "UCode_Zelda.h"
 
 #include "AudioCommon.h"
+#include "MathUtil.h"
 #include "Mixer.h"
 #include "../../Memmap.h"
 #include "../../DSP.h"
@@ -780,12 +781,10 @@ void CUCode_Zelda::MixAdd(short *_Buffer, int _Size)
 		s32 left  = (s32)_Buffer[0] + m_LeftBuffer[i];
 		s32 right = (s32)_Buffer[1] + m_RightBuffer[i];
 
-		if (left < -32768) left = -32768;
-		if (left > 32767)  left = 32767;
+		MathUtil::Clamp(left, -32768, 32767);
 		_Buffer[0] = (short)left;
 
-		if (right < -32768) right = -32768;
-		if (right > 32767)  right = 32767;
+		MathUtil::Clamp(right, -32768, 32767);
 		_Buffer[1] = (short)right;
 
 		_Buffer += 2;
diff --git a/Source/Core/Core/HW/StreamADPCM.cpp b/Source/Core/Core/HW/StreamADPCM.cpp
index 4534f468a9..992ce37b2f 100644
--- a/Source/Core/Core/HW/StreamADPCM.cpp
+++ b/Source/Core/Core/HW/StreamADPCM.cpp
@@ -5,6 +5,7 @@
 // Adapted from in_cube by hcs & destop
 
 #include "StreamADPCM.h"
+#include "MathUtil.h"
 
 // STATE_TO_SAVE (not saved yet!)
 static s32 histl1;
@@ -31,8 +32,7 @@ s16 ADPDecodeSample(s32 bits, s32 q, s32& hist1, s32& hist2)
 		break;
 	}
 	hist = (hist + 0x20) >> 6;
-	if (hist >  0x1fffff) hist =  0x1fffff;
-	if (hist < -0x200000) hist = -0x200000;
+	MathUtil::Clamp(hist, -0x200000, 0x1fffff);
 
 	s32 cur = (((s16)(bits << 12) >> (q & 0xf)) << 6) + hist;
 
@@ -40,9 +40,7 @@ s16 ADPDecodeSample(s32 bits, s32 q, s32& hist1, s32& hist2)
 	hist1 = cur;
 
 	cur >>= 6;
-
-	if (cur < -0x8000) return -0x8000;
-	if (cur >  0x7fff) return  0x7fff;
+	MathUtil::Clamp(cur, -0x8000, 0x7fff);
 
 	return (s16)cur;
 }