Module: wine Branch: master Commit: e8321d7de9dafd7303977ffd69b6d6be69b2ee6d URL: https://source.winehq.org/git/wine.git/?a=commit;h=e8321d7de9dafd7303977ffd6...
Author: Vijay Kiran Kamuju infyquest@gmail.com Date: Sat Jul 18 22:21:39 2020 +0200
xactengine3_7: Implement IXACT3Cue Interface.
Based on patch from Ethan Lee.
Signed-off-by: Vijay Kiran Kamuju infyquest@gmail.com Signed-off-by: Alistair Leslie-Hughes leslie_alistair@hotmail.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/xactengine3_7/xact_dll.c | 183 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 181 insertions(+), 2 deletions(-)
diff --git a/dlls/xactengine3_7/xact_dll.c b/dlls/xactengine3_7/xact_dll.c index 828739533c..7e1add41fe 100644 --- a/dlls/xactengine3_7/xact_dll.c +++ b/dlls/xactengine3_7/xact_dll.c @@ -34,6 +34,158 @@ WINE_DEFAULT_DEBUG_CHANNEL(xact3);
static HINSTANCE instance;
+typedef struct _XACT3CueImpl { + IXACT3Cue IXACT3Cue_iface; + FACTCue *fact_cue; +} XACT3CueImpl; + +static inline XACT3CueImpl *impl_from_IXACT3Cue(IXACT3Cue *iface) +{ + return CONTAINING_RECORD(iface, XACT3CueImpl, IXACT3Cue_iface); +} + +static HRESULT WINAPI IXACT3CueImpl_Play(IXACT3Cue *iface) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)\n", iface); + + return FACTCue_Play(This->fact_cue); +} + +static HRESULT WINAPI IXACT3CueImpl_Stop(IXACT3Cue *iface, DWORD dwFlags) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%u)\n", iface, dwFlags); + + return FACTCue_Stop(This->fact_cue, dwFlags); +} + +static HRESULT WINAPI IXACT3CueImpl_GetState(IXACT3Cue *iface, DWORD *pdwState) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%p)\n", iface, pdwState); + + return FACTCue_GetState(This->fact_cue, pdwState); +} + +static HRESULT WINAPI IXACT3CueImpl_Destroy(IXACT3Cue *iface) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + HRESULT hr; + + TRACE("(%p)\n", iface); + + hr = FACTCue_Destroy(This->fact_cue); + HeapFree(GetProcessHeap(), 0, This); + return hr; +} + +static HRESULT WINAPI IXACT3CueImpl_SetMatrixCoefficients(IXACT3Cue *iface, + UINT32 uSrcChannelCount, UINT32 uDstChannelCount, + float *pMatrixCoefficients) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%u, %u, %p)\n", iface, uSrcChannelCount, uDstChannelCount, + pMatrixCoefficients); + + return FACTCue_SetMatrixCoefficients(This->fact_cue, uSrcChannelCount, + uDstChannelCount, pMatrixCoefficients); +} + +static XACTVARIABLEINDEX WINAPI IXACT3CueImpl_GetVariableIndex(IXACT3Cue *iface, + PCSTR szFriendlyName) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%s)\n", iface, szFriendlyName); + + return FACTCue_GetVariableIndex(This->fact_cue, szFriendlyName); +} + +static HRESULT WINAPI IXACT3CueImpl_SetVariable(IXACT3Cue *iface, + XACTVARIABLEINDEX nIndex, XACTVARIABLEVALUE nValue) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%u, %f)\n", iface, nIndex, nValue); + + return FACTCue_SetVariable(This->fact_cue, nIndex, nValue); +} + +static HRESULT WINAPI IXACT3CueImpl_GetVariable(IXACT3Cue *iface, + XACTVARIABLEINDEX nIndex, XACTVARIABLEVALUE *nValue) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%u, %p)\n", iface, nIndex, nValue); + + return FACTCue_GetVariable(This->fact_cue, nIndex, nValue); +} + +static HRESULT WINAPI IXACT3CueImpl_Pause(IXACT3Cue *iface, BOOL fPause) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + + TRACE("(%p)->(%u)\n", iface, fPause); + + return FACTCue_Pause(This->fact_cue, fPause); +} + +static HRESULT WINAPI IXACT3CueImpl_GetProperties(IXACT3Cue *iface, + XACT_CUE_INSTANCE_PROPERTIES **ppProperties) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + FACTCueInstanceProperties *fProps; + HRESULT hr; + + TRACE("(%p)->(%p)\n", iface, ppProperties); + + hr = FACTCue_GetProperties(This->fact_cue, &fProps); + if(FAILED(hr)) + return hr; + + *ppProperties = (XACT_CUE_INSTANCE_PROPERTIES*) fProps; + return hr; +} + +static HRESULT WINAPI IXACT3CueImpl_SetOutputVoices(IXACT3Cue *iface, + const XAUDIO2_VOICE_SENDS *pSendList) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + FIXME("(%p)->(%p): stub!\n", This, pSendList); + return S_OK; +} + +static HRESULT WINAPI IXACT3CueImpl_SetOutputVoiceMatrix(IXACT3Cue *iface, + IXAudio2Voice *pDestinationVoice, UINT32 SourceChannels, + UINT32 DestinationChannels, const float *pLevelMatrix) +{ + XACT3CueImpl *This = impl_from_IXACT3Cue(iface); + FIXME("(%p)->(%p %u %u %p): stub!\n", This, pDestinationVoice, SourceChannels, + DestinationChannels, pLevelMatrix); + return S_OK; +} + +static const IXACT3CueVtbl XACT3Cue_Vtbl = +{ + IXACT3CueImpl_Play, + IXACT3CueImpl_Stop, + IXACT3CueImpl_GetState, + IXACT3CueImpl_Destroy, + IXACT3CueImpl_SetMatrixCoefficients, + IXACT3CueImpl_GetVariableIndex, + IXACT3CueImpl_SetVariable, + IXACT3CueImpl_GetVariable, + IXACT3CueImpl_Pause, + IXACT3CueImpl_GetProperties, + IXACT3CueImpl_SetOutputVoices, + IXACT3CueImpl_SetOutputVoiceMatrix +}; + typedef struct _XACT3SoundBankImpl { IXACT3SoundBank IXACT3SoundBank_iface;
@@ -81,9 +233,36 @@ static HRESULT WINAPI IXACT3SoundBankImpl_Prepare(IXACT3SoundBank *iface, IXACT3Cue** ppCue) { XACT3SoundBankImpl *This = impl_from_IXACT3SoundBank(iface); - FIXME("(%p)->(%u, 0x%x, %u, %p): stub!\n", This, nCueIndex, dwFlags, timeOffset, + XACT3CueImpl *cue; + FACTCue *fcue; + UINT ret; + + TRACE("(%p)->(%u, 0x%x, %u, %p)\n", This, nCueIndex, dwFlags, timeOffset, ppCue); - return E_NOTIMPL; + + ret = FACTSoundBank_Prepare(This->fact_soundbank, nCueIndex, dwFlags, + timeOffset, &fcue); + if(ret != 0) + { + ERR("Failed to CreateCue: %d\n", ret); + return E_FAIL; + } + + cue = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*cue)); + if (!cue) + { + FACTCue_Destroy(fcue); + ERR("Failed to allocate XACT3CueImpl!"); + return E_OUTOFMEMORY; + } + + cue->IXACT3Cue_iface.lpVtbl = &XACT3Cue_Vtbl; + cue->fact_cue = fcue; + *ppCue = (IXACT3Cue*)&cue->IXACT3Cue_iface; + + TRACE("Created Cue: %p\n", cue); + + return S_OK; }
static HRESULT WINAPI IXACT3SoundBankImpl_Play(IXACT3SoundBank *iface,