changeset 57:2edda27f951c

Silly interpolation in mixing.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 01 Oct 2012 07:01:38 +0300
parents 8725853609db
children 76a7d469eab9
files jmix_c_in.c jmixtmpl_c.h jssmix.c jssmix.h
diffstat 4 files changed, 18 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/jmix_c_in.c	Mon Oct 01 06:59:00 2012 +0300
+++ b/jmix_c_in.c	Mon Oct 01 07:01:38 2012 +0300
@@ -6,15 +6,16 @@
 
 //#define JMIXER_DEBUG fprintf(stderr, "[%.8x:%.8x / %.8x]: %d\n", FP_GETH(tmpPos), FP_GETL(tmpPos), endPos, sp[FP_GETH(tmpPos)]);
 #define JMIXER_DEBUG
+#define JMIXER_ADDBUF_TYPE Sint32
 
-#define JMIXER_ADDBUF_TYPE Sint32
 
 /* Mono / Linear Interpolation
  */
-#define JMIXER_ADDBUF_TYPE Sint32
 #define JMIXER_SAMPLE_TYPE Sint16
 #define JMIXER_INIT        const Sint32 vol = (chn->chVolume * mixer->globalVol) / 256;
-#define JMIXER_FUNC        tr = (((Sint32) sp[FP_GETH(tmpPos)]) * vol + tr) / (256 * 2); *(ap++) += tr;
+#define JMIXER_FUNC \
+    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
+    tl[4] = (((Sint32) sp[FP_GETH(tmpPos)]) * vol * 3 + tl[3] * 2 + tl[2] + tl[1] + tl[0]) / (256 * 8); *(ap++) += tl[4]; \
 
 #define JMIXER_NAME        jvmMix_Mono_C_FW
 #define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
@@ -26,6 +27,7 @@
 #define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
 #include "jmixtmpl_c.h"
 
+
 #undef JMIXER_SAMPLE_TYPE
 #undef JMIXER_INIT
 #undef JMIXER_FUNC
@@ -37,8 +39,11 @@
 #define JMIXER_INIT        const Sint32 vol_l = (chn->chVolume * mixer->globalVol) / 256, \
                                         vol_r = (chn->chVolume * mixer->globalVol) / 256;
 
-#define JMIXER_FUNC        tl = (((Sint32) sp[FP_GETH(tmpPos)]) * vol_l + tl) / (256 * 2); *(ap++) += tl; \
-                           tr = (((Sint32) sp[FP_GETH(tmpPos)]) * vol_r + tr) / (256 * 2); *(ap++) += tr;
+#define JMIXER_FUNC \
+    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
+    memmove(&tr[0], &tr[1], 4 * sizeof(tr[0])); \
+    tl[4] = (((Sint32) sp[FP_GETH(tmpPos)]) * vol_l * 3 + tl[3] * 2 + tl[2] + tl[1] + tl[0]) / (256 * 8); *(ap++) += tl[4]; \
+    tr[4] = (((Sint32) sp[FP_GETH(tmpPos)]) * vol_r * 3 + tr[3] * 2 + tr[2] + tr[1] + tr[0]) / (256 * 8); *(ap++) += tr[4];
 
 #define JMIXER_NAME        jvmMix_Stereo_C_FW
 #define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
@@ -50,6 +55,7 @@
 #define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
 #include "jmixtmpl_c.h"
 
+
 #undef JMIXER_SAMPLE_TYPE
 #undef JMIXER_INIT
 #undef JMIXER_FUNC
--- a/jmixtmpl_c.h	Mon Oct 01 06:59:00 2012 +0300
+++ b/jmixtmpl_c.h	Mon Oct 01 07:01:38 2012 +0300
@@ -13,9 +13,10 @@
     DMFixedPoint tmpPos = chn->chPos;
     JMIXER_ADDBUF_TYPE
         *ap = addBuffer,
-        tr = chn->chPrevR,
-        tl = chn->chPrevL;
+        *tr = chn->chPrevR,
+        *tl = chn->chPrevL;
     int strideLength = 0;
+
     JMIXER_SAMPLE_TYPE *sp = (JMIXER_SAMPLE_TYPE *) chn->chData;
 
     JMIXER_INIT
@@ -29,8 +30,6 @@
     }
 
     chn->chPos.dw = tmpPos.dw;
-    chn->chPrevR = tr;
-    chn->chPrevL = tl;
     return strideLength;
 }
 #endif
--- a/jssmix.c	Mon Oct 01 06:59:00 2012 +0300
+++ b/jssmix.c	Mon Oct 01 07:01:38 2012 +0300
@@ -508,7 +508,8 @@
     c->chLoopE     = loopE;
     c->chFlags     = flags;
     c->chDirection = TRUE;
-    c->chPrevL     = c->chPrevR = 0;
+    memset(c->chPrevL, 0, sizeof(c->chPrevL));
+    memset(c->chPrevR, 0, sizeof(c->chPrevR));
     c->chPos.dw    = c->chDeltaO.dw = 0;
     
     JSS_UNLOCK(mixer);
--- a/jssmix.h	Mon Oct 01 06:59:00 2012 +0300
+++ b/jssmix.h	Mon Oct 01 07:01:38 2012 +0300
@@ -16,6 +16,7 @@
 #define JVM_LIMIT_16_NEG    (-32767)
 #define JVM_ADD_16          (32768)
 
+
 #define JMIXER_ADDBUF_TYPE Sint32
 
 
@@ -42,7 +43,7 @@
     int     chVolume,       // Volume
             chPanning;      // Panning
 
-    JMIXER_ADDBUF_TYPE chPrevR, chPrevL;
+    JMIXER_ADDBUF_TYPE chPrevR[5], chPrevL[5];
 } JSSChannel;