view jmix_c_in.c @ 54:65cdb4de6fd8

Cosmetics.
author Matti Hamalainen <ccr@tnsp.org>
date Mon, 01 Oct 2012 04:18:15 +0300
parents 36e2f910219c
children 8725853609db
line wrap: on
line source

/*
 * miniJSS - Mixing routines in C
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2006-2007 Tecnic Software productions (TNSP)
 */

//#define JMIXER_DEBUG fprintf(stderr, "[%.8x:%.8x / %.8x]: %d\n", FP_GETH(tmpPos), FP_GETL(tmpPos), endPos, sp[FP_GETH(tmpPos)]);
#define JMIXER_DEBUG

#ifndef JMIXER_ADDBUF_TYPE
#ifdef JSS_MIX_FP
#define JMIXER_ADDBUF_TYPE double
#else
#define JMIXER_ADDBUF_TYPE Sint32
#endif
#endif

/* Mono / Linear Interpolation
 */
#ifdef JSS_MIX_FP
#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"

#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 "jmixtmpl_c.h"

#endif

#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC

/* Stereo / Linear Interpolation
 */
#ifdef JSS_MIX_FP
#define JMIXER_SAMPLE_TYPE float
#define JMIXER_INIT        const double vol_l = (chn->chVolume * mixer->globalVol) / 256.0f, \
                                       vol_r = (chn->chVolume * mixer->globalVol) / 256.0f;

#define JMIXER_FUNC        tl = ((double)sp[FP_GETH(tmpPos)] * vol_l + tl) / (2.0f * 256.0f); *(ap++) += tl; \
                           tr = ((double)sp[FP_GETH(tmpPos)] * vol_r + tr) / (2.0f * 256.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"

#else

#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_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"

#endif

#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC


/* Post processing functions
 */
#ifdef JSS_MIX_FP

#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 *(sp++) = (t + 1.0f) * 127.0f;
#include "jmix_post_c.h"


#define JMIXER_NAME jvmPostProcess_S8_C
#define JMIXER_TYPE Sint8
#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 *(sp++) = (t + 1.0f) * 32767.0f;
#include "jmix_post_c.h"


#define JMIXER_NAME jvmPostProcess_S16_C
#define JMIXER_TYPE Sint16
#define JMIXER_FUNCTION *(sp++) = t * 32767.0f;
#include "jmix_post_c.h"


#else

#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;

#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