fmodex/src/fmod_dsp_tremolo.h

127 lines
4.8 KiB
C++
Executable file

#ifndef _FMOD_DSP_TREMOLO_H
#define _FMOD_DSP_TREMOLO_H
#include "fmod_settings.h"
#ifdef FMOD_SUPPORT_TREMOLO
#include "fmod.h"
#include "fmod_dsp_filter.h"
#define TREMOLO_MAX_CHANNELS 16
#define TREMOLO_MAX_CHANNEL_MAPS 8
#define TREMOLO_TABLE_SIZE 16
#define TREMOLO_TRANSITION 128
namespace FMOD
{
#if defined(PLATFORM_PS3) || defined(PLATFORM_WINDOWS_PS3MODE)
class DSPTremolo : public DSPI
#else
class DSPTremolo : public DSPFilter
#endif
{
DECLARE_MEMORYTRACKER_NONVIRTUAL
private:
typedef struct {
int channelcount;
float phase[TREMOLO_MAX_CHANNEL_MAPS];
} speakerPhaseMap;
static const speakerPhaseMap phaseMap[];
float FMOD_PPCALIGN16(mFrequency);
float FMOD_PPCALIGN16(mFrequencyUpdate);
float FMOD_PPCALIGN16(mDepth);
float FMOD_PPCALIGN16(mDepthUpdate);
float FMOD_PPCALIGN16(mShape);
float FMOD_PPCALIGN16(mShapeUpdate);
float FMOD_PPCALIGN16(mSkew);
float FMOD_PPCALIGN16(mSkewUpdate);
float FMOD_PPCALIGN16(mDuty);
float FMOD_PPCALIGN16(mDutyUpdate);
float FMOD_PPCALIGN16(mSquare);
float FMOD_PPCALIGN16(mSquareUpdate);
float FMOD_PPCALIGN16(mPhase);
float FMOD_PPCALIGN16(mPhaseUpdate);
bool FMOD_PPCALIGN16(mUpdatePhase);
float FMOD_PPCALIGN16(mSpread);
float FMOD_PPCALIGN16(mSpreadUpdate);
float FMOD_PPCALIGN16(mKUp);
float FMOD_PPCALIGN16(mKHigh);
float FMOD_PPCALIGN16(mKDown);
float FMOD_PPCALIGN16(mKLow);
int FMOD_PPCALIGN16(mPosUp);
int FMOD_PPCALIGN16(mPosHigh);
int FMOD_PPCALIGN16(mPosDown);
int FMOD_PPCALIGN16(mPosLow);
float FMOD_PPCALIGN16(mPeriod);
int FMOD_PPCALIGN16(mPeriodSamples);
float FMOD_PPCALIGN16(mPeriodAdjust);
float FMOD_PPCALIGN16(mPeriodOffset);
int FMOD_PPCALIGN16(mPeriodAddSample);
float FMOD_PPCALIGN16(mTableUpPeriod);
float FMOD_PPCALIGN16(mTableDownPeriod);
float FMOD_PPCALIGN16(mUpRampFactor);
float FMOD_PPCALIGN16(mDownRampFactor);
float FMOD_PPCALIGN16(mTransitionRampFactor);
float FMOD_PPCALIGN16(mLFOMin);
float FMOD_PPCALIGN16(mInvPeriod);
float FMOD_PPCALIGN16(mInvTableSize);
int FMOD_PPCALIGN16(mLFOPos[TREMOLO_MAX_CHANNELS]);
float FMOD_PPCALIGN16(mLFOLevel[TREMOLO_MAX_CHANNELS]);
float FMOD_PPCALIGN16(mLFORamp[TREMOLO_MAX_CHANNELS]);
int FMOD_PPCALIGN16(mLFONextRamp[TREMOLO_MAX_CHANNELS]);
float FMOD_PPCALIGN16(mLFOTable[TREMOLO_TABLE_SIZE+1]);
int FMOD_PPCALIGN16(mOutputRate);
int FMOD_PPCALIGN16(mChannels);
unsigned short mOldSpeakerMask;
FMOD_RESULT createInternal();
FMOD_RESULT releaseInternal();
FMOD_RESULT resetInternal();
FMOD_RESULT readInternal(float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels);
FMOD_RESULT setParameterInternal(int index, float value);
FMOD_RESULT getParameterInternal(int index, float *value, char *valuestr);
void createLFOTable();
void updateWaveform();
void updateTiming();
void applyPhase();
void getRampValues(int samplepos, float *p_lfolevel, float *p_lforamp, int *p_nextramppos);
float getLFOLevel(int samplepos);
float readLFOTable(int pos, bool forward, float *ramp);
public:
static FMOD_DSP_DESCRIPTION_EX *getDescriptionEx();
static FMOD_RESULT F_CALLBACK createCallback(FMOD_DSP_STATE *dsp);
static FMOD_RESULT F_CALLBACK releaseCallback(FMOD_DSP_STATE *dsp);
static FMOD_RESULT F_CALLBACK resetCallback(FMOD_DSP_STATE *dsp);
static FMOD_RESULT F_CALLBACK readCallback(FMOD_DSP_STATE *dsp, float *inbuffer, float *outbuffer, unsigned int length, int inchannels, int outchannels);
static FMOD_RESULT F_CALLBACK setParameterCallback(FMOD_DSP_STATE *dsp, int index, float value);
static FMOD_RESULT F_CALLBACK getParameterCallback(FMOD_DSP_STATE *dsp, int index, float *value, char *valuestr);
#ifdef FMOD_SUPPORT_MEMORYTRACKER
static FMOD_RESULT F_CALLBACK getMemoryUsedCallback(FMOD_DSP_STATE *dsp, MemoryTracker *tracker);
#endif
};
}
#endif
#endif