Show More
Commit Description:
Add timers for Simulation and various engines...
Commit Description:
Add timers for Simulation and various engines Starting to add additional timers for different stages of the process of updating in order to get more insight into what is slowing it down. The update takes 9ms, which is much longer than it used to. Engine-specific timers are coming later.
File last commit:
Show/Diff file:
Action:
FNA/lib/FAudio/src/FACT_internal.h
625 lines | 12.1 KiB | text/x-c | CLexer
/* FAudio - XAudio Reimplementation for FNA
*
* Copyright (c) 2011-2020 Ethan Lee, Luigi Auriemma, and the MonoGame Team
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software for any purpose,
* including commercial applications, and to alter it and redistribute it
* freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be
* misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*
* Ethan "flibitijibibo" Lee <flibitijibibo@flibitijibibo.com>
*
*/
#include "FACT.h"
#include "FACT3D.h"
#include "FAudio_internal.h"
/* Internal AudioEngine Types */
typedef struct FACTAudioCategory
{
uint8_t instanceLimit;
uint16_t fadeInMS;
uint16_t fadeOutMS;
uint8_t maxInstanceBehavior;
int16_t parentCategory;
float volume;
uint8_t visibility;
uint8_t instanceCount;
float currentVolume;
} FACTAudioCategory;
typedef struct FACTVariable
{
uint8_t accessibility;
float initialValue;
float minValue;
float maxValue;
} FACTVariable;
typedef struct FACTRPCPoint
{
float x;
float y;
uint8_t type;
} FACTRPCPoint;
typedef enum FACTRPCParameter
{
RPC_PARAMETER_VOLUME,
RPC_PARAMETER_PITCH,
RPC_PARAMETER_REVERBSEND,
RPC_PARAMETER_FILTERFREQUENCY,
RPC_PARAMETER_FILTERQFACTOR,
RPC_PARAMETER_COUNT /* If >=, DSP Parameter! */
} FACTRPCParameter;
typedef struct FACTRPC
{
uint16_t variable;
uint8_t pointCount;
uint16_t parameter;
FACTRPCPoint *points;
} FACTRPC;
typedef struct FACTDSPParameter
{
uint8_t type;
float value;
float minVal;
float maxVal;
uint16_t unknown;
} FACTDSPParameter;
typedef struct FACTDSPPreset
{
uint8_t accessibility;
uint32_t parameterCount;
FACTDSPParameter *parameters;
} FACTDSPPreset;
typedef enum FACTNoticationsFlags
{
NOTIFY_CUEDESTROY = 0x0001,
NOTIFY_SOUNDBANKDESTROY = 0x0002,
NOTIFY_WAVEBANKDESTROY = 0x0004,
NOTIFY_WAVEDESTROY = 0x0008,
} FACTNoticationsFlags;
/* Internal SoundBank Types */
typedef enum
{
FACTEVENT_STOP = 0,
FACTEVENT_PLAYWAVE = 1,
FACTEVENT_PLAYWAVETRACKVARIATION = 3,
FACTEVENT_PLAYWAVEEFFECTVARIATION = 4,
FACTEVENT_PLAYWAVETRACKEFFECTVARIATION = 6,
FACTEVENT_PITCH = 7,
FACTEVENT_VOLUME = 8,
FACTEVENT_MARKER = 9,
FACTEVENT_PITCHREPEATING = 16,
FACTEVENT_VOLUMEREPEATING = 17,
FACTEVENT_MARKERREPEATING = 18
} FACTEventType;
typedef struct FACTEvent
{
uint16_t type;
uint16_t timestamp;
uint16_t randomOffset;
FAUDIONAMELESS union
{
/* Play Wave Event */
struct
{
uint8_t flags;
uint8_t loopCount;
uint16_t position;
uint16_t angle;
/* Track Variation */
uint8_t isComplex;
FAUDIONAMELESS union
{
struct
{
uint16_t track;
uint8_t wavebank;
} simple;
struct
{
uint16_t variation;
uint16_t trackCount;
uint16_t *tracks;
uint8_t *wavebanks;
uint8_t *weights;
} complex;
};
/* Effect Variation */
int16_t minPitch;
int16_t maxPitch;
float minVolume;
float maxVolume;
float minFrequency;
float maxFrequency;
float minQFactor;
float maxQFactor;
uint16_t variationFlags;
} wave;
/* Set Pitch/Volume Event */
struct
{
uint8_t settings;
uint16_t repeats;
uint16_t frequency;
FAUDIONAMELESS union
{
struct
{
float initialValue;
float initialSlope;
float slopeDelta;
uint16_t duration;
} ramp;
struct
{
uint8_t flags;
float value1;
float value2;
} equation;
};
} value;
/* Stop Event */
struct
{
uint8_t flags;
} stop;
/* Marker Event */
struct
{
uint32_t marker;
uint16_t repeats;
uint16_t frequency;
} marker;
};
} FACTEvent;
typedef struct FACTTrack
{
uint32_t code;
float volume;
uint8_t filter;
uint8_t qfactor;
uint16_t frequency;
uint8_t rpcCodeCount;
uint32_t *rpcCodes;
uint8_t eventCount;
FACTEvent *events;
} FACTTrack;
typedef struct FACTSound
{
uint8_t flags;
uint16_t category;
float volume;
int16_t pitch;
uint8_t priority;
uint8_t trackCount;
uint8_t rpcCodeCount;
uint8_t dspCodeCount;
FACTTrack *tracks;
uint32_t *rpcCodes;
uint32_t *dspCodes;
} FACTSound;
typedef struct FACTCueData
{
uint8_t flags;
uint32_t sbCode;
uint32_t transitionOffset;
uint8_t instanceLimit;
uint16_t fadeInMS;
uint16_t fadeOutMS;
uint8_t maxInstanceBehavior;
uint8_t instanceCount;
} FACTCueData;
typedef struct FACTVariation
{
FAUDIONAMELESS union
{
struct
{
uint16_t track;
uint8_t wavebank;
} simple;
uint32_t soundCode;
};
float minWeight;
float maxWeight;
uint32_t linger;
} FACTVariation;
typedef struct FACTVariationTable
{
uint8_t flags;
int16_t variable;
uint8_t isComplex;
uint16_t entryCount;
FACTVariation *entries;
} FACTVariationTable;
typedef struct FACTTransition
{
int32_t soundCode;
uint32_t srcMarkerMin;
uint32_t srcMarkerMax;
uint32_t dstMarkerMin;
uint32_t dstMarkerMax;
uint16_t fadeIn;
uint16_t fadeOut;
uint16_t flags;
} FACTTransition;
typedef struct FACTTransitionTable
{
uint32_t entryCount;
FACTTransition *entries;
} FACTTransitionTable;
/* Internal WaveBank Types */
typedef struct FACTSeekTable
{
uint32_t entryCount;
uint32_t *entries;
} FACTSeekTable;
/* Internal Cue Types */
typedef struct FACTInstanceRPCData
{
float rpcVolume;
float rpcPitch;
float rpcReverbSend;
float rpcFilterFreq;
float rpcFilterQFactor;
} FACTInstanceRPCData;
typedef struct FACTEventInstance
{
uint32_t timestamp;
uint16_t loopCount;
uint8_t finished;
FAUDIONAMELESS union
{
float value;
uint32_t valuei;
};
} FACTEventInstance;
typedef struct FACTTrackInstance
{
/* Tracks which events have fired */
FACTEventInstance *events;
/* RPC instance data */
FACTInstanceRPCData rpcData;
/* SetPitch/SetVolume data */
float evtPitch;
float evtVolume;
/* Wave playback */
struct
{
FACTWave *wave;
float baseVolume;
int16_t basePitch;
float baseQFactor;
float baseFrequency;
} activeWave, upcomingWave;
FACTEvent *waveEvt;
FACTEventInstance *waveEvtInst;
} FACTTrackInstance;
typedef struct FACTSoundInstance
{
/* Base Sound reference */
FACTSound *sound;
/* Per-instance track information */
FACTTrackInstance *tracks;
/* RPC instance data */
FACTInstanceRPCData rpcData;
/* Fade data */
uint32_t fadeStart;
uint16_t fadeTarget;
uint8_t fadeType; /* In (1), Out (2), Release RPC (3) */
/* Engine references */
FACTCue *parentCue;
} FACTSoundInstance;
/* Internal Wave Types */
typedef struct FACTWaveCallback
{
FAudioVoiceCallback callback;
FACTWave *wave;
} FACTWaveCallback;
/* Public XACT Types */
struct FACTAudioEngine
{
uint32_t refcount;
FACTNotificationCallback notificationCallback;
FACTReadFileCallback pReadFile;
FACTGetOverlappedResultCallback pGetOverlappedResult;
uint16_t categoryCount;
uint16_t variableCount;
uint16_t rpcCount;
uint16_t dspPresetCount;
uint16_t dspParameterCount;
char **categoryNames;
char **variableNames;
uint32_t *rpcCodes;
uint32_t *dspPresetCodes;
FACTAudioCategory *categories;
FACTVariable *variables;
FACTRPC *rpcs;
FACTDSPPreset *dspPresets;
/* Engine references */
LinkedList *sbList;
LinkedList *wbList;
FAudioMutex sbLock;
FAudioMutex wbLock;
float *globalVariableValues;
/* FAudio references */
FAudio *audio;
FAudioMasteringVoice *master;
FAudioSubmixVoice *reverbVoice;
/* Engine thread */
FAudioThread apiThread;
FAudioMutex apiLock;
uint8_t initialized;
/* Allocator callbacks */
FAudioMallocFunc pMalloc;
FAudioFreeFunc pFree;
FAudioReallocFunc pRealloc;
/* Peristent Notifications */
FACTNoticationsFlags notifications;
void *cue_context;
void *sb_context;
void *wb_context;
void *wave_context;
};
struct FACTSoundBank
{
/* Engine references */
FACTAudioEngine *parentEngine;
FACTCue *cueList;
uint8_t notifyOnDestroy;
void *usercontext;
/* Array sizes */
uint16_t cueCount;
uint8_t wavebankCount;
uint16_t soundCount;
uint16_t variationCount;
uint16_t transitionCount;
/* Strings, strings everywhere! */
char **wavebankNames;
char **cueNames;
/* Actual SoundBank information */
char *name;
FACTCueData *cues;
FACTSound *sounds;
uint32_t *soundCodes;
FACTVariationTable *variations;
uint32_t *variationCodes;
FACTTransitionTable *transitions;
uint32_t *transitionCodes;
};
struct FACTWaveBank
{
/* Engine references */
FACTAudioEngine *parentEngine;
LinkedList *waveList;
FAudioMutex waveLock;
uint8_t notifyOnDestroy;
void *usercontext;
/* Actual WaveBank information */
char *name;
uint32_t entryCount;
FACTWaveBankEntry *entries;
uint32_t *entryRefs;
FACTSeekTable *seekTables;
/* I/O information */
uint32_t packetSize;
uint16_t streaming;
uint8_t *packetBuffer;
uint32_t packetBufferLen;
void* io;
};
struct FACTWave
{
/* Engine references */
FACTWaveBank *parentBank;
FACTCue *parentCue;
uint16_t index;
uint8_t notifyOnDestroy;
void *usercontext;
/* Playback */
uint32_t state;
float volume;
int16_t pitch;
uint8_t loopCount;
/* Stream data */
uint32_t streamSize;
uint32_t streamOffset;
uint8_t *streamCache;
/* FAudio references */
uint16_t srcChannels;
FAudioSourceVoice *voice;
FACTWaveCallback callback;
};
struct FACTCue
{
/* Engine references */
FACTSoundBank *parentBank;
FACTCue *next;
uint8_t managed;
uint16_t index;
uint8_t notifyOnDestroy;
void *usercontext;
/* Sound data */
FACTCueData *data;
FAUDIONAMELESS union
{
FACTVariationTable *variation;
/* This is only used in scenarios where there is only one
* Sound; XACT does not generate variation tables for
* Cues with only one Sound.
*/
FACTSound *sound;
};
/* Instance data */
float *variableValues;
float interactive;
/* Playback */
uint32_t state;
FACTWave *simpleWave;
FACTSoundInstance *playingSound;
FACTVariation *playingVariation;
uint32_t maxRpcReleaseTime;
/* 3D Data */
uint8_t active3D;
uint32_t srcChannels;
uint32_t dstChannels;
float matrixCoefficients[2 * 8]; /* Stereo input, 7.1 output */
/* Timer */
uint32_t start;
uint32_t elapsed;
};
/* Internal functions */
void FACT_INTERNAL_GetNextWave(
FACTCue *cue,
FACTSound *sound,
FACTTrack *track,
FACTTrackInstance *trackInst,
FACTEvent *evt,
FACTEventInstance *evtInst
);
uint8_t FACT_INTERNAL_CreateSound(FACTCue *cue, uint16_t fadeInMS);
void FACT_INTERNAL_DestroySound(FACTSoundInstance *sound);
void FACT_INTERNAL_BeginFadeOut(FACTSoundInstance *sound, uint16_t fadeOutMS);
void FACT_INTERNAL_BeginReleaseRPC(FACTSoundInstance *sound, uint16_t releaseMS);
/* RPC Helper Functions */
FACTRPC* FACT_INTERNAL_GetRPC(FACTAudioEngine *engine, uint32_t code);
/* FACT Thread */
int32_t FAUDIOCALL FACT_INTERNAL_APIThread(void* enginePtr);
/* FAudio callbacks */
void FACT_INTERNAL_OnBufferEnd(FAudioVoiceCallback *callback, void* pContext);
void FACT_INTERNAL_OnStreamEnd(FAudioVoiceCallback *callback);
/* FAudioIOStream functions */
int32_t FACTCALL FACT_INTERNAL_DefaultReadFile(
void *hFile,
void *buffer,
uint32_t nNumberOfBytesToRead,
uint32_t *lpNumberOfBytesRead,
FACTOverlapped *lpOverlapped
);
int32_t FACTCALL FACT_INTERNAL_DefaultGetOverlappedResult(
void *hFile,
FACTOverlapped *lpOverlapped,
uint32_t *lpNumberOfBytesTransferred,
int32_t bWait
);
/* Parsing functions */
uint32_t FACT_INTERNAL_ParseAudioEngine(
FACTAudioEngine *pEngine,
const FACTRuntimeParameters *pParams
);
uint32_t FACT_INTERNAL_ParseSoundBank(
FACTAudioEngine *pEngine,
const void *pvBuffer,
uint32_t dwSize,
FACTSoundBank **ppSoundBank
);
uint32_t FACT_INTERNAL_ParseWaveBank(
FACTAudioEngine *pEngine,
void* io,
uint32_t offset,
uint32_t packetSize,
FACTReadFileCallback pRead,
FACTGetOverlappedResultCallback pOverlap,
uint16_t isStreaming,
FACTWaveBank **ppWaveBank
);
/* vim: set noexpandtab shiftwidth=8 tabstop=8: */