Merge pull request #2032 from RadWolfie/dsound-fixes
Fix CDirectSoundStream_GetStatus for difference output over time
This commit is contained in:
commit
21c27b416f
|
@ -1 +1 @@
|
||||||
Subproject commit b20e55df4087606e21a865a707c6fa4a5a01bd50
|
Subproject commit b671576370e044d5b3533ab4e35a296ed9a86021
|
|
@ -200,7 +200,7 @@ class X_CDirectSoundStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
// construct vtable (or grab ptr to existing)
|
// construct vtable (or grab ptr to existing)
|
||||||
X_CDirectSoundStream(bool is3D) : pVtbl(&vtbl), Xb_Voice(is3D) { pMcpxStream = new X_CMcpxStream(this); };
|
X_CDirectSoundStream(bool is3D);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// vtable (cached by each instance, via constructor)
|
// vtable (cached by each instance, via constructor)
|
||||||
|
@ -244,7 +244,8 @@ class X_CDirectSoundStream
|
||||||
*pVtbl;
|
*pVtbl;
|
||||||
|
|
||||||
// global vtbl for this class
|
// global vtbl for this class
|
||||||
static _vtbl vtbl;
|
static _vtbl vtbl_r1;
|
||||||
|
static _vtbl vtbl_r2;
|
||||||
|
|
||||||
DWORD Spacer[8];
|
DWORD Spacer[8];
|
||||||
PVOID pMcpxStream;
|
PVOID pMcpxStream;
|
||||||
|
@ -808,9 +809,18 @@ xbox::hresult_xt WINAPI EMUPATCH(CDirectSoundStream_GetInfo)
|
||||||
);
|
);
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
// * patch: CDirectSoundStream_GetStatus
|
// * patch: CDirectSoundStream_GetStatus (3911+)
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
xbox::hresult_xt WINAPI EMUPATCH(CDirectSoundStream_GetStatus)
|
xbox::hresult_xt WINAPI EMUPATCH(CDirectSoundStream_GetStatus__r1)
|
||||||
|
(
|
||||||
|
X_CDirectSoundStream* pThis,
|
||||||
|
LPDWORD pdwStatus
|
||||||
|
);
|
||||||
|
|
||||||
|
// ******************************************************************
|
||||||
|
// * patch: CDirectSoundStream_GetStatus (4134+)
|
||||||
|
// ******************************************************************
|
||||||
|
xbox::hresult_xt WINAPI EMUPATCH(CDirectSoundStream_GetStatus__r2)
|
||||||
(
|
(
|
||||||
X_CDirectSoundStream* pThis,
|
X_CDirectSoundStream* pThis,
|
||||||
LPDWORD pdwStatus
|
LPDWORD pdwStatus
|
||||||
|
|
|
@ -55,18 +55,18 @@ xbox::X_CMcpxStream::_vtbl xbox::X_CMcpxStream::vtbl =
|
||||||
&xbox::EMUPATCH(CMcpxStream_Dummy_0x10),// 0x10
|
&xbox::EMUPATCH(CMcpxStream_Dummy_0x10),// 0x10
|
||||||
};
|
};
|
||||||
|
|
||||||
xbox::X_CDirectSoundStream::_vtbl xbox::X_CDirectSoundStream::vtbl =
|
xbox::X_CDirectSoundStream::_vtbl xbox::X_CDirectSoundStream::vtbl_r1 =
|
||||||
{
|
{
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_AddRef), // 0x00
|
&xbox::EMUPATCH(CDirectSoundStream_AddRef), // 0x00
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_Release), // 0x04
|
&xbox::EMUPATCH(CDirectSoundStream_Release), // 0x04
|
||||||
/*
|
/*
|
||||||
STDMETHOD(GetInfo)(THIS_ LPXMEDIAINFO pInfo) PURE;
|
STDMETHOD(GetInfo)(THIS_ LPXMEDIAINFO pInfo) PURE;
|
||||||
*/
|
*/
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_GetInfo), // 0x08
|
&xbox::EMUPATCH(CDirectSoundStream_GetInfo), // 0x08
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_GetStatus), // 0x0C
|
&xbox::EMUPATCH(CDirectSoundStream_GetStatus__r1), // 0x0C
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_Process), // 0x10
|
&xbox::EMUPATCH(CDirectSoundStream_Process), // 0x10
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_Discontinuity), // 0x14
|
&xbox::EMUPATCH(CDirectSoundStream_Discontinuity), // 0x14
|
||||||
&xbox::EMUPATCH(CDirectSoundStream_Flush), // 0x18
|
&xbox::EMUPATCH(CDirectSoundStream_Flush), // 0x18
|
||||||
0xBEEFB003, // 0x1C // unknown function
|
0xBEEFB003, // 0x1C // unknown function
|
||||||
0xBEEFB004, // 0x20 // DS_CRefCount_AddRef
|
0xBEEFB004, // 0x20 // DS_CRefCount_AddRef
|
||||||
0xBEEFB005, // 0x24 // DS_CRefCount_Release
|
0xBEEFB005, // 0x24 // DS_CRefCount_Release
|
||||||
|
@ -77,6 +77,40 @@ xbox::X_CDirectSoundStream::_vtbl xbox::X_CDirectSoundStream::vtbl =
|
||||||
0xBEEFB00A, // 0x38
|
0xBEEFB00A, // 0x38
|
||||||
};
|
};
|
||||||
|
|
||||||
|
xbox::X_CDirectSoundStream::_vtbl xbox::X_CDirectSoundStream::vtbl_r2 =
|
||||||
|
{
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_AddRef), // 0x00
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_Release), // 0x04
|
||||||
|
/*
|
||||||
|
STDMETHOD(GetInfo)(THIS_ LPXMEDIAINFO pInfo) PURE;
|
||||||
|
*/
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_GetInfo), // 0x08
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_GetStatus__r2), // 0x0C
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_Process), // 0x10
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_Discontinuity), // 0x14
|
||||||
|
&xbox::EMUPATCH(CDirectSoundStream_Flush), // 0x18
|
||||||
|
0xBEEFB003, // 0x1C // unknown function
|
||||||
|
0xBEEFB004, // 0x20 // DS_CRefCount_AddRef
|
||||||
|
0xBEEFB005, // 0x24 // DS_CRefCount_Release
|
||||||
|
0xBEEFB006, // 0x28
|
||||||
|
0xBEEFB007, // 0x2C
|
||||||
|
0xBEEFB008, // 0x30
|
||||||
|
0xBEEFB009, // 0x34
|
||||||
|
0xBEEFB00A, // 0x38
|
||||||
|
};
|
||||||
|
|
||||||
|
// construct vtable (or grab ptr to existing)
|
||||||
|
xbox::X_CDirectSoundStream::X_CDirectSoundStream(bool is3D) : Xb_Voice(is3D)
|
||||||
|
{
|
||||||
|
pMcpxStream = new xbox::X_CMcpxStream(this);
|
||||||
|
if (g_LibVersion_DSOUND < 4134) {
|
||||||
|
pVtbl = &vtbl_r1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pVtbl = &vtbl_r2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* NOTE: SUCCEEDED define is only checking for is equal or greater than zero value.
|
/* NOTE: SUCCEEDED define is only checking for is equal or greater than zero value.
|
||||||
And FAILED check for less than zero value. Since DS_OK is only 0 base on DirectSound documentation,
|
And FAILED check for less than zero value. Since DS_OK is only 0 base on DirectSound documentation,
|
||||||
there is chance of failure which contain value greater than 0.
|
there is chance of failure which contain value greater than 0.
|
||||||
|
@ -453,12 +487,55 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
// * patch: CDirectSoundStream_GetStatus
|
// * patch: CDirectSoundStream_GetStatus (3911+)
|
||||||
// ******************************************************************
|
// ******************************************************************
|
||||||
xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetStatus)
|
xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetStatus__r1)
|
||||||
(
|
(
|
||||||
X_CDirectSoundStream* pThis,
|
X_CDirectSoundStream* pThis,
|
||||||
OUT dword_xt* pdwStatus)
|
OUT dword_xt* pdwStatus)
|
||||||
|
{
|
||||||
|
DSoundMutexGuardLock;
|
||||||
|
|
||||||
|
LOG_FUNC_BEGIN
|
||||||
|
LOG_FUNC_ARG(pThis)
|
||||||
|
LOG_FUNC_ARG_OUT(pdwStatus)
|
||||||
|
LOG_FUNC_END;
|
||||||
|
|
||||||
|
DWORD dwStatusXbox = 0, dwStatusHost;
|
||||||
|
HRESULT hRet = pThis->EmuDirectSoundBuffer8->GetStatus(&dwStatusHost);
|
||||||
|
|
||||||
|
// Convert host to xbox status flag.
|
||||||
|
if (hRet == DS_OK) {
|
||||||
|
if (pThis->Host_BufferPacketArray.size() != pThis->X_MaxAttachedPackets) {
|
||||||
|
dwStatusXbox = X_DSSSTATUS_READY;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
hRet = DSERR_GENERIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pdwStatus != xbox::zeroptr) {
|
||||||
|
*pdwStatus = dwStatusXbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only used for debug any future issues with custom stream's packet management
|
||||||
|
EmuLog(LOG_LEVEL::DEBUG, "packet array size: %d", pThis->Host_BufferPacketArray.size());
|
||||||
|
|
||||||
|
LOG_FUNC_BEGIN_ARG_RESULT
|
||||||
|
LOG_FUNC_ARG_RESULT_TYPE(DSSSTATUS_FLAG, pdwStatus)
|
||||||
|
LOG_FUNC_END_ARG_RESULT;
|
||||||
|
|
||||||
|
return hRet;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ******************************************************************
|
||||||
|
// * patch: CDirectSoundStream_GetStatus (4134+)
|
||||||
|
// ******************************************************************
|
||||||
|
xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetStatus__r2)
|
||||||
|
(
|
||||||
|
X_CDirectSoundStream* pThis,
|
||||||
|
OUT dword_xt* pdwStatus)
|
||||||
{
|
{
|
||||||
DSoundMutexGuardLock;
|
DSoundMutexGuardLock;
|
||||||
|
|
||||||
|
@ -479,13 +556,17 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetStatus)
|
||||||
if (pThis->Host_BufferPacketArray.size() != pThis->X_MaxAttachedPackets) {
|
if (pThis->Host_BufferPacketArray.size() != pThis->X_MaxAttachedPackets) {
|
||||||
dwStatusXbox |= X_DSSSTATUS_READY;
|
dwStatusXbox |= X_DSSSTATUS_READY;
|
||||||
}
|
}
|
||||||
*pdwStatus = dwStatusXbox;
|
|
||||||
|
|
||||||
} else if (pdwStatus != xbox::zeroptr) {
|
} else {
|
||||||
*pdwStatus = 0;
|
dwStatusXbox = 0;
|
||||||
|
hRet = DSERR_GENERIC;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only used for debugging any future issues with custom stream's packet management
|
if (pdwStatus != xbox::zeroptr) {
|
||||||
|
*pdwStatus = dwStatusXbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Only used for debug any future issues with custom stream's packet management
|
||||||
EmuLog(LOG_LEVEL::DEBUG, "packet array size: %d", pThis->Host_BufferPacketArray.size());
|
EmuLog(LOG_LEVEL::DEBUG, "packet array size: %d", pThis->Host_BufferPacketArray.size());
|
||||||
|
|
||||||
LOG_FUNC_BEGIN_ARG_RESULT
|
LOG_FUNC_BEGIN_ARG_RESULT
|
||||||
|
|
|
@ -203,7 +203,8 @@ std::map<const std::string, const xbox_patch_t> g_PatchTable = {
|
||||||
PATCH_ENTRY("CDirectSoundStream_Flush", xbox::EMUPATCH(CDirectSoundStream_Flush), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_Flush", xbox::EMUPATCH(CDirectSoundStream_Flush), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_FlushEx", xbox::EMUPATCH(CDirectSoundStream_FlushEx), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_FlushEx", xbox::EMUPATCH(CDirectSoundStream_FlushEx), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_GetInfo", xbox::EMUPATCH(CDirectSoundStream_GetInfo), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_GetInfo", xbox::EMUPATCH(CDirectSoundStream_GetInfo), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_GetStatus", xbox::EMUPATCH(CDirectSoundStream_GetStatus), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_GetStatus__r1", xbox::EMUPATCH(CDirectSoundStream_GetStatus__r1), PATCH_HLE_DSOUND),
|
||||||
|
PATCH_ENTRY("CDirectSoundStream_GetStatus__r2", xbox::EMUPATCH(CDirectSoundStream_GetStatus__r2), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_GetVoiceProperties", xbox::EMUPATCH(CDirectSoundStream_GetVoiceProperties), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_GetVoiceProperties", xbox::EMUPATCH(CDirectSoundStream_GetVoiceProperties), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_Pause", xbox::EMUPATCH(CDirectSoundStream_Pause), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_Pause", xbox::EMUPATCH(CDirectSoundStream_Pause), PATCH_HLE_DSOUND),
|
||||||
PATCH_ENTRY("CDirectSoundStream_PauseEx", xbox::EMUPATCH(CDirectSoundStream_PauseEx), PATCH_HLE_DSOUND),
|
PATCH_ENTRY("CDirectSoundStream_PauseEx", xbox::EMUPATCH(CDirectSoundStream_PauseEx), PATCH_HLE_DSOUND),
|
||||||
|
|
Loading…
Reference in New Issue