Improve DSound 3D Interfaces

- Fixed HybridDirectSound3DBuffer_SetAllParameters
- Add Info to 3D Interfaces
This commit is contained in:
RadWolfie 2017-10-25 22:29:34 -05:00
parent 186530ee25
commit 02a76ffc8d
3 changed files with 102 additions and 35 deletions

View File

@ -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;

View File

@ -37,6 +37,7 @@
#undef FIELD_OFFSET // prevent macro redefinition warnings
#include <dsound.h>
#include <d3dx8math.h>
#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
);

View File

@ -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;