/* FAudio - XAudio Reimplementation for FNA * * Copyright (c) 2011-2021 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 * */ /* This file has no documentation since you are expected to already know how * XACT works if you are still using these APIs! */ #ifndef FACT_H #define FACT_H #include "FAudio.h" #define FACTAPI FAUDIOAPI #ifdef _WIN32 #define FACTCALL __stdcall #else #define FACTCALL #endif #ifdef __cplusplus extern "C" { #endif /* __cplusplus */ /* Type Declarations */ typedef struct FACTAudioEngine FACTAudioEngine; typedef struct FACTSoundBank FACTSoundBank; typedef struct FACTWaveBank FACTWaveBank; typedef struct FACTWave FACTWave; typedef struct FACTCue FACTCue; typedef struct FACTNotification FACTNotification; typedef struct FACTRendererDetails { int16_t rendererID[0xFF]; /* Win32 wchar_t */ int16_t displayName[0xFF]; /* Win32 wchar_t */ int32_t defaultDevice; } FACTRendererDetails; typedef struct FACTOverlapped { void *Internal; /* ULONG_PTR */ void *InternalHigh; /* ULONG_PTR */ FAUDIONAMELESS union { FAUDIONAMELESS struct { uint32_t Offset; uint32_t OffsetHigh; }; void *Pointer; }; void *hEvent; } FACTOverlapped; typedef int32_t (FACTCALL * FACTReadFileCallback)( void *hFile, void *buffer, uint32_t nNumberOfBytesToRead, uint32_t *lpNumberOfBytesRead, FACTOverlapped *lpOverlapped ); typedef int32_t (FACTCALL * FACTGetOverlappedResultCallback)( void *hFile, FACTOverlapped *lpOverlapped, uint32_t *lpNumberOfBytesTransferred, int32_t bWait ); typedef struct FACTFileIOCallbacks { FACTReadFileCallback readFileCallback; FACTGetOverlappedResultCallback getOverlappedResultCallback; } FACTFileIOCallbacks; typedef void (FACTCALL * FACTNotificationCallback)( const FACTNotification *pNotification ); /* FIXME: ABI bug! This should be pack(1) explicitly. Do not memcpy this! */ typedef struct FACTRuntimeParameters { uint32_t lookAheadTime; void *pGlobalSettingsBuffer; uint32_t globalSettingsBufferSize; uint32_t globalSettingsFlags; uint32_t globalSettingsAllocAttributes; FACTFileIOCallbacks fileIOCallbacks; FACTNotificationCallback fnNotificationCallback; int16_t *pRendererID; /* Win32 wchar_t* */ FAudio *pXAudio2; FAudioMasteringVoice *pMasteringVoice; } FACTRuntimeParameters; typedef struct FACTStreamingParameters { void *file; uint32_t offset; uint32_t flags; uint16_t packetSize; /* Measured in DVD sectors, or 2048 bytes */ } FACTStreamingParameters; #define FACT_WAVEBANK_TYPE_BUFFER 0x00000000 #define FACT_WAVEBANK_TYPE_STREAMING 0x00000001 #define FACT_WAVEBANK_TYPE_MASK 0x00000001 #define FACT_WAVEBANK_FLAGS_ENTRYNAMES 0x00010000 #define FACT_WAVEBANK_FLAGS_COMPACT 0x00020000 #define FACT_WAVEBANK_FLAGS_SYNC_DISABLED 0x00040000 #define FACT_WAVEBANK_FLAGS_SEEKTABLES 0x00080000 #define FACT_WAVEBANK_FLAGS_MASK 0x000F0000 typedef enum FACTWaveBankSegIdx { FACT_WAVEBANK_SEGIDX_BANKDATA = 0, FACT_WAVEBANK_SEGIDX_ENTRYMETADATA, FACT_WAVEBANK_SEGIDX_SEEKTABLES, FACT_WAVEBANK_SEGIDX_ENTRYNAMES, FACT_WAVEBANK_SEGIDX_ENTRYWAVEDATA, FACT_WAVEBANK_SEGIDX_COUNT } FACTWaveBankSegIdx; #pragma pack(push, 1) typedef struct FACTWaveBankRegion { uint32_t dwOffset; uint32_t dwLength; } FACTWaveBankRegion; typedef struct FACTWaveBankSampleRegion { uint32_t dwStartSample; uint32_t dwTotalSamples; } FACTWaveBankSampleRegion; typedef struct FACTWaveBankHeader { uint32_t dwSignature; uint32_t dwVersion; uint32_t dwHeaderVersion; FACTWaveBankRegion Segments[FACT_WAVEBANK_SEGIDX_COUNT]; } FACTWaveBankHeader; typedef union FACTWaveBankMiniWaveFormat { FAUDIONAMELESS struct { uint32_t wFormatTag : 2; uint32_t nChannels : 3; uint32_t nSamplesPerSec : 18; uint32_t wBlockAlign : 8; uint32_t wBitsPerSample : 1; }; uint32_t dwValue; } FACTWaveBankMiniWaveFormat; typedef struct FACTWaveBankEntry { FAUDIONAMELESS union { FAUDIONAMELESS struct { uint32_t dwFlags : 4; uint32_t Duration : 28; }; uint32_t dwFlagsAndDuration; }; FACTWaveBankMiniWaveFormat Format; FACTWaveBankRegion PlayRegion; FACTWaveBankSampleRegion LoopRegion; } FACTWaveBankEntry; typedef struct FACTWaveBankEntryCompact { uint32_t dwOffset : 21; uint32_t dwLengthDeviation : 11; } FACTWaveBankEntryCompact; typedef struct FACTWaveBankData { uint32_t dwFlags; uint32_t dwEntryCount; char szBankName[64]; uint32_t dwEntryMetaDataElementSize; uint32_t dwEntryNameElementSize; uint32_t dwAlignment; FACTWaveBankMiniWaveFormat CompactFormat; uint64_t BuildTime; } FACTWaveBankData; #pragma pack(pop) typedef struct FACTWaveProperties { char friendlyName[64]; FACTWaveBankMiniWaveFormat format; uint32_t durationInSamples; FACTWaveBankSampleRegion loopRegion; int32_t streaming; } FACTWaveProperties; typedef struct FACTWaveInstanceProperties { FACTWaveProperties properties; int32_t backgroundMusic; } FACTWaveInstanceProperties; typedef struct FACTCueProperties { char friendlyName[0xFF]; int32_t interactive; uint16_t iaVariableIndex; uint16_t numVariations; uint8_t maxInstances; uint8_t currentInstances; } FACTCueProperties; typedef struct FACTTrackProperties { uint32_t duration; uint16_t numVariations; uint8_t numChannels; uint16_t waveVariation; uint8_t loopCount; } FACTTrackProperties; typedef struct FACTVariationProperties { uint16_t index; uint8_t weight; float iaVariableMin; float iaVariableMax; int32_t linger; } FACTVariationProperties; typedef struct FACTSoundProperties { uint16_t category; uint8_t priority; int16_t pitch; float volume; uint16_t numTracks; FACTTrackProperties arrTrackProperties[1]; } FACTSoundProperties; typedef struct FACTSoundVariationProperties { FACTVariationProperties variationProperties; FACTSoundProperties soundProperties; } FACTSoundVariationProperties; typedef struct FACTCueInstanceProperties { uint32_t allocAttributes; FACTCueProperties cueProperties; FACTSoundVariationProperties activeVariationProperties; } FACTCueInstanceProperties; #pragma pack(push, 1) typedef struct FACTNotificationDescription { uint8_t type; uint8_t flags; FACTSoundBank *pSoundBank; FACTWaveBank *pWaveBank; FACTCue *pCue; FACTWave *pWave; uint16_t cueIndex; uint16_t waveIndex; void* pvContext; } FACTNotificationDescription; typedef struct FACTNotificationCue { uint16_t cueIndex; FACTSoundBank *pSoundBank; FACTCue *pCue; } FACTNotificationCue; typedef struct FACTNotificationMarker { uint16_t cueIndex; FACTSoundBank *pSoundBank; FACTCue *pCue; uint32_t marker; } FACTNotificationMarker; typedef struct FACTNotificationSoundBank { FACTSoundBank *pSoundBank; } FACTNotificationSoundBank; typedef struct FACTNotificationWaveBank { FACTWaveBank *pWaveBank; } FACTNotificationWaveBank; typedef struct FACTNotificationVariable { uint16_t cueIndex; FACTSoundBank *pSoundBank; FACTCue *pCue; uint16_t variableIndex; float variableValue; int32_t local; } FACTNotificationVariable; typedef struct FACTNotificationGUI { uint32_t reserved; } FACTNotificationGUI; typedef struct FACTNotificationWave { FACTWaveBank *pWaveBank; uint16_t waveIndex; uint16_t cueIndex; FACTSoundBank *pSoundBank; FACTCue *pCue; FACTWave *pWave; } FACTNotificationWave; struct FACTNotification { uint8_t type; int32_t timeStamp; void *pvContext; FAUDIONAMELESS union { FACTNotificationCue cue; FACTNotificationMarker marker; FACTNotificationSoundBank soundBank; FACTNotificationWaveBank waveBank; FACTNotificationVariable variable; FACTNotificationGUI gui; FACTNotificationWave wave; }; }; #pragma pack(pop) /* Constants */ #define FACT_CONTENT_VERSION 46 static const uint32_t FACT_FLAG_MANAGEDATA = 0x00000001; static const uint32_t FACT_FLAG_STOP_RELEASE = 0x00000000; static const uint32_t FACT_FLAG_STOP_IMMEDIATE = 0x00000001; static const uint32_t FACT_FLAG_BACKGROUND_MUSIC = 0x00000002; static const uint32_t FACT_FLAG_UNITS_MS = 0x00000004; static const uint32_t FACT_FLAG_UNITS_SAMPLES = 0x00000008; static const uint32_t FACT_STATE_CREATED = 0x00000001; static const uint32_t FACT_STATE_PREPARING = 0x00000002; static const uint32_t FACT_STATE_PREPARED = 0x00000004; static const uint32_t FACT_STATE_PLAYING = 0x00000008; static const uint32_t FACT_STATE_STOPPING = 0x00000010; static const uint32_t FACT_STATE_STOPPED = 0x00000020; static const uint32_t FACT_STATE_PAUSED = 0x00000040; static const uint32_t FACT_STATE_INUSE = 0x00000080; static const uint32_t FACT_STATE_PREPAREFAILED = 0x80000000; static const int16_t FACTPITCH_MIN = -1200; static const int16_t FACTPITCH_MAX = 1200; static const int16_t FACTPITCH_MIN_TOTAL = -2400; static const int16_t FACTPITCH_MAX_TOTAL = 2400; static const float FACTVOLUME_MIN = 0.0f; static const float FACTVOLUME_MAX = 16777216.0f; static const uint16_t FACTINDEX_INVALID = 0xFFFF; static const uint16_t FACTVARIABLEINDEX_INVALID = 0xFFFF; static const uint16_t FACTCATEGORY_INVALID = 0xFFFF; static const uint8_t FACTNOTIFICATIONTYPE_CUEPREPARED = 1; static const uint8_t FACTNOTIFICATIONTYPE_CUEPLAY = 2; static const uint8_t FACTNOTIFICATIONTYPE_CUESTOP = 3; static const uint8_t FACTNOTIFICATIONTYPE_CUEDESTROYED = 4; static const uint8_t FACTNOTIFICATIONTYPE_MARKER = 5; static const uint8_t FACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED = 6; static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKDESTROYED = 7; static const uint8_t FACTNOTIFICATIONTYPE_LOCALVARIABLECHANGED = 8; static const uint8_t FACTNOTIFICATIONTYPE_GLOBALVARIABLECHANGED = 9; static const uint8_t FACTNOTIFICATIONTYPE_GUICONNECTED = 10; static const uint8_t FACTNOTIFICATIONTYPE_GUIDISCONNECTED = 11; static const uint8_t FACTNOTIFICATIONTYPE_WAVEPREPARED = 12; static const uint8_t FACTNOTIFICATIONTYPE_WAVEPLAY = 13; static const uint8_t FACTNOTIFICATIONTYPE_WAVESTOP = 14; static const uint8_t FACTNOTIFICATIONTYPE_WAVELOOPED = 15; static const uint8_t FACTNOTIFICATIONTYPE_WAVEDESTROYED = 16; static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKPREPARED = 17; static const uint8_t FACTNOTIFICATIONTYPE_WAVEBANKSTREAMING_INVALIDCONTENT = 18; static const uint8_t FACT_FLAG_NOTIFICATION_PERSIST = 0x01; #define FACT_ENGINE_LOOKAHEAD_DEFAULT 250 #define FACT_MAX_WMA_AVG_BYTES_PER_SEC_ENTRIES 7 static const uint32_t aWMAAvgBytesPerSec[] = { 12000, 24000, 4000, 6000, 8000, 20000, 2500 }; #define FACT_MAX_WMA_BLOCK_ALIGN_ENTRIES 17 static const uint32_t aWMABlockAlign[] = { 929, 1487, 1280, 2230, 8917, 8192, 4459, 5945, 2304, 1536, 1485, 1008, 2731, 4096, 6827, 5462, 1280 }; /* AudioEngine Interface */ FACTAPI uint32_t FACTCreateEngine( uint32_t dwCreationFlags, FACTAudioEngine **ppEngine ); /* See "extensions/CustomAllocatorEXT.txt" for more details. */ FACTAPI uint32_t FACTCreateEngineWithCustomAllocatorEXT( uint32_t dwCreationFlags, FACTAudioEngine **ppEngine, FAudioMallocFunc customMalloc, FAudioFreeFunc customFree, FAudioReallocFunc customRealloc ); FACTAPI uint32_t FACTAudioEngine_AddRef(FACTAudioEngine *pEngine); FACTAPI uint32_t FACTAudioEngine_Release(FACTAudioEngine *pEngine); /* FIXME: QueryInterface? Or just ignore COM garbage... -flibit */ FACTAPI uint32_t FACTAudioEngine_GetRendererCount( FACTAudioEngine *pEngine, uint16_t *pnRendererCount ); FACTAPI uint32_t FACTAudioEngine_GetRendererDetails( FACTAudioEngine *pEngine, uint16_t nRendererIndex, FACTRendererDetails *pRendererDetails ); FACTAPI uint32_t FACTAudioEngine_GetFinalMixFormat( FACTAudioEngine *pEngine, FAudioWaveFormatExtensible *pFinalMixFormat ); FACTAPI uint32_t FACTAudioEngine_Initialize( FACTAudioEngine *pEngine, const FACTRuntimeParameters *pParams ); FACTAPI uint32_t FACTAudioEngine_ShutDown(FACTAudioEngine *pEngine); FACTAPI uint32_t FACTAudioEngine_DoWork(FACTAudioEngine *pEngine); FACTAPI uint32_t FACTAudioEngine_CreateSoundBank( FACTAudioEngine *pEngine, const void *pvBuffer, uint32_t dwSize, uint32_t dwFlags, uint32_t dwAllocAttributes, FACTSoundBank **ppSoundBank ); FACTAPI uint32_t FACTAudioEngine_CreateInMemoryWaveBank( FACTAudioEngine *pEngine, const void *pvBuffer, uint32_t dwSize, uint32_t dwFlags, uint32_t dwAllocAttributes, FACTWaveBank **ppWaveBank ); FACTAPI uint32_t FACTAudioEngine_CreateStreamingWaveBank( FACTAudioEngine *pEngine, const FACTStreamingParameters *pParms, FACTWaveBank **ppWaveBank ); FACTAPI uint32_t FACTAudioEngine_PrepareWave( FACTAudioEngine *pEngine, uint32_t dwFlags, const char *szWavePath, uint32_t wStreamingPacketSize, uint32_t dwAlignment, uint32_t dwPlayOffset, uint8_t nLoopCount, FACTWave **ppWave ); FACTAPI uint32_t FACTAudioEngine_PrepareInMemoryWave( FACTAudioEngine *pEngine, uint32_t dwFlags, FACTWaveBankEntry entry, uint32_t *pdwSeekTable, /* Optional! */ uint8_t *pbWaveData, uint32_t dwPlayOffset, uint8_t nLoopCount, FACTWave **ppWave ); FACTAPI uint32_t FACTAudioEngine_PrepareStreamingWave( FACTAudioEngine *pEngine, uint32_t dwFlags, FACTWaveBankEntry entry, FACTStreamingParameters streamingParams, uint32_t dwAlignment, uint32_t *pdwSeekTable, /* Optional! */ uint8_t *pbWaveData, /* ABI bug, do not use! */ uint32_t dwPlayOffset, uint8_t nLoopCount, FACTWave **ppWave ); FACTAPI uint32_t FACTAudioEngine_RegisterNotification( FACTAudioEngine *pEngine, const FACTNotificationDescription *pNotificationDescription ); FACTAPI uint32_t FACTAudioEngine_UnRegisterNotification( FACTAudioEngine *pEngine, const FACTNotificationDescription *pNotificationDescription ); FACTAPI uint16_t FACTAudioEngine_GetCategory( FACTAudioEngine *pEngine, const char *szFriendlyName ); FACTAPI uint32_t FACTAudioEngine_Stop( FACTAudioEngine *pEngine, uint16_t nCategory, uint32_t dwFlags ); FACTAPI uint32_t FACTAudioEngine_SetVolume( FACTAudioEngine *pEngine, uint16_t nCategory, float volume ); FACTAPI uint32_t FACTAudioEngine_Pause( FACTAudioEngine *pEngine, uint16_t nCategory, int32_t fPause ); FACTAPI uint16_t FACTAudioEngine_GetGlobalVariableIndex( FACTAudioEngine *pEngine, const char *szFriendlyName ); FACTAPI uint32_t FACTAudioEngine_SetGlobalVariable( FACTAudioEngine *pEngine, uint16_t nIndex, float nValue ); FACTAPI uint32_t FACTAudioEngine_GetGlobalVariable( FACTAudioEngine *pEngine, uint16_t nIndex, float *pnValue ); /* SoundBank Interface */ FACTAPI uint16_t FACTSoundBank_GetCueIndex( FACTSoundBank *pSoundBank, const char *szFriendlyName ); FACTAPI uint32_t FACTSoundBank_GetNumCues( FACTSoundBank *pSoundBank, uint16_t *pnNumCues ); FACTAPI uint32_t FACTSoundBank_GetCueProperties( FACTSoundBank *pSoundBank, uint16_t nCueIndex, FACTCueProperties *pProperties ); FACTAPI uint32_t FACTSoundBank_Prepare( FACTSoundBank *pSoundBank, uint16_t nCueIndex, uint32_t dwFlags, int32_t timeOffset, FACTCue** ppCue ); FACTAPI uint32_t FACTSoundBank_Play( FACTSoundBank *pSoundBank, uint16_t nCueIndex, uint32_t dwFlags, int32_t timeOffset, FACTCue** ppCue /* Optional! */ ); #ifndef F3DAUDIO_DSP_SETTINGS_DECL #define F3DAUDIO_DSP_SETTINGS_DECL typedef struct F3DAUDIO_DSP_SETTINGS F3DAUDIO_DSP_SETTINGS; #endif /* F3DAUDIO_DSP_SETTINGS_DECL */ FACTAPI uint32_t FACTSoundBank_Play3D( FACTSoundBank *pSoundBank, uint16_t nCueIndex, uint32_t dwFlags, int32_t timeOffset, F3DAUDIO_DSP_SETTINGS *pDSPSettings, FACTCue** ppCue /* Optional! */ ); FACTAPI uint32_t FACTSoundBank_Stop( FACTSoundBank *pSoundBank, uint16_t nCueIndex, uint32_t dwFlags ); FACTAPI uint32_t FACTSoundBank_Destroy(FACTSoundBank *pSoundBank); FACTAPI uint32_t FACTSoundBank_GetState( FACTSoundBank *pSoundBank, uint32_t *pdwState ); /* WaveBank Interface */ FACTAPI uint32_t FACTWaveBank_Destroy(FACTWaveBank *pWaveBank); FACTAPI uint32_t FACTWaveBank_GetState( FACTWaveBank *pWaveBank, uint32_t *pdwState ); FACTAPI uint32_t FACTWaveBank_GetNumWaves( FACTWaveBank *pWaveBank, uint16_t *pnNumWaves ); FACTAPI uint16_t FACTWaveBank_GetWaveIndex( FACTWaveBank *pWaveBank, const char *szFriendlyName ); FACTAPI uint32_t FACTWaveBank_GetWaveProperties( FACTWaveBank *pWaveBank, uint16_t nWaveIndex, FACTWaveProperties *pWaveProperties ); FACTAPI uint32_t FACTWaveBank_Prepare( FACTWaveBank *pWaveBank, uint16_t nWaveIndex, uint32_t dwFlags, uint32_t dwPlayOffset, uint8_t nLoopCount, FACTWave **ppWave ); FACTAPI uint32_t FACTWaveBank_Play( FACTWaveBank *pWaveBank, uint16_t nWaveIndex, uint32_t dwFlags, uint32_t dwPlayOffset, uint8_t nLoopCount, FACTWave **ppWave ); FACTAPI uint32_t FACTWaveBank_Stop( FACTWaveBank *pWaveBank, uint16_t nWaveIndex, uint32_t dwFlags ); /* Wave Interface */ FACTAPI uint32_t FACTWave_Destroy(FACTWave *pWave); FACTAPI uint32_t FACTWave_Play(FACTWave *pWave); FACTAPI uint32_t FACTWave_Stop(FACTWave *pWave, uint32_t dwFlags); FACTAPI uint32_t FACTWave_Pause(FACTWave *pWave, int32_t fPause); FACTAPI uint32_t FACTWave_GetState(FACTWave *pWave, uint32_t *pdwState); FACTAPI uint32_t FACTWave_SetPitch(FACTWave *pWave, int16_t pitch); FACTAPI uint32_t FACTWave_SetVolume(FACTWave *pWave, float volume); FACTAPI uint32_t FACTWave_SetMatrixCoefficients( FACTWave *pWave, uint32_t uSrcChannelCount, uint32_t uDstChannelCount, float *pMatrixCoefficients ); FACTAPI uint32_t FACTWave_GetProperties( FACTWave *pWave, FACTWaveInstanceProperties *pProperties ); /* Cue Interface */ FACTAPI uint32_t FACTCue_Destroy(FACTCue *pCue); FACTAPI uint32_t FACTCue_Play(FACTCue *pCue); FACTAPI uint32_t FACTCue_Stop(FACTCue *pCue, uint32_t dwFlags); FACTAPI uint32_t FACTCue_GetState(FACTCue *pCue, uint32_t *pdwState); FACTAPI uint32_t FACTCue_SetMatrixCoefficients( FACTCue *pCue, uint32_t uSrcChannelCount, uint32_t uDstChannelCount, float *pMatrixCoefficients ); FACTAPI uint16_t FACTCue_GetVariableIndex( FACTCue *pCue, const char *szFriendlyName ); FACTAPI uint32_t FACTCue_SetVariable( FACTCue *pCue, uint16_t nIndex, float nValue ); FACTAPI uint32_t FACTCue_GetVariable( FACTCue *pCue, uint16_t nIndex, float *nValue ); FACTAPI uint32_t FACTCue_Pause(FACTCue *pCue, int32_t fPause); FACTAPI uint32_t FACTCue_GetProperties( FACTCue *pCue, FACTCueInstanceProperties **ppProperties ); FACTAPI uint32_t FACTCue_SetOutputVoices( FACTCue *pCue, const FAudioVoiceSends *pSendList /* Optional! */ ); FACTAPI uint32_t FACTCue_SetOutputVoiceMatrix( FACTCue *pCue, const FAudioVoice *pDestinationVoice, /* Optional! */ uint32_t SourceChannels, uint32_t DestinationChannels, const float *pLevelMatrix /* SourceChannels * DestinationChannels */ ); #ifdef __cplusplus } #endif /* __cplusplus */ #endif /* FACT_H */ /* vim: set noexpandtab shiftwidth=8 tabstop=8: */