diff --git a/dumb/include/internal/mulsc.h b/dumb/include/internal/mulsc.h
new file mode 100644
index 000000000..57d6ec291
--- /dev/null
+++ b/dumb/include/internal/mulsc.h
@@ -0,0 +1,36 @@
+#ifndef INTERNAL_MULSC_H
+#define INTERNAL_MULSC_H
+
+#if !defined(_MSC_VER) || !defined(_M_IX86) || _MSC_VER >= 1800
+//#define MULSC(a, b) ((int)((LONG_LONG)(a) * (b) >> 16))
+//#define MULSC(a, b) ((a) * ((b) >> 2) >> 14)
+#define MULSCV(a, b) ((int)((LONG_LONG)(a) * (b) >> 32))
+#define MULSCA(a, b) ((int)((LONG_LONG)((a) << 4) * (b) >> 32))
+#define MULSC(a, b) ((int)((LONG_LONG)((a) << 4) * ((b) << 12) >> 32))
+#define MULSC16(a, b) ((int)((LONG_LONG)((a) << 12) * ((b) << 12) >> 32))
+#else
+/* VC++ calls __allmull and __allshr for the above math. I don't know why.
+ * [Need to check if this still applies to recent versions of the compiler.] */
+static __forceinline unsigned long long MULLL(int a, int b)
+{
+ __asm mov eax,a
+ __asm imul b
+}
+static __forceinline int MULSCV (int a, int b)
+{
+#ifndef _DEBUG
+ union { unsigned long long q; struct { int l, h; }; } val;
+ val.q = MULLL(a,b);
+ return val.h;
+#else
+ __asm mov eax,a
+ __asm imul b
+ __asm mov eax,edx
+#endif
+}
+#define MULSCA(a, b) MULSCV((a) << 4, b)
+#define MULSC(a, b) MULSCV((a) << 4, (b) << 12)
+#define MULSC16(a, b) MULSCV((a) << 12, (b) << 12)
+#endif
+
+#endif /* INTERNAL_MULSC_H */
\ No newline at end of file
diff --git a/dumb/src/helpers/resample.c b/dumb/src/helpers/resample.c
index 52b8e0f5d..a042775a0 100644
--- a/dumb/src/helpers/resample.c
+++ b/dumb/src/helpers/resample.c
@@ -46,6 +46,7 @@
#include "dumb.h"
#include "internal/resampler.h"
+#include "internal/mulsc.h"
@@ -85,36 +86,6 @@ int dumb_resampling_quality = DUMB_RQ_CUBIC;
-#if !defined(_MSC_VER) || !defined(_M_IX86) || _MSC_VER >= 1800
-//#define MULSC(a, b) ((int)((LONG_LONG)(a) * (b) >> 16))
-//#define MULSC(a, b) ((a) * ((b) >> 2) >> 14)
-#define MULSCV(a, b) ((int)((LONG_LONG)(a) * (b) >> 32))
-#define MULSC(a, b) ((int)((LONG_LONG)((a) << 4) * ((b) << 12) >> 32))
-#define MULSC16(a, b) ((int)((LONG_LONG)((a) << 12) * ((b) << 12) >> 32))
-#else
-/* VC++ calls __allmull and __allshr for the above math. I don't know why.
- * [Need to check if this still applies to recent versions of the compiler.] */
-static __forceinline unsigned long long MULLL(int a, int b)
-{
- __asm mov eax,a
- __asm imul b
-}
-static __forceinline int MULSCV (int a, int b)
-{
-#ifndef _DEBUG
- union { unsigned long long q; struct { int l, h; }; } val;
- val.q = MULLL(a,b);
- return val.h;
-#else
- __asm mov eax,a
- __asm imul b
- __asm mov eax,edx
-#endif
-}
-#define MULSC(a, b) MULSCV((a) << 4, (b) << 12)
-#define MULSC16(a, b) MULSCV((a) << 12, ((b) << 12))
-#endif
-
/* From xs_Float.h ==============================================*/
#if __BIG_ENDIAN__
#define _xs_iman_ 1
diff --git a/dumb/src/it/itrender.c b/dumb/src/it/itrender.c
index df97c4991..0491e7e59 100644
--- a/dumb/src/it/itrender.c
+++ b/dumb/src/it/itrender.c
@@ -27,6 +27,7 @@
#include "internal/lpc.h"
#include "internal/resampler.h"
+#include "internal/mulsc.h"
// #define BIT_ARRAY_BULLSHIT
@@ -601,7 +602,6 @@ static void it_filter_int(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample
#define INT_FILTERS
#ifdef INT_FILTERS
-#define MULSCA(a, b) ((int)((LONG_LONG)((a) << 4) * (b) >> 32))
#define SCALEB 12
{
int ai = (int)(a * (1 << (16+SCALEB)));
diff --git a/dumb/vc6/dumb_static/dumb_static.vcproj b/dumb/vc6/dumb_static/dumb_static.vcproj
index 40844c488..497fe4a99 100644
--- a/dumb/vc6/dumb_static/dumb_static.vcproj
+++ b/dumb/vc6/dumb_static/dumb_static.vcproj
@@ -2041,6 +2041,10 @@
RelativePath="..\..\include\internal\lpc.h"
>
+
+