view jssmix.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children f3407a58e01e
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)


// 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
    Uint32
            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

    Sint32  chPrevR, chPrevL;
} JSSChannel;


// Channel table
typedef int JSSChannelTable[jsetNChannels];

typedef Sint32 JSSVolumeTable[256][256];


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

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

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

    // Mixing routine pointers
    int (*jvmMixChannel_FW)(JSSMixer *, JSSChannel *, Sint32 *, const int, const Uint32);
    int (*jvmMixChannel_BW)(JSSMixer *, JSSChannel *, Sint32 *, const int, const Uint32);
    void (*jvmPostProcess)(Sint32 *, void *mixBuffer, 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);
Uint32      jvmGetLastCBBufPos(JSSMixer *mixer, const int cbHandle);
Uint32      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 Uint32 size, const Uint32 loopS,
            const Uint32 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 Uint32 pos);
Uint32      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