diff --git a/src/core/hle/DSOUND/DirectSound/DirectSound.cpp b/src/core/hle/DSOUND/DirectSound/DirectSound.cpp index ab6aef5bf..874914b71 100644 --- a/src/core/hle/DSOUND/DirectSound/DirectSound.cpp +++ b/src/core/hle/DSOUND/DirectSound/DirectSound.cpp @@ -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); +} diff --git a/src/core/hle/DSOUND/DirectSound/DirectSound.hpp b/src/core/hle/DSOUND/DirectSound/DirectSound.hpp index 9831f834f..9a5c4f6d2 100644 --- a/src/core/hle/DSOUND/DirectSound/DirectSound.hpp +++ b/src/core/hle/DSOUND/DirectSound/DirectSound.hpp @@ -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 } diff --git a/src/core/hle/DSOUND/XbDSoundTypes.h b/src/core/hle/DSOUND/XbDSoundTypes.h index caafd8bc8..d54bcb138 100644 --- a/src/core/hle/DSOUND/XbDSoundTypes.h +++ b/src/core/hle/DSOUND/XbDSoundTypes.h @@ -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 diff --git a/src/core/hle/Patches.cpp b/src/core/hle/Patches.cpp index b361de58c..f9ca88bdd 100644 --- a/src/core/hle/Patches.cpp +++ b/src/core/hle/Patches.cpp @@ -225,7 +225,9 @@ std::map 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 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 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 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),