view minijss/jmix_c_in.c @ 2576:812b16ee49db

I had been living under apparent false impression that "realfft.c" on which the FFT implementation in DMLIB was basically copied from was released in public domain at some point, but it could very well be that it never was. Correct license is (or seems to be) GNU GPL. Thus I removing the code from DMLIB, and profusely apologize to the author, Philip Van Baren. It was never my intention to distribute code based on his original work under a more liberal license than originally intended.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 11 Mar 2022 16:32:50 +0200
parents 95eb6285f45c
children
line wrap: on
line source

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

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


/* Mono / Linear Interpolation
 */
#define JMIXER_SAMPLE_TYPE Sint16
#define JMIXER_INIT
#define JMIXER_FUNC \
    const Sint32 vol = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256; \
    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
    tl[4] = (((Sint32) sp[FP_GETH32(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);
#define JMIXER_NEXT_RAMP   FP_ADD(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw < endPos.dw)
#include "jmixtmpl_c.h"

#define JMIXER_NAME        jvmMix_Mono_C_BW
#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_SUB(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw > endPos.dw)
#include "jmixtmpl_c.h"


#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC


/* Stereo / Linear Interpolation
 */
#define JMIXER_SAMPLE_TYPE Sint16
#define JMIXER_INIT

#define JMIXER_FUNC \
    const Sint32 vol_l = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256, \
                 vol_r = (FP_GETH32(tmpVolume) * mixer->globalVol) / 256; \
    memmove(&tl[0], &tl[1], 4 * sizeof(tl[0])); \
    memmove(&tr[0], &tr[1], 4 * sizeof(tr[0])); \
    tl[4] = (((Sint32) sp[FP_GETH32(tmpPos)]) * vol_l * 3 + tl[3] * 2 + tl[2] + tl[1] + tl[0]) / (256 * 8); \
    *(ap++) += tl[4]; \
    tr[4] = (((Sint32) sp[FP_GETH32(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);
#define JMIXER_NEXT_RAMP   FP_ADD(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw < endPos.dw)
#include "jmixtmpl_c.h"

#define JMIXER_NAME        jvmMix_Stereo_C_BW
#define JMIXER_NEXT        FP_SUB(tmpPos, tmpDelta);
#define JMIXER_NEXT_RAMP   FP_SUB(tmpPos, tmpDelta); FP_ADD(tmpVolume, tmpDeltaV);
#define JMIXER_ENDCOND     (tmpPos.dw > endPos.dw)
#include "jmixtmpl_c.h"


#undef JMIXER_SAMPLE_TYPE
#undef JMIXER_INIT
#undef JMIXER_FUNC


/* Post processing functions
 */
#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"