view jssmix.h @ 96:6bf5220fa47e

Urgh .. use memset to silence some bogus GCC warnings about using potentially uninitialized values, while that will not actually be possible. In any case, it is annoying.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 02 Oct 2012 18:52:28 +0300
parents 2edda27f951c
children 1ba202b448e0
line wrap: on
line source

/*
 * miniJSS - Mixing device and channel handling
 * Programmed and designed by Matti 'ccr' Hamalainen
 * (C) Copyright 2006-2012 Tecnic Software productions (TNSP)
 */
#ifndef JSSMIX_H
#define JSSMIX_H
#include "jss.h"

//#define DBG(...) do { fprintf(stderr, __VA_ARGS__); } while (0)
#define DBG(...) do { /* stub */ } while (0)


// Mixing limits
#define JVM_LIMIT_16_POS    (32767)
#define JVM_LIMIT_16_NEG    (-32767)
#define JVM_ADD_16          (32768)


#define JMIXER_ADDBUF_TYPE Sint32


// A channel data structure
typedef struct
{
    DMFixedPoint
            chPos,          // Current position in sample, 32:32 fixpoint
            chDeltaO;       // Delta in 32:32 UNSIGNED! (chDirection)

    int     chFreq;         // Frequency of sampel in Hz
    Sint32
            chSize,         // Length of sample in UNITS
            chLoopS,        // Loop start in UNITS
            chLoopE;        // Loop end in UNITS

    void    *chData;        // Pointer to data

    BOOL    chPlaying,      // TRUE = playing
            chMute,         // TRUE = muted
            chDirection;    // TRUE = playing forwards, FALSE = backwards

    int     chFlags;        // Flags
    int     chVolume,       // Volume
            chPanning;      // Panning

    JMIXER_ADDBUF_TYPE chPrevR[5], chPrevL[5];
} JSSChannel;


// Channel table
typedef int JSSChannelTable[jsetNChannels];


// Virtual software mixer "device" structure
typedef struct _JSSMixer JSSMixer;

struct _JSSMixer
{
    int             outFormat,
                    outChannels,
                    outFreq,
                    globalVol;
    JSSChannel      channels[jsetNChannels];
    
    int             addBufSize;
    JMIXER_ADDBUF_TYPE *addBuffer;

    // Callback handling
    int             cbFreq, cbCounter;
    void            *cbData;
    void            (*cbFunction)(void *, void *);

    // Mixing routine pointers
    int    (*jvmMixChannel_FW)(JSSMixer *, JSSChannel *, JMIXER_ADDBUF_TYPE *, const int, const Sint32);
    int    (*jvmMixChannel_BW)(JSSMixer *, JSSChannel *, JMIXER_ADDBUF_TYPE *, const int, const Sint32);
    void   (*jvmPostProcess)(JMIXER_ADDBUF_TYPE *, void *, const int);

    // Device locking
#ifdef JSS_SUP_THREADS
    DMMutex *mutex;
#endif
};


/* Enums
 */
enum {
    JMIX_AUTO = 0,
    JMIX_C,
    JMIX_MMX,
    JMIX_SSE
};


/* Main routines
 */
JSSMixer *  jvmInit(const int outFormat, const int nChannels, const int outFreq, const int mixerID);
int         jvmClose(JSSMixer *mixer);

int         jvmSetCallback(JSSMixer *mixer, void (*cbFunction)(void *, void *), void *cbData);
void        jvmRemoveCallback(JSSMixer *mixer);
int         jvmSetCallbackFreq(JSSMixer *mixer, const int cbFreq);
Sint32      jvmGetLastCBBufPos(JSSMixer *mixer, const int cbHandle);
Sint32      jvmGetNextCBBufPos(JSSMixer *mixer, const int cbHandle);

int         jvmGetSampleSize(JSSMixer *mixer);
int         jvmGetSampleRes(JSSMixer *mixer);

void        jvmRenderAudio(JSSMixer *mixer, void *mixBuffer, const int mixLength);


/*
int         jvmAddCallback(JSSMixer *mixer, void (*cbFunction)(JSSMixer *, void *));
int         jvmRemoveCallback(JSSMixer *mixer, int cbHandle);
int         jvmSetCallbackFreq(JSSMixer *mixer, int cbHandle, int cbFreq);

int         jvmAllocChannels(JSSMixer *mixer, int nChannels);
int         jvmFreeChannels(JSSMixer *mixer, int iHandle);
int         jvmGetChannelTable(JSSMixer *mixer, int iHandle, JSSChannelTable *pTable);
*/


/* Channel manipulation routines
 */
void        jvmPlay(JSSMixer *mixer, const int channel);
void        jvmStop(JSSMixer *mixer, const int channel);

void        jvmSetSample(JSSMixer *mixer, const int channel,
            void *data, const Sint32 size, const Sint32 loopS,
            const Sint32 loopE, const int flags);

void        jvmSetFreq(JSSMixer *mixer, const int channel, const int freq);
int         jvmGetFreq(JSSMixer *mixer, const int channel);
void        jvmSetVolume(JSSMixer *mixer, const int channel, const int volume);
int         jvmGetVolume(JSSMixer *mixer, const int channel);
void        jvmSetPos(JSSMixer *mixer, const int channel, const Sint32 pos);
Sint32      jvmGetPos(JSSMixer *mixer, const int channel);

void        jvmSetPan(JSSMixer *mixer, const int channel, const int panning);
int         jvmGetPan(JSSMixer *mixer, const int channel);

void        jvmMute(JSSMixer *mixer, const int channel, const BOOL mute);

void        jvmClear(JSSMixer *mixer, const int channel);
void        jvmClearChannels(JSSMixer *mixer);

void        jvmSetGlobalVol(JSSMixer *mixer, const int volume);
int         jvmGetGlobalVol(JSSMixer *mixer);


#endif // JSSMIX_H