Commit Description:
Various UI improvements.
Commit Description:
Various UI improvements.
File last commit:
Show/Diff file:
Action:
FNA/lib/FAudio/cpp/xact3.cpp
668 lines | 14.7 KiB | text/x-c | CppLexer
#include "xact3.h"
#include <assert.h>
extern "C" int32_t FACTCALL ReadFile(
void* hFile,
void* lpBuffer,
uint32_t nNumberOfBytesToRead,
uint32_t *lpNumberOfBytesRead,
FACTOverlapped *lpOverlapped
);
extern "C" int32_t FACTCALL GetOverlappedResult(
void* hFile,
FACTOverlapped *lpOverlapped,
uint32_t *lpNumberOfBytesTransferred,
int32_t bWait
);
/* IXACT3Cue Implementation */
class XACT3CueImpl : public IXACT3Cue
{
public:
XACT3CueImpl(FACTCue *newCue)
{
cue = newCue;
}
COM_METHOD(HRESULT) Play()
{
return FACTCue_Play(cue);
}
COM_METHOD(HRESULT) Stop(uint32_t dwFlags)
{
return FACTCue_Stop(cue, dwFlags);
};
COM_METHOD(HRESULT) GetState(uint32_t *pdwState)
{
return FACTCue_GetState(cue, pdwState);
}
COM_METHOD(HRESULT) Destroy()
{
return FACTCue_Destroy(cue);
}
COM_METHOD(HRESULT) SetMatrixCoefficients(
uint32_t uSrcChannelCount,
uint32_t uDstChannelCount,
float *pMatrixCoefficients
) {
return FACTCue_SetMatrixCoefficients(
cue,
uSrcChannelCount,
uDstChannelCount,
pMatrixCoefficients
);
}
COM_METHOD(uint16_t) GetVariableIndex(const char *szFriendlyName)
{
return FACTCue_GetVariableIndex(cue, szFriendlyName);
}
COM_METHOD(HRESULT) SetVariable(uint16_t nIndex, float nValue)
{
return FACTCue_SetVariable(cue, nIndex, nValue);
}
COM_METHOD(HRESULT) GetVariable(uint16_t nIndex, float *nValue)
{
return FACTCue_GetVariable(cue, nIndex, nValue);
}
COM_METHOD(HRESULT) Pause(int32_t fPause)
{
return FACTCue_Pause(cue, fPause);
}
COM_METHOD(HRESULT) GetProperties(
XACT_CUE_INSTANCE_PROPERTIES **ppProperties
) {
return FACTCue_GetProperties(cue, ppProperties);
}
#if XACT3_VERSION >= 5
COM_METHOD(HRESULT) SetOutputVoices(
const XAUDIO2_VOICE_SENDS *pSendList /* Optional! */
) {
/* TODO: SetOutputVoices */
return 0;
}
COM_METHOD(HRESULT) SetOutputVoiceMatrix(
const IXAudio2Voice *pDestinationVoice, /* Optional! */
uint32_t SourceChannels,
uint32_t DestinationChannels,
const float *pLevelMatrix /* SourceChannels * DestinationChannels */
) {
/* TODO: SetOutputVoiceMatrix */
return 0;
}
#endif /* #if XACT3_VERSION >= 5 */
FACTCue *cue;
};
/* IXACT3Wave Implementation */
class XACT3WaveImpl : public IXACT3Wave
{
public:
XACT3WaveImpl(FACTWave *newWave)
{
wave = newWave;
}
COM_METHOD(HRESULT) Destroy()
{
return FACTWave_Destroy(wave);
}
COM_METHOD(HRESULT) Play()
{
return FACTWave_Play(wave);
}
COM_METHOD(HRESULT) Stop(uint32_t dwFlags)
{
return FACTWave_Stop(wave, dwFlags);
}
COM_METHOD(HRESULT) Pause(int32_t fPause)
{
return FACTWave_Pause(wave, fPause);
}
COM_METHOD(HRESULT) GetState(uint32_t *pdwState)
{
return FACTWave_GetState(wave, pdwState);
}
COM_METHOD(HRESULT) SetPitch(int16_t pitch)
{
return FACTWave_SetPitch(wave, pitch);
}
COM_METHOD(HRESULT) SetVolume(float volume)
{
return FACTWave_SetVolume(wave, volume);
}
COM_METHOD(HRESULT) SetMatrixCoefficients(
uint32_t uSrcChannelCount,
uint32_t uDstChannelCount,
float *pMatrixCoefficients
) {
return FACTWave_SetMatrixCoefficients(
wave,
uSrcChannelCount,
uDstChannelCount,
pMatrixCoefficients
);
}
COM_METHOD(HRESULT) GetProperties(
XACT_WAVE_INSTANCE_PROPERTIES *pProperties
) {
return FACTWave_GetProperties(wave, pProperties);
}
FACTWave *wave;
};
/* IXACT3SoundBank Implementation */
class XACT3SoundBankImpl : public IXACT3SoundBank
{
public:
XACT3SoundBankImpl(FACTSoundBank *newSoundBank)
{
soundBank = newSoundBank;
}
COM_METHOD(uint16_t) GetCueIndex(const char *szFriendlyName)
{
return FACTSoundBank_GetCueIndex(soundBank, szFriendlyName);
}
COM_METHOD(HRESULT) GetNumCues(uint16_t *pnNumCues)
{
return FACTSoundBank_GetNumCues(soundBank, pnNumCues);
}
COM_METHOD(HRESULT) GetCueProperties(
uint16_t nCueIndex,
XACT_CUE_PROPERTIES *pProperties
) {
return FACTSoundBank_GetCueProperties(
soundBank,
nCueIndex,
pProperties
);
}
COM_METHOD(HRESULT) Prepare(
uint16_t nCueIndex,
uint32_t dwFlags,
int32_t timeOffset,
IXACT3Cue** ppCue
) {
FACTCue *cue;
HRESULT retval = FACTSoundBank_Prepare(
soundBank,
nCueIndex,
dwFlags,
timeOffset,
&cue
);
*ppCue = new XACT3CueImpl(cue);
return retval;
}
COM_METHOD(HRESULT) Play(
uint16_t nCueIndex,
uint32_t dwFlags,
int32_t timeOffset,
IXACT3Cue** ppCue /* Optional! */
) {
if (ppCue == NULL)
{
return FACTSoundBank_Play(
soundBank,
nCueIndex,
dwFlags,
timeOffset,
NULL
);
}
FACTCue *cue;
HRESULT retval = FACTSoundBank_Play(
soundBank,
nCueIndex,
dwFlags,
timeOffset,
&cue
);
*ppCue = new XACT3CueImpl(cue);
return retval;
}
COM_METHOD(HRESULT) Stop(uint16_t nCueIndex, uint32_t dwFlags)
{
return FACTSoundBank_Stop(soundBank, nCueIndex, dwFlags);
}
COM_METHOD(HRESULT) Destroy()
{
return FACTSoundBank_Destroy(soundBank);
}
COM_METHOD(HRESULT) GetState(uint32_t *pdwState)
{
return FACTSoundBank_GetState(soundBank, pdwState);
}
FACTSoundBank *soundBank;
};
/* IXACT3WaveBank Implementation */
class XACT3WaveBankImpl : public IXACT3WaveBank
{
public:
XACT3WaveBankImpl(FACTWaveBank *newWaveBank)
{
waveBank = newWaveBank;
}
COM_METHOD(HRESULT) Destroy()
{
return FACTWaveBank_Destroy(waveBank);
}
COM_METHOD(HRESULT) GetNumWaves(uint16_t *pnNumWaves)
{
return FACTWaveBank_GetNumWaves(waveBank, pnNumWaves);
}
COM_METHOD(uint16_t) GetWaveIndex(const char *szFriendlyName)
{
return FACTWaveBank_GetWaveIndex(waveBank, szFriendlyName);
}
COM_METHOD(HRESULT) GetWaveProperties(
uint16_t nWaveIndex,
XACT_WAVE_PROPERTIES *pWaveProperties
) {
return FACTWaveBank_GetWaveProperties(
waveBank,
nWaveIndex,
pWaveProperties
);
}
COM_METHOD(HRESULT) Prepare(
uint16_t nWaveIndex,
uint32_t dwFlags,
uint32_t dwPlayOffset,
uint8_t nLoopCount,
IXACT3Wave **ppWave
) {
FACTWave *wave;
HRESULT retval = FACTWaveBank_Prepare(
waveBank,
nWaveIndex,
dwFlags,
dwPlayOffset,
nLoopCount,
&wave
);
*ppWave = new XACT3WaveImpl(wave);
return retval;
}
COM_METHOD(HRESULT) Play(
uint16_t nWaveIndex,
uint32_t dwFlags,
uint32_t dwPlayOffset,
uint8_t nLoopCount,
IXACT3Wave **ppWave
) {
if (ppWave == NULL)
{
return FACTWaveBank_Play(
waveBank,
nWaveIndex,
dwFlags,
dwPlayOffset,
nLoopCount,
NULL
);
}
FACTWave *wave;
HRESULT retval = FACTWaveBank_Play(
waveBank,
nWaveIndex,
dwFlags,
dwPlayOffset,
nLoopCount,
&wave
);
*ppWave = new XACT3WaveImpl(wave);
return retval;
}
COM_METHOD(HRESULT) Stop(
uint16_t nWaveIndex,
uint32_t dwFlags
) {
return FACTWaveBank_Stop(waveBank, nWaveIndex, dwFlags);
}
COM_METHOD(HRESULT) GetState(uint32_t *pdwState)
{
return FACTWaveBank_GetState(waveBank, pdwState);
}
FACTWaveBank *waveBank;
};
/* IXACT3Engine Implementation */
void* CDECL XACT3_INTERNAL_Malloc(size_t size)
{
return CoTaskMemAlloc(size);
}
void CDECL XACT3_INTERNAL_Free(void* ptr)
{
CoTaskMemFree(ptr);
}
void* CDECL XACT3_INTERNAL_Realloc(void* ptr, size_t size)
{
return CoTaskMemRealloc(ptr, size);
}
class XACT3EngineImpl : public IXACT3Engine
{
public:
XACT3EngineImpl()
{
FACTCreateEngineWithCustomAllocatorEXT(
0,
&engine,
XACT3_INTERNAL_Malloc,
XACT3_INTERNAL_Free,
XACT3_INTERNAL_Realloc
);
}
COM_METHOD(HRESULT) QueryInterface(REFIID riid, void **ppvInterface)
{
if (guid_equals(riid, IID_IXACT3Engine))
{
*ppvInterface = static_cast<IXACT3Engine *>(this);
}
else if (guid_equals(riid, IID_IUnknown))
{
*ppvInterface = static_cast<IUnknown *>(this);
}
else
{
*ppvInterface = NULL;
return E_NOINTERFACE;
}
reinterpret_cast<IUnknown *>(*ppvInterface)->AddRef();
return S_OK;
}
COM_METHOD(ULONG) AddRef()
{
return FACTAudioEngine_AddRef(engine);
}
COM_METHOD(ULONG) Release()
{
ULONG refcount = FACTAudioEngine_Release(engine);
if (refcount == 0)
{
delete this;
}
return 1;
}
COM_METHOD(HRESULT) GetRendererCount(
uint16_t *pnRendererCount
) {
return FACTAudioEngine_GetRendererCount(
engine,
pnRendererCount
);
}
COM_METHOD(HRESULT) GetRendererDetails(
uint16_t nRendererIndex,
XACT_RENDERER_DETAILS *pRendererDetails
) {
return FACTAudioEngine_GetRendererDetails(
engine,
nRendererIndex,
pRendererDetails
);
}
COM_METHOD(HRESULT) GetFinalMixFormat(
WAVEFORMATEXTENSIBLE *pFinalMixFormat
) {
return FACTAudioEngine_GetFinalMixFormat(
engine,
pFinalMixFormat
);
}
COM_METHOD(HRESULT) Initialize(
const XACT_RUNTIME_PARAMETERS *pParams
) {
XACT_RUNTIME_PARAMETERS params;
/* TODO: Unwrap FAudio/FAudioMasteringVoice */
assert(pParams->pXAudio2 == NULL);
assert(pParams->pMasteringVoice == NULL);
/* Copy so we can modify the parameters a bit... */
params = *pParams;
params.pXAudio2 = NULL;
params.pMasteringVoice = NULL;
/* Force Win32 I/O, do NOT use the default! */
if (pParams->fileIOCallbacks.readFileCallback == NULL)
{
params.fileIOCallbacks.readFileCallback = ReadFile;
}
if (pParams->fileIOCallbacks.getOverlappedResultCallback == NULL)
{
params.fileIOCallbacks.getOverlappedResultCallback = GetOverlappedResult;
}
return FACTAudioEngine_Initialize(engine, &params);
}
COM_METHOD(HRESULT) ShutDown()
{
return FACTAudioEngine_ShutDown(engine);
}
COM_METHOD(HRESULT) DoWork()
{
return FACTAudioEngine_DoWork(engine);
}
COM_METHOD(HRESULT) CreateSoundBank(
const void *pvBuffer,
uint32_t dwSize,
uint32_t dwFlags,
uint32_t dwAllocAttributes,
IXACT3SoundBank **ppSoundBank
) {
FACTSoundBank *soundBank;
HRESULT retval = FACTAudioEngine_CreateSoundBank(
engine,
pvBuffer,
dwSize,
dwFlags,
dwAllocAttributes,
&soundBank
);
*ppSoundBank = new XACT3SoundBankImpl(soundBank);
return retval;
}
COM_METHOD(HRESULT) CreateInMemoryWaveBank(
const void *pvBuffer,
uint32_t dwSize,
uint32_t dwFlags,
uint32_t dwAllocAttributes,
IXACT3WaveBank **ppWaveBank
) {
FACTWaveBank *waveBank;
HRESULT retval = FACTAudioEngine_CreateInMemoryWaveBank(
engine,
pvBuffer,
dwSize,
dwFlags,
dwAllocAttributes,
&waveBank
);
*ppWaveBank = new XACT3WaveBankImpl(waveBank);
return retval;
}
COM_METHOD(HRESULT) CreateStreamingWaveBank(
const XACT_STREAMING_PARAMETERS *pParms,
IXACT3WaveBank **ppWaveBank
) {
FACTWaveBank *waveBank;
HRESULT retval = FACTAudioEngine_CreateStreamingWaveBank(
engine,
pParms,
&waveBank
);
*ppWaveBank = new XACT3WaveBankImpl(waveBank);
return retval;
}
COM_METHOD(HRESULT) PrepareWave(
uint32_t dwFlags,
const char *szWavePath,
uint32_t wStreamingPacketSize,
uint32_t dwAlignment,
uint32_t dwPlayOffset,
uint8_t nLoopCount,
IXACT3Wave **ppWave
) {
/* TODO: See FACT.c */
return 0;
}
COM_METHOD(HRESULT) PrepareInMemoryWave(
uint32_t dwFlags,
WAVEBANKENTRY entry,
uint32_t *pdwSeekTable, /* Optional! */
uint8_t *pbWaveData,
uint32_t dwPlayOffset,
uint8_t nLoopCount,
IXACT3Wave **ppWave
) {
/* TODO: See FACT.c */
return 0;
}
COM_METHOD(HRESULT) PrepareStreamingWave(
uint32_t dwFlags,
WAVEBANKENTRY entry,
XACT_STREAMING_PARAMETERS streamingParams,
uint32_t dwAlignment,
uint32_t *pdwSeekTable, /* Optional! */
uint8_t *pbWaveData,
uint32_t dwPlayOffset,
uint8_t nLoopCount,
IXACT3Wave **ppWave
) {
/* TODO: See FACT.c */
return 0;
}
COM_METHOD(HRESULT) RegisterNotification(
const XACT_NOTIFICATION_DESCRIPTION *pNotificationDescription
) {
/* We have to unwrap the FACT object first! */
FACTNotificationDescription desc;
desc.type = pNotificationDescription->type;
desc.flags = pNotificationDescription->flags;
desc.cueIndex = pNotificationDescription->cueIndex;
desc.waveIndex = pNotificationDescription->waveIndex;
desc.pvContext = pNotificationDescription->pvContext;
if (desc.type == FACTNOTIFICATIONTYPE_CUEDESTROYED)
{
desc.pCue = ((XACT3CueImpl*) pNotificationDescription->pCue)->cue;
}
else if (desc.type == FACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED)
{
if (pNotificationDescription->pSoundBank != NULL)
{
desc.pSoundBank = ((XACT3SoundBankImpl*) pNotificationDescription->pSoundBank)->soundBank;
}
else
{
desc.pSoundBank = NULL;
}
}
else if (desc.type == FACTNOTIFICATIONTYPE_WAVEBANKDESTROYED)
{
desc.pWaveBank = ((XACT3WaveBankImpl*) pNotificationDescription->pWaveBank)->waveBank;
}
else if (desc.type == FACTNOTIFICATIONTYPE_WAVEDESTROYED)
{
desc.pWave = ((XACT3WaveImpl*) pNotificationDescription->pWave)->wave;
}
// If you didn't hit an above if, get ready for an assert!
return FACTAudioEngine_RegisterNotification(engine, &desc);
}
COM_METHOD(HRESULT) UnRegisterNotification(
const XACT_NOTIFICATION_DESCRIPTION *pNotificationDescription
) {
/* We have to unwrap the FACT object first! */
FACTNotificationDescription desc;
desc.type = pNotificationDescription->type;
desc.flags = pNotificationDescription->flags;
desc.cueIndex = pNotificationDescription->cueIndex;
desc.waveIndex = pNotificationDescription->waveIndex;
desc.pvContext = pNotificationDescription->pvContext;
if (desc.type == FACTNOTIFICATIONTYPE_CUEDESTROYED)
{
desc.pCue = ((XACT3CueImpl*) pNotificationDescription->pCue)->cue;
}
else if (desc.type == FACTNOTIFICATIONTYPE_SOUNDBANKDESTROYED)
{
desc.pSoundBank = ((XACT3SoundBankImpl*) pNotificationDescription->pSoundBank)->soundBank;
}
else if (desc.type == FACTNOTIFICATIONTYPE_WAVEBANKDESTROYED)
{
desc.pWaveBank = ((XACT3WaveBankImpl*) pNotificationDescription->pWaveBank)->waveBank;
}
else if (desc.type == FACTNOTIFICATIONTYPE_WAVEDESTROYED)
{
desc.pWave = ((XACT3WaveImpl*) pNotificationDescription->pWave)->wave;
}
// If you didn't hit an above if, get ready for an assert!
return FACTAudioEngine_UnRegisterNotification(engine, &desc);
}
COM_METHOD(uint16_t) GetCategory(const char *szFriendlyName)
{
return FACTAudioEngine_GetCategory(engine, szFriendlyName);
}
COM_METHOD(HRESULT) Stop(uint16_t nCategory, uint32_t dwFlags)
{
return FACTAudioEngine_Stop(engine, nCategory, dwFlags);
}
COM_METHOD(HRESULT) SetVolume(uint16_t nCategory, float volume)
{
return FACTAudioEngine_SetVolume(engine, nCategory, volume);
}
COM_METHOD(HRESULT) Pause(uint16_t nCategory, int32_t fPause)
{
return FACTAudioEngine_Pause(engine, nCategory, fPause);
}
COM_METHOD(uint16_t) GetGlobalVariableIndex(
const char *szFriendlyName
) {
return FACTAudioEngine_GetGlobalVariableIndex(
engine,
szFriendlyName
);
}
COM_METHOD(HRESULT) SetGlobalVariable(
uint16_t nIndex,
float nValue
) {
return FACTAudioEngine_SetGlobalVariable(
engine,
nIndex,
nValue
);
}
COM_METHOD(HRESULT) GetGlobalVariable(
uint16_t nIndex,
float *pnValue
) {
return FACTAudioEngine_GetGlobalVariable(
engine,
nIndex,
pnValue
);
}
private:
FACTAudioEngine *engine;
};
/* Create Function */
void *CreateXACT3EngineInternal()
{
return new XACT3EngineImpl();
}