From 02a76ffc8d250b3255c4fdaf9aa5f630986e1e9d Mon Sep 17 00:00:00 2001 From: RadWolfie Date: Wed, 25 Oct 2017 22:29:34 -0500 Subject: [PATCH] Improve DSound 3D Interfaces - Fixed HybridDirectSound3DBuffer_SetAllParameters - Add Info to 3D Interfaces --- src/CxbxKrnl/EmuDSound.cpp | 35 ++++++---------- src/CxbxKrnl/EmuDSound.h | 70 +++++++++++++++++++++++++++----- src/CxbxKrnl/EmuDSoundInline.hpp | 32 ++++++++++++++- 3 files changed, 102 insertions(+), 35 deletions(-) diff --git a/src/CxbxKrnl/EmuDSound.cpp b/src/CxbxKrnl/EmuDSound.cpp index 4adc1e1fb..522d0e5e0 100755 --- a/src/CxbxKrnl/EmuDSound.cpp +++ b/src/CxbxKrnl/EmuDSound.cpp @@ -539,7 +539,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSound_SetDopplerFactor) HRESULT WINAPI XTL::EMUPATCH(IDirectSound_SetI3DL2Listener) ( LPDIRECTSOUND8 pThis, - PVOID pDummy, // TODO: fill this out + X_DSI3DL2LISTENER *pds3dl, DWORD dwApply) { FUNC_EXPORTS; @@ -548,7 +548,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSound_SetI3DL2Listener) LOG_FUNC_BEGIN LOG_FUNC_ARG(pThis) - LOG_FUNC_ARG(pDummy) + LOG_FUNC_ARG(pds3dl) LOG_FUNC_ARG(dwApply) LOG_FUNC_END; @@ -731,6 +731,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSound_SetVelocity) // ****************************************************************** // * patch: IDirectSound_SetAllParameters // ****************************************************************** +// NOTE: No conversion requirement for XB to PC. HRESULT WINAPI XTL::EMUPATCH(IDirectSound_SetAllParameters) ( LPDIRECTSOUND8 pThis, @@ -1982,7 +1983,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetConeOutsideVolume) HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetAllParameters) ( X_CDirectSoundStream* pThis, - LPCDS3DBUFFER pc3DBufferParameters, + X_DS3DBUFFER* pc3DBufferParameters, DWORD dwApply) { FUNC_EXPORTS; @@ -2131,25 +2132,13 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetFrequency) // ****************************************************************** HRESULT WINAPI XTL::EMUPATCH(IDirectSoundStream_SetI3DL2Source) ( - PVOID pThis, - PVOID pds3db, - DWORD dwApply) + X_CDirectSoundStream* pThis, + X_DSI3DL2BUFFER* pds3db, + DWORD dwApply) { FUNC_EXPORTS; - enterCriticalSection; - - LOG_FUNC_BEGIN - LOG_FUNC_ARG(pThis) - LOG_FUNC_ARG(pds3db) - LOG_FUNC_ARG(dwApply) - LOG_FUNC_END; - - LOG_UNIMPLEMENTED_DSOUND(); - - leaveCriticalSection; - - return S_OK; + return XTL::EMUPATCH(CDirectSoundStream_SetI3DL2Source)(pThis, pds3db, dwApply); } // ****************************************************************** @@ -2433,7 +2422,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetDopplerFactor) HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetI3DL2Source) ( X_CDirectSoundBuffer* pThis, - LPCDSI3DL2BUFFER pds3db, + X_DSI3DL2BUFFER* pds3db, DWORD dwApply) { FUNC_EXPORTS; @@ -2446,6 +2435,7 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetI3DL2Source) LOG_FUNC_ARG(dwApply) LOG_FUNC_END; + // NOTE: SetI3DL2Source is using DSFXI3DL2Reverb structure, aka different interface. LOG_UNIMPLEMENTED_DSOUND(); leaveCriticalSection; @@ -3158,7 +3148,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetMixBinVolumes_8) HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetI3DL2Source) ( X_CDirectSoundStream* pThis, - PVOID pds3db, + X_DSI3DL2BUFFER* pds3db, DWORD dwApply) { FUNC_EXPORTS; @@ -3171,6 +3161,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetI3DL2Source) LOG_FUNC_ARG(dwApply) LOG_FUNC_END; + // NOTE: SetI3DL2Source is using DSFXI3DL2Reverb structure, aka different interface. LOG_UNIMPLEMENTED_DSOUND(); leaveCriticalSection; @@ -3184,7 +3175,7 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetI3DL2Source) HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_SetAllParameters) ( X_CDirectSoundBuffer* pThis, - LPCDS3DBUFFER pc3DBufferParameters, + X_DS3DBUFFER* pc3DBufferParameters, DWORD dwApply) { FUNC_EXPORTS; diff --git a/src/CxbxKrnl/EmuDSound.h b/src/CxbxKrnl/EmuDSound.h index 87a098b56..835db3c29 100755 --- a/src/CxbxKrnl/EmuDSound.h +++ b/src/CxbxKrnl/EmuDSound.h @@ -37,6 +37,7 @@ #undef FIELD_OFFSET // prevent macro redefinition warnings #include +#include #include "CxbxKrnl.h" #include "Emu.h" @@ -217,7 +218,56 @@ struct X_DSCAPS #define X_DSSPEAKER_ENABLE_AC3 0x00010000 #define X_DSSPEAKER_ENABLE_DTS 0x00020000 +struct X_DS3DBUFFER { + DWORD dwSize; + D3DXVECTOR3 vPosition; + D3DXVECTOR3 vVelocity; + DWORD dwInsideConeAngle; + DWORD dwOutsideConeAngle; + D3DXVECTOR3 vConeOrientation; + LONG lConeOutsideVolume; + FLOAT flMinDistance; + FLOAT flMaxDistance; + DWORD dwMode; + FLOAT flDistanceFactor; + FLOAT flRolloffFactor; + FLOAT flDopplerFactor; +}; +struct X_DSI3DL2LISTENER { + LONG lRoom; + LONG lRoomHF; + FLOAT flRoomRolloffFactor; + FLOAT flDecayTime; + FLOAT flDecayHFRatio; + LONG lReflections; + FLOAT flReflectionsDelay; + LONG lReverb; + FLOAT flReverbDelay; + FLOAT flDiffusion; + FLOAT flDensity; + FLOAT flHFReference; +}; + +struct X_DSI3DL2OBSTRUCTION { + LONG lHFLevel; + FLOAT flLFRatio; +}; + +struct X_DSI3DL2OCCLUSION { + LONG lHFLevel; + FLOAT flLFRatio; +}; + +struct X_DSI3DL2BUFFER { + LONG lDirect; + LONG lDirectHF; + LONG lRoom; + LONG lRoomHF; + FLOAT flRoomRolloffFactor; + X_DSI3DL2OBSTRUCTION Obstruction; + X_DSI3DL2OCCLUSION Occlusion; +}; typedef struct IDirectSoundStream IDirectSoundStream; typedef IDirectSoundStream *LPDIRECTSOUNDSTREAM; @@ -566,7 +616,7 @@ HRESULT WINAPI EMUPATCH(IDirectSound_SetDopplerFactor) HRESULT WINAPI EMUPATCH(IDirectSound_SetI3DL2Listener) ( LPDIRECTSOUND8 pThis, - PVOID pDummy, // TODO: fill this out + X_DSI3DL2LISTENER *pds3dl, DWORD dwApply ); @@ -966,7 +1016,7 @@ HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetHeadroom) HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetAllParameters) ( X_CDirectSoundStream* pThis, - LPCDS3DBUFFER pc3DBufferParameters, + X_DS3DBUFFER* pc3DBufferParameters, DWORD dwApply ); @@ -1061,9 +1111,9 @@ HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetFrequency) // ****************************************************************** HRESULT WINAPI EMUPATCH(IDirectSoundStream_SetI3DL2Source) ( - PVOID pThis, - PVOID pds3db, - DWORD dwApply + X_CDirectSoundStream* pThis, + X_DSI3DL2BUFFER* pds3db, + DWORD dwApply ); // ****************************************************************** @@ -1192,15 +1242,13 @@ HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_SetDopplerFactor) DWORD dwApply ); -typedef void* LPCDSI3DL2BUFFER; - // ****************************************************************** // * patch: IDirectSoundBuffer_SetI3DL2Source // ****************************************************************** HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_SetI3DL2Source) ( X_CDirectSoundBuffer* pThis, - LPCDSI3DL2BUFFER pds3db, + X_DSI3DL2BUFFER* pds3db, DWORD dwApply ); // +s @@ -1445,8 +1493,8 @@ HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetMixBinVolumes_8) HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetI3DL2Source) ( X_CDirectSoundStream* pThis, - PVOID pds3db, - DWORD dwApply + X_DSI3DL2BUFFER* pds3db, + DWORD dwApply ); // ****************************************************************** @@ -1455,7 +1503,7 @@ HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetI3DL2Source) HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_SetAllParameters) ( X_CDirectSoundBuffer* pThis, - LPCDS3DBUFFER pc3DBufferParameters, + X_DS3DBUFFER* pc3DBufferParameters, DWORD dwApply ); diff --git a/src/CxbxKrnl/EmuDSoundInline.hpp b/src/CxbxKrnl/EmuDSoundInline.hpp index e809f8ab8..0ba70a6d7 100644 --- a/src/CxbxKrnl/EmuDSoundInline.hpp +++ b/src/CxbxKrnl/EmuDSoundInline.hpp @@ -759,14 +759,42 @@ inline HRESULT HybridDirectSoundBuffer_Restore( //IDirectSoundBuffer inline HRESULT HybridDirectSound3DBuffer_SetAllParameters( LPDIRECTSOUND3DBUFFER8 pDS3DBuffer, - LPCDS3DBUFFER pDS3DBufferParams, + XTL::X_DS3DBUFFER* pDS3DBufferParams, DWORD dwApply) { enterCriticalSection; HRESULT hRet = DS_OK; if (pDS3DBuffer != nullptr) { - hRet = pDS3DBuffer->SetAllParameters(pDS3DBufferParams, dwApply); + + DS3DBUFFER pDS3DBufferParamsTemp; + pDS3DBufferParamsTemp.dwSize = sizeof(DS3DBUFFER); + pDS3DBufferParamsTemp.vPosition = pDS3DBufferParams->vPosition; + pDS3DBufferParamsTemp.vVelocity = pDS3DBufferParams->vVelocity; + pDS3DBufferParamsTemp.dwInsideConeAngle = pDS3DBufferParams->dwInsideConeAngle; + pDS3DBufferParamsTemp.dwOutsideConeAngle = pDS3DBufferParams->dwOutsideConeAngle; + pDS3DBufferParamsTemp.vConeOrientation = pDS3DBufferParams->vConeOrientation; + pDS3DBufferParamsTemp.lConeOutsideVolume = pDS3DBufferParams->lConeOutsideVolume; + pDS3DBufferParamsTemp.flMinDistance = pDS3DBufferParams->flMinDistance; + pDS3DBufferParamsTemp.flMaxDistance = pDS3DBufferParams->flMaxDistance; + pDS3DBufferParamsTemp.dwMode = pDS3DBufferParams->dwMode; + + hRet = pDS3DBuffer->SetAllParameters(&pDS3DBufferParamsTemp, dwApply); + if (hRet != DS_OK) { + RETURN_RESULT_CHECK(hRet); + } + + hRet = g_pDSoundPrimary3DListener8->SetDistanceFactor(pDS3DBufferParams->flDistanceFactor, dwApply); + if (hRet != DS_OK) { + RETURN_RESULT_CHECK(hRet); + } + + hRet = g_pDSoundPrimary3DListener8->SetRolloffFactor(pDS3DBufferParams->flRolloffFactor, dwApply); + if (hRet != DS_OK) { + RETURN_RESULT_CHECK(hRet); + } + + hRet = g_pDSoundPrimary3DListener8->SetDopplerFactor(pDS3DBufferParams->flDopplerFactor, dwApply); } leaveCriticalSection;