diff jmix_c_in.c @ 49:033c660c25f5

Restructure module playing, removing 8bit sample mixing (output can still be 8bit, but samples are internally upconverted to 16bit after module loading.) Also prepare for floating point mixing support.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 01 Oct 2012 02:51:41 +0300
parents f939d3896937
children 36e2f910219c
line wrap: on
line diff
--- a/jmix_c_in.c	Mon Oct 01 01:29:26 2012 +0300
+++ b/jmix_c_in.c	Mon Oct 01 02:51:41 2012 +0300
@@ -4,100 +4,174 @@
  * (C) Copyright 2006-2007 Tecnic Software productions (TNSP)
  */
 
-#define JMIXER_INTERPOLATE
 //#define JMIXER_DEBUG fprintf(stderr, "[%.8x:%.8x / %.8x]: %d\n", FP_GETH(tmpPos), FP_GETL(tmpPos), endPos, sp[FP_GETH(tmpPos)]);
 #define JMIXER_DEBUG
 
 /* Mono / Linear Interpolation
  */
-#define JMIXER_INIT         const Sint32 vol = (chn->chVolume * mixer->globalVol) / 256;
-#ifdef JMIXER_INTERPOLATE
-#define JMIXER_FUNC_16      tr = (((Sint32) sp[FP_GETH(tmpPos)]) * vol + tr) / (256 * 2); *(ap++) += tr;
-#define JMIXER_FUNC_8       tr = ((*volTab8)[vol][sp[FP_GETH(tmpPos)]] + tr) / 2; *(ap++) += tr;
-#else
-#define JMIXER_FUNC_16      *(ap++) += (((Sint32) sp[FP_GETH(tmpPos)]) * vol) / 256;
-#define JMIXER_FUNC_8       *(ap++) += (*volTab8)[vol][sp[FP_GETH(tmpPos)]];
-#endif
+#ifdef JSS_MIX_FP
+#define JMIXER_ADDBUF_TYPE float
+#define JMIXER_SAMPLE_TYPE float
+#define JMIXER_INIT        const float vol = (float) (chn->chVolume * mixer->globalVol) / (256.0f * 64.0f);
+#define JMIXER_FUNC        tr = (sp[FP_GETH(tmpPos)] * vol + tr) / 2.0f; *(ap++) += tr;
+
+
+#define JMIXER_NAME        jvmMix_Mono_C_FW
+#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) < endPos)
+#include "jmixtmpl_c.h"
+
+
+#define JMIXER_NAME        jvmMix_Mono_C_BW
+#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
+#include "jmixtmpl_c.h"
+
+#undef JMIXER_ADDBUF_TYPE
+#undef JMIXER_SAMPLE_TYPE
+#undef JMIXER_INIT
+#undef JMIXER_FUNC
 
-#define JMIXER_NAME         jvmMix_Mono_C_FW
-#define JMIXER_NEXT         FP_ADD(tmpPos, tmpDelta);
-#define JMIXER_ENDCOND      (FP_GETH(tmpPos) < endPos)
-#include "jmix_c.h"
+#else
+
+#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_NAME        jvmMix_Mono_C_FW
+#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) < endPos)
+#include "jmixtmpl_c.h"
 
-#define JMIXER_NAME         jvmMix_Mono_C_BW
-#define JMIXER_NEXT         FP_SUB(tmpPos, tmpDelta);
-#define JMIXER_ENDCOND      (FP_GETH(tmpPos) > endPos)
-#include "jmix_c.h"
+#define JMIXER_NAME        jvmMix_Mono_C_BW
+#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
+#include "jmixtmpl_c.h"
 
+#undef JMIXER_ADDBUF_TYPE
+#undef JMIXER_SAMPLE_TYPE
 #undef JMIXER_INIT
-#undef JMIXER_FUNC_16
-#undef JMIXER_FUNC_8
+#undef JMIXER_FUNC
 
+#endif
 
 /* Stereo / Linear Interpolation
  */
-#define JMIXER_INIT         const Sint32    vol_l = (chn->chVolume * mixer->globalVol) / 256, \
-                            vol_r = (chn->chVolume * mixer->globalVol) / 256;
-#ifdef JMIXER_INTERPOLATE
-#define JMIXER_FUNC_16      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_8       tl = ((*volTab8)[vol_l][sp[FP_GETH(tmpPos)]] + tl) / 2; *(ap++) += tl; \
-                            tr = ((*volTab8)[vol_r][sp[FP_GETH(tmpPos)]] + tr) / 2; *(ap++) += tr;
-#else
-#define JMIXER_FUNC_16      *(ap++) += (((Sint32) sp[FP_GETH(tmpPos)]) * vol_l) / 256; \
-                            *(ap++) += (((Sint32) sp[FP_GETH(tmpPos)]) * vol_r) / 256;
-#define JMIXER_FUNC_8       *(ap++) += (*volTab8)[vol_l][sp[FP_GETH(tmpPos)]]; \
-                            *(ap++) += (*volTab8)[vol_r][sp[FP_GETH(tmpPos)]];
-#endif
+#ifdef JSS_MIX_FP
+#define JMIXER_ADDBUF_TYPE float
+#define JMIXER_SAMPLE_TYPE float
+#define JMIXER_INIT        const float vol_l = (chn->chVolume * mixer->globalVol) / (256.0f * 64.0f), \
+                                       vol_r = (chn->chVolume * mixer->globalVol) / (256.0f * 64.0f);
+
+#define JMIXER_FUNC        tl = (sp[FP_GETH(tmpPos)] * vol_l + tl) / 2.0f; *(ap++) += tl; \
+                           tr = (sp[FP_GETH(tmpPos)] * vol_r + tr) / 2.0f; *(ap++) += tr;
+
+#define JMIXER_NAME        jvmMix_Stereo_C_FW
+#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) < endPos)
+#include "jmixtmpl_c.h"
+
+#define JMIXER_NAME        jvmMix_Stereo_C_BW
+#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
+#include "jmixtmpl_c.h"
+
+#undef JMIXER_ADDBUF_TYPE
+#undef JMIXER_SAMPLE_TYPE
+#undef JMIXER_INIT
+#undef JMIXER_FUNC
 
-#define JMIXER_NAME         jvmMix_Stereo_C_FW
-#define JMIXER_NEXT         FP_ADD(tmpPos, tmpDelta);
-#define JMIXER_ENDCOND      (FP_GETH(tmpPos) < endPos)
-#include "jmix_c.h"
+#else
+
+#define JMIXER_ADDBUF_TYPE Sint32
+#define JMIXER_SAMPLE_TYPE Sint16
+#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_NAME         jvmMix_Stereo_C_BW
-#define JMIXER_NEXT         FP_SUB(tmpPos, tmpDelta);
-#define JMIXER_ENDCOND      (FP_GETH(tmpPos) > endPos)
-#include "jmix_c.h"
+#define JMIXER_NAME        jvmMix_Stereo_C_FW
+#define JMIXER_NEXT        FP_ADD(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) < endPos)
+#include "jmixtmpl_c.h"
 
+#define JMIXER_NAME        jvmMix_Stereo_C_BW
+#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
+#define JMIXER_ENDCOND     (FP_GETH(tmpPos) > endPos)
+#include "jmixtmpl_c.h"
+
+#undef JMIXER_ADDBUF_TYPE
+#undef JMIXER_SAMPLE_TYPE
 #undef JMIXER_INIT
-#undef JMIXER_FUNC_16
-#undef JMIXER_FUNC_8
+#undef JMIXER_FUNC
 
+#endif
 
 /* Post processing functions
  */
+#ifdef JSS_MIX_FP
+
+#define JMIXER_ADDBUF_TYPE float
+
+#define JMIXER_CLAMP                  \
+    if (t < -1.0f) t = -1.0f; else    \
+    if (t >  1.0f) t =  1.0f;         \
+
 #define JMIXER_NAME jvmPostProcess_U8_C
 #define JMIXER_TYPE Uint8
-#define JMIXER_FUNCTION                                     \
-    if (t < JVM_LIMIT_16_NEG) t = JVM_LIMIT_16_NEG; else    \
-    if (t > JVM_LIMIT_16_POS) t = JVM_LIMIT_16_POS;         \
-    *(sp++) = (t + JVM_ADD_16) >> 8;
-#include "jmix_post.h"
+#define JMIXER_FUNCTION *(sp++) = (t + 1.0f) * 127.0f;
+#include "jmix_post_c.h"
 
 
 #define JMIXER_NAME jvmPostProcess_S8_C
 #define JMIXER_TYPE Sint8
-#define JMIXER_FUNCTION                                     \
-    if (t < JVM_LIMIT_16_NEG) t = JVM_LIMIT_16_NEG; else    \
-    if (t > JVM_LIMIT_16_POS) t = JVM_LIMIT_16_POS;         \
-    *(sp++) = t >> 8;
-#include "jmix_post.h"
+#define JMIXER_FUNCTION *(sp++) = t * 127.0f;
+#include "jmix_post_c.h"
 
 
 #define JMIXER_NAME jvmPostProcess_U16_C
 #define JMIXER_TYPE Uint16
-#define JMIXER_FUNCTION                                     \
-    if (t < JVM_LIMIT_16_NEG) t = JVM_LIMIT_16_NEG; else    \
-    if (t > JVM_LIMIT_16_POS) t = JVM_LIMIT_16_POS;         \
-    *(sp++) = t + JVM_ADD_16;
-#include "jmix_post.h"
+#define JMIXER_FUNCTION *(sp++) = (t + 1.0f) * 32767.0f;
+#include "jmix_post_c.h"
 
 
 #define JMIXER_NAME jvmPostProcess_S16_C
 #define JMIXER_TYPE Sint16
-#define JMIXER_FUNCTION                                     \
+#define JMIXER_FUNCTION *(sp++) = t * 32767.0f;
+#include "jmix_post_c.h"
+
+
+#else
+
+#define JMIXER_ADDBUF_TYPE Sint32
+
+#define JMIXER_CLAMP \
     if (t < JVM_LIMIT_16_NEG) t = JVM_LIMIT_16_NEG; else    \
     if (t > JVM_LIMIT_16_POS) t = JVM_LIMIT_16_POS;         \
-    *(sp++) = t;
-#include "jmix_post.h"
+
+#define JMIXER_NAME jvmPostProcess_U8_C
+#define JMIXER_TYPE Uint8
+#define JMIXER_FUNCTION *(sp++) = (t + JVM_ADD_16) >> 8;
+#include "jmix_post_c.h"
+
+
+#define JMIXER_NAME jvmPostProcess_S8_C
+#define JMIXER_TYPE Sint8
+#define JMIXER_FUNCTION *(sp++) = t >> 8;
+#include "jmix_post_c.h"
+
+
+#define JMIXER_NAME jvmPostProcess_U16_C
+#define JMIXER_TYPE Uint16
+#define JMIXER_FUNCTION *(sp++) = t + JVM_ADD_16;
+#include "jmix_post_c.h"
+
+
+#define JMIXER_NAME jvmPostProcess_S16_C
+#define JMIXER_TYPE Sint16
+#define JMIXER_FUNCTION *(sp++) = t;
+#include "jmix_post_c.h"
+
+#endif