Stub some 3D sound functions.

Fixes a crash in Conker & Kingdom Under Fire (+ probably lots more)
This commit is contained in:
Luke Usher 2019-06-26 13:55:04 +01:00 committed by PatrickvL
parent d75d08fa57
commit 952e7870cd
4 changed files with 221 additions and 16 deletions

View File

@ -4104,16 +4104,39 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetDopplerFactor)
HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_GetVoiceProperties)
(
X_CDirectSoundBuffer* pThis,
OUT void* pVoiceProps)
OUT X_DSVOICEPROPS* pVoiceProps)
{
enterCriticalSection;
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
LOG_FUNC_ARG_OUT(pVoiceProps)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
LOG_FUNC_END;
if (pVoiceProps == xbnullptr) {
LOG_TEST_CASE("pVoiceProps == xbnullptr");
RETURN(DS_OK);
}
// HACK: Set values that are known to prevent crashes/hangs
// TODO: Investigate and implement proper mixbin functionality
pVoiceProps->dwMixBinCount = 2;
pVoiceProps->l3DConeVolume = 0;
pVoiceProps->l3DDistanceVolume = 0;
pVoiceProps->l3DDopplerPitch = 0;
pVoiceProps->lI3DL2DirectVolume = 0;
pVoiceProps->lI3DL2RoomVolume = 0;
pVoiceProps->lPitch = -4597;
for (int i = 0; i < 8; i++) {
if (i < pVoiceProps->dwMixBinCount) {
pVoiceProps->MixBinVolumePairs[i].dwMixBin = i;
pVoiceProps->MixBinVolumePairs[i].lVolume = 0;
} else {
pVoiceProps->MixBinVolumePairs[i].dwMixBin = 0xFFFFFFFF;
pVoiceProps->MixBinVolumePairs[i].lVolume = -10000;
}
}
leaveCriticalSection;
@ -4126,16 +4149,40 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_GetVoiceProperties)
HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_GetVoiceProperties)
(
X_CDirectSoundStream* pThis,
OUT void* pVoiceProps)
OUT X_DSVOICEPROPS* pVoiceProps
)
{
enterCriticalSection;
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
LOG_FUNC_ARG_OUT(pVoiceProps)
LOG_FUNC_END;
LOG_FUNC_END;
if (pVoiceProps == xbnullptr) {
LOG_TEST_CASE("pVoiceProps == xbnullptr");
RETURN(DS_OK);
}
LOG_UNIMPLEMENTED();
// HACK: Set values that are known to prevent crashes/hangs
// TODO: Investigate and implement proper mixbin functionality
pVoiceProps->dwMixBinCount = 2;
pVoiceProps->l3DConeVolume = 0;
pVoiceProps->l3DDistanceVolume = 0;
pVoiceProps->l3DDopplerPitch = 0;
pVoiceProps->lI3DL2DirectVolume = 0;
pVoiceProps->lI3DL2RoomVolume = 0;
pVoiceProps->lPitch = -4597;
for (int i = 0; i < 8; i++) {
if (i < pVoiceProps->dwMixBinCount) {
pVoiceProps->MixBinVolumePairs[i].dwMixBin = i;
pVoiceProps->MixBinVolumePairs[i].lVolume = 0;
} else {
pVoiceProps->MixBinVolumePairs[i].dwMixBin = 0xFFFFFFFF;
pVoiceProps->MixBinVolumePairs[i].lVolume = -10000;
}
}
leaveCriticalSection;
@ -4148,7 +4195,8 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_GetVoiceProperties)
HRESULT WINAPI XTL::EMUPATCH(IDirectSoundStream_SetVolume)
(
X_CDirectSoundStream* pThis,
LONG lVolume)
LONG lVolume
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
@ -4269,3 +4317,100 @@ HRESULT WINAPI XTL::EMUPATCH(IDirectSoundStream_SetMixBins)
return XTL::EMUPATCH(CDirectSoundStream_SetMixBins)(pThis, pMixBins);
}
// ******************************************************************
// * patch: CDirectSound3DCalculator_Calculate3D
// ******************************************************************
VOID WINAPI XTL::EMUPATCH(CDirectSound3DCalculator_Calculate3D)
(
DWORD a1,
DWORD a2
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(a1)
LOG_FUNC_ARG(a2)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
}
// ******************************************************************
// * patch: CDirectSound3DCalculator_GetVoiceData
// ******************************************************************
VOID WINAPI XTL::EMUPATCH(CDirectSound3DCalculator_GetVoiceData)
(
DWORD a1,
DWORD a2,
DWORD a3,
DWORD a4,
DWORD a5
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(a1)
LOG_FUNC_ARG(a2)
LOG_FUNC_ARG(a3)
LOG_FUNC_ARG(a4)
LOG_FUNC_ARG(a5)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
}
// ******************************************************************
// * patch: IDirectSoundBuffer_Set3DVoiceData
// ******************************************************************
HRESULT WINAPI XTL::EMUPATCH(IDirectSoundBuffer_Set3DVoiceData)
(
X_CDirectSoundBuffer* pThis,
DWORD a2
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
LOG_FUNC_ARG(a2)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
RETURN(STATUS_SUCCESS);
}
// ******************************************************************
// * patch: IDirectSoundStream_Set3DVoiceData
// ******************************************************************
HRESULT WINAPI XTL::EMUPATCH(IDirectSoundStream_Set3DVoiceData)
(
X_CDirectSoundStream* pThis,
DWORD a2
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
LOG_FUNC_ARG(a2)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
RETURN(STATUS_SUCCESS);
}
// ******************************************************************
// * patch: IDirectSoundBuffer_Use3DVoiceData
// ******************************************************************
HRESULT WINAPI XTL::EMUPATCH(IDirectSoundStream_Use3DVoiceData)
(
X_CDirectSoundStream* pThis,
DWORD a2
)
{
LOG_FUNC_BEGIN
LOG_FUNC_ARG(pThis)
LOG_FUNC_ARG(a2)
LOG_FUNC_END;
LOG_UNIMPLEMENTED();
RETURN(STATUS_SUCCESS);
}

View File

@ -1582,7 +1582,7 @@ HRESULT WINAPI EMUPATCH(CDirectSoundStream_SetDopplerFactor)
HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_GetVoiceProperties)
(
X_CDirectSoundBuffer* pThis,
OUT void* pVoiceProps);
OUT X_DSVOICEPROPS* pVoiceProps);
// ******************************************************************
// * patch: CDirectSoundStream_GetVoiceProperties
@ -1590,7 +1590,7 @@ HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_GetVoiceProperties)
HRESULT WINAPI EMUPATCH(CDirectSoundStream_GetVoiceProperties)
(
X_CDirectSoundStream* pThis,
OUT void* pVoiceProps);
OUT X_DSVOICEPROPS* pVoiceProps);
// ******************************************************************
// * patch: IDirectSoundStream_SetVolume
@ -1654,6 +1654,51 @@ HRESULT WINAPI EMUPATCH(IDirectSoundStream_SetFrequency)
HRESULT WINAPI EMUPATCH(IDirectSoundStream_SetMixBins)
(
X_CDirectSoundStream* pThis,
PVOID pMixBins);
#endif
PVOID pMixBins);
// ******************************************************************
// * patch: CDirectSound3DCalculator_Calculate3D
// ******************************************************************
VOID WINAPI EMUPATCH(CDirectSound3DCalculator_Calculate3D)
(
DWORD a1,
DWORD a2);
// ******************************************************************
// * patch: CDirectSound3DCalculator_GetVoiceData
// ******************************************************************
VOID WINAPI EMUPATCH(CDirectSound3DCalculator_GetVoiceData)
(
DWORD a1,
DWORD a2,
DWORD a3,
DWORD a4,
DWORD a5);
// ******************************************************************
// * patch: IDirectSoundBuffer_Set3DVoiceData
// ******************************************************************
HRESULT WINAPI EMUPATCH(IDirectSoundBuffer_Set3DVoiceData)
(
X_CDirectSoundBuffer* pThis,
DWORD a2);
// ******************************************************************
// * patch: IDirectSoundStream_Set3DVoiceData
// ******************************************************************
HRESULT WINAPI EMUPATCH(IDirectSoundStream_Set3DVoiceData)
(
X_CDirectSoundStream* pThis,
DWORD a2
);
// ******************************************************************
// * patch: IDirectSoundStrea,_Use3DVoiceData
// ******************************************************************
HRESULT WINAPI EMUPATCH(IDirectSoundStream_Use3DVoiceData)
(
X_CDirectSoundStream* pThis,
DWORD a2
);
#endif
}

View File

@ -346,4 +346,14 @@ struct X_DSI3DL2BUFFER {
typedef struct IDirectSoundStream IDirectSoundStream;
typedef IDirectSoundStream *LPDIRECTSOUNDSTREAM;
struct X_DSVOICEPROPS {
DWORD dwMixBinCount;
X_DSMIXBINSVOLUMEPAIR MixBinVolumePairs[8];
LONG lPitch;
LONG l3DDistanceVolume;
LONG l3DConeVolume;
LONG l3DDopplerPitch;
LONG lI3DL2DirectVolume;
LONG lI3DL2RoomVolume;
};
#endif

View File

@ -225,7 +225,9 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("Lock2DSurface", XTL::EMUPATCH(Lock2DSurface), PATCH_HLE_D3D),
PATCH_ENTRY("Lock3DSurface", XTL::EMUPATCH(Lock3DSurface), PATCH_HLE_D3D),
// DSOUND
// DSOUND
PATCH_ENTRY("CDirectSound3DCalculator_Calculate3D", XTL::EMUPATCH(CDirectSound3DCalculator_Calculate3D), PATCH_HLE_DSOUND),
PATCH_ENTRY("CDirectSound3DCalculator_GetVoiceData", XTL::EMUPATCH(CDirectSound3DCalculator_GetVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("CDirectSoundStream_AddRef", XTL::EMUPATCH(CDirectSoundStream_AddRef), PATCH_HLE_DSOUND),
PATCH_ENTRY("CDirectSoundStream_Discontinuity", XTL::EMUPATCH(CDirectSoundStream_Discontinuity), PATCH_HLE_DSOUND),
PATCH_ENTRY("CDirectSoundStream_Flush", XTL::EMUPATCH(CDirectSoundStream_Flush), PATCH_HLE_DSOUND),
@ -285,7 +287,8 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("IDirectSoundBuffer_PauseEx", XTL::EMUPATCH(IDirectSoundBuffer_PauseEx), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Play", XTL::EMUPATCH(IDirectSoundBuffer_Play), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_PlayEx", XTL::EMUPATCH(IDirectSoundBuffer_PlayEx), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Release", XTL::EMUPATCH(IDirectSoundBuffer_Release), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Release", XTL::EMUPATCH(IDirectSoundBuffer_Release), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Set3DVoiceData ", XTL::EMUPATCH(IDirectSoundBuffer_Set3DVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_SetAllParameters", XTL::EMUPATCH(IDirectSoundBuffer_SetAllParameters), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_SetBufferData", XTL::EMUPATCH(IDirectSoundBuffer_SetBufferData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_SetConeAngles", XTL::EMUPATCH(IDirectSoundBuffer_SetConeAngles), PATCH_HLE_DSOUND),
@ -320,7 +323,8 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("IDirectSoundBuffer_Stop", XTL::EMUPATCH(IDirectSoundBuffer_Stop), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_StopEx", XTL::EMUPATCH(IDirectSoundBuffer_StopEx), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Unlock", XTL::EMUPATCH(IDirectSoundBuffer_Unlock), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Use3DVoiceData", XTL::EMUPATCH(IDirectSoundBuffer_Use3DVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundBuffer_Use3DVoiceData", XTL::EMUPATCH(IDirectSoundBuffer_Use3DVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_Set3DVoiceData ", XTL::EMUPATCH(IDirectSoundStream_Set3DVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetEG", XTL::EMUPATCH(IDirectSoundStream_SetEG), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetFilter", XTL::EMUPATCH(IDirectSoundStream_SetFilter), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetFrequency", XTL::EMUPATCH(IDirectSoundStream_SetFrequency), PATCH_HLE_DSOUND),
@ -328,7 +332,8 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
PATCH_ENTRY("IDirectSoundStream_SetLFO", XTL::EMUPATCH(IDirectSoundStream_SetLFO), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetMixBins", XTL::EMUPATCH(IDirectSoundStream_SetMixBins), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetPitch", XTL::EMUPATCH(IDirectSoundStream_SetPitch), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetVolume", XTL::EMUPATCH(IDirectSoundStream_SetVolume), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_SetVolume", XTL::EMUPATCH(IDirectSoundStream_SetVolume), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSoundStream_Use3DVoiceData ", XTL::EMUPATCH(IDirectSoundStream_Use3DVoiceData), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSound_AddRef", XTL::EMUPATCH(IDirectSound_AddRef), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSound_CommitDeferredSettings", XTL::EMUPATCH(IDirectSound_CommitDeferredSettings), PATCH_HLE_DSOUND),
PATCH_ENTRY("IDirectSound_CommitEffectData", XTL::EMUPATCH(IDirectSound_CommitEffectData), PATCH_HLE_DSOUND),