Mercurial > hg > dmlib
diff minijss/jssmix.h @ 658:c430112449a7
Move miniJSS into a subdirectory.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 16 Apr 2013 07:32:29 +0300 |
parents | jssmix.h@3bdc776a4b33 |
children | e22d4ceb6414 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/minijss/jssmix.h Tue Apr 16 07:32:29 2013 +0300 @@ -0,0 +1,170 @@ +/* + * 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" + + +#ifdef __cplusplus +extern "C" { +#endif + +//#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 + chSize, // Length of sample in UNITS + chLoopS, // Loop start in UNITS + chLoopE, // Loop end in UNITS + + chPos, // Current position in sample, 32:32 fixpoint + chDeltaO, // Delta in 32:32 UNSIGNED! (chDirection) + chVolume, // Volume + chDeltaV, + chPanning, // Panning + chDeltaP; + int chVolumeD, + chPanningD; + + int chFreq; // Frequency of sampel in Hz + + void *chData; // Pointer to data + + BOOL chPlaying, // TRUE = playing + chMute, // TRUE = muted + chDirection; // TRUE = playing forwards, FALSE = backwards + + int chFlags; // Flags + + 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 DMFixedPoint); + int (*jvmMixChannel_BW)(JSSMixer *, JSSChannel *, JMIXER_ADDBUF_TYPE *, const int, const DMFixedPoint); + 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 outChannels, 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 jvmReset(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); +void jvmSetVolumeRamp(JSSMixer * mixer, const int channel, const int start, const int end, const int len); +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); +void jvmSetPanRamp(JSSMixer * mixer, const int channel, const int start, const int end, const int len); +int jvmGetPan(JSSMixer *mixer, const int channel); + +void jvmMute(JSSMixer *mixer, const int channel, const BOOL mute); +BOOL jvmGetMute(JSSMixer *mixer, const int channel); + +void jvmClear(JSSMixer *mixer, const int channel); +void jvmClearChannels(JSSMixer *mixer); + +void jvmSetGlobalVol(JSSMixer *mixer, const int volume); +int jvmGetGlobalVol(JSSMixer *mixer); + + +#ifdef __cplusplus +} +#endif + +#endif // JSSMIX_H