fmodex/src/fmod_dsp_connectioni.h

143 lines
5.6 KiB
C++
Executable file

#ifndef _FMOD_DSP_CONNECTION_H
#define _FMOD_DSP_CONNECTION_H
#include "fmod_settings.h"
#include "fmod.hpp"
#include "fmod_channeli.h"
#include "fmod_linkedlist.h"
#include <stdlib.h>
#ifndef _FMOD_MEMORYTRACKER_H
#include "fmod_memorytracker.h"
#endif
namespace FMOD
{
#if defined(PLATFORM_PSP) || defined(PLATFORM_PS2) || defined(PLATFORM_GC) || defined(PLATFORM_IPHONE)
#define DSP_MAXLEVELS_OUT 2 /* Save memory on these platforms. They'll never see more than stereo. */
#elif (defined(PLATFORM_XENON) && !defined(FMOD_SUPPORT_NEURAL)) || defined(PLATFORM_XBOX) || defined(PLATFORM_WII) /* DPL2 for Wii */
#define DSP_MAXLEVELS_OUT 6 /* Never see more than 5.1. */
#elif defined(PLATFORM_PS3) || defined(PLATFORM_WINDOWS_PS3MODE) || (defined(PLATFORM_XENON) && defined(FMOD_SUPPORT_NEURAL))
#define DSP_MAXLEVELS_OUT 8 /* Never see more than 7.1. */
#else
#define DSP_MAXLEVELS_OUT 16
#endif
#define DSP_MAXLEVELS_IN FMOD_CHANNEL_MAXINPUTCHANNELS
#define DSP_MAXLEVELS_MAX 16 /* This should be whatever is the largest out of DSP_MAXLEVELS_IN and DSP_MAXLEVELS_OUT */
#define DSP_DEFAULTLEVELS_IN 6 /* Enough for a 5.1 input sound. */
const int DSP_RAMPCOUNT = 64; /* All volume ramps will happen over this number of samples to remove clicks. */
#ifdef PLATFORM_XENON
#define DSP_LEVEL_PRECISION 16 /* Half floats - 5 bit exponent, 15bit mantissa. */
#else
#define DSP_LEVEL_PRECISION 32
#endif
#define DSP_LEVEL_SMALLVAL 0.00002f
#if (DSP_LEVEL_PRECISION == 32)
#define DSP_LEVEL_TYPE float
#define DSP_LEVEL_COMPRESS(_val) _val
#define DSP_LEVEL_DECOMPRESS(_val) _val
#else
#define DSP_LEVEL_TYPE unsigned short
#ifdef PLATFORM_XENON
FMOD_INLINE unsigned short FMOD_DSP_ConnectionI_Single2HalfP(float source)
{
__vector4 a;
a.y = source;
return __vpkd3d( a, a, VPACK_FLOAT16_4, VPACK_64LO, 0 ).u[2];
}
FMOD_INLINE float FMOD_DSP_ConnectionI_HalfP2Single(unsigned short h)
{
__vector4 a;
a.u[3] = h;
return __vupkd3d( a, VPACK_FLOAT16_4).w;
}
#else
unsigned short FMOD_DSP_ConnectionI_Single2HalfP(float source);
float FMOD_DSP_ConnectionI_HalfP2Single(unsigned short h);
#endif
#define DSP_LEVEL_COMPRESS(_val) FMOD_DSP_ConnectionI_Single2HalfP(_val)
#define DSP_LEVEL_DECOMPRESS(_val) FMOD_DSP_ConnectionI_HalfP2Single(_val)
#endif
class DSPI;
class DSPConnectionI
{
DECLARE_MEMORYTRACKER
public:
LinkedListNode mInputNode;
LinkedListNode mOutputNode;
LinkedListNode *mNode; /* Make it a pointer so we can store the node data externally. PS3 will corrupt it otherwise. */
short mMaxOutputLevels FMOD_PACKED;
short mMaxInputLevels FMOD_PACKED;
DSP_LEVEL_TYPE *mLevel[DSP_MAXLEVELS_OUT];
DSP_LEVEL_TYPE *mLevelCurrent[DSP_MAXLEVELS_OUT];
DSP_LEVEL_TYPE *mLevelDelta[DSP_MAXLEVELS_OUT];
public:
DSPI *mInputUnit;
DSPI *mOutputUnit;
short mRampCount FMOD_PACKED;
short mSetLevelsUsed FMOD_PACKED;
#ifdef PLATFORM_PS3
unsigned short mInputUnitSize FMOD_PACKED;
unsigned short mOutputUnitSize FMOD_PACKED;
FMOD_PPCALIGN16(unsigned int mMramAddress);
FMOD_PPCALIGN16(unsigned int mMramAddressLevels);
#endif
float mVolume;
void *mUserData;
static FMOD_RESULT validate (DSPConnection *dspconnection, DSPConnectionI **dspconnectioni);
FMOD_RESULT init (DSP_LEVEL_TYPE * &levelmemory, int maxoutputlevels, int maxinputlevels);
FMOD_RESULT mix (float * FMOD_RESTRICT outbuffer, float * FMOD_RESTRICT inbuffer, int outchannels, int inchannels, unsigned int length);
FMOD_RESULT mixAndRamp (float * FMOD_RESTRICT outbuffer, float * FMOD_RESTRICT inbuffer, int outchannels, int inchannels, unsigned int length);
FMOD_RESULT getInput (DSPI **input);
FMOD_RESULT getOutput (DSPI **output);
FMOD_RESULT reset ();
FMOD_RESULT setUnity ();
FMOD_RESULT rampTo ();
FMOD_RESULT checkUnity (int outchannels, int inchannels);
FMOD_RESULT checkMono (int outchannels, int inchannels);
FMOD_RESULT setPan (float pan, int outchannels, int inchannels, FMOD_SPEAKERMODE speakermode);
FMOD_RESULT setMix (float volume);
FMOD_RESULT getMix (float *volume);
FMOD_RESULT setLevels (float *levels, int numinputlevels);
FMOD_RESULT getLevels (float *levels, int numinputlevels);
FMOD_RESULT setLevels (FMOD_SPEAKER speaker, float *levels, int numlevels);
FMOD_RESULT getLevels (FMOD_SPEAKER speaker, float *levels, int numlevels);
FMOD_RESULT setUserData (void *userdata);
FMOD_RESULT getUserData (void **userdata);
FMOD_RESULT copy (DSPConnectionI *source);
FMOD_RESULT getMemoryInfo(unsigned int memorybits, unsigned int event_memorybits, unsigned int *memoryused, FMOD_MEMORY_USAGE_DETAILS *memoryused_details);
};
}
#endif