Merge pull request #2039 from RadWolfie/dsound-fixes
Another Round of DSound's Stream fixes
This commit is contained in:
commit
efee57a10c
|
@ -75,13 +75,6 @@ void DSStream_Packet_Clear(
|
|||
|
||||
free(buffer->pBuffer_data);
|
||||
|
||||
// Peform release only, don't trigger any events below.
|
||||
if (status == XMP_STATUS_RELEASE_CXBXR) {
|
||||
DSoundSGEMemDealloc(buffer->xmp_data.dwMaxSize);
|
||||
buffer = pThis->Host_BufferPacketArray.erase(buffer);
|
||||
return;
|
||||
}
|
||||
|
||||
if (buffer->xmp_data.pdwStatus != xbox::zeroptr) {
|
||||
(*buffer->xmp_data.pdwStatus) = status;
|
||||
}
|
||||
|
@ -163,7 +156,7 @@ static inline void DSStream_Packet_Stop(
|
|||
{
|
||||
DSStream_Packet_Stop_Internal(pThis);
|
||||
|
||||
if (pThis->Host_BufferPacketArray.size() == 0) {
|
||||
if (pThis->Host_BufferPacketArray.empty()) {
|
||||
if ((pThis->EmuFlags & DSE_FLAG_ENVELOPE2) > 0) {
|
||||
pThis->Xb_Status |= X_DSSSTATUS_ENVELOPECOMPLETE;
|
||||
}
|
||||
|
@ -186,6 +179,18 @@ static inline void DSStream_Packet_Starved(
|
|||
);
|
||||
}
|
||||
|
||||
static inline void DSStream_Packet_Complete(
|
||||
xbox::X_CDirectSoundStream* pThis
|
||||
)
|
||||
{
|
||||
if ((pThis->EmuFlags & DSE_FLAG_ENVELOPE2) != 0) {
|
||||
pThis->Xb_Status = X_DSSSTATUS_ENVELOPECOMPLETE;
|
||||
}
|
||||
else {
|
||||
pThis->Xb_Status = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// Prefill buffer with at least 1 second worth of buffer. See "nAvgBytesPerSec" below for inspection.
|
||||
static void DSStream_Packet_Prefill(
|
||||
xbox::X_CDirectSoundStream* pThis,
|
||||
|
@ -214,10 +219,24 @@ bool DSStream_Packet_Process(
|
|||
{
|
||||
|
||||
// Do not allow to process if there is no packets.
|
||||
if (pThis->Host_BufferPacketArray.size() == 0) {
|
||||
if (pThis->Host_BufferPacketArray.empty()) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Do not allow to process when the voice is not activated.
|
||||
if ((pThis->EmuFlags & DSE_FLAG_PAUSENOACTIVATE) != 0 &&
|
||||
(pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED) == 0) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (pThis->EmuFlags & DSE_FLAG_IS_FLUSHING) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!(pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED)) {
|
||||
pThis->EmuFlags |= DSE_FLAG_IS_ACTIVATED;
|
||||
}
|
||||
|
||||
// If title want to pause, then don't process the packets.
|
||||
// If media object is being used as playback synch, then don't process the packets.
|
||||
if ((pThis->EmuFlags & DSE_FLAG_PAUSE) > 0 ||
|
||||
|
@ -228,16 +247,6 @@ bool DSStream_Packet_Process(
|
|||
return 0;
|
||||
}
|
||||
|
||||
if ((pThis->Xb_Status & X_DSSSTATUS_PAUSED) > 0) {
|
||||
pThis->Xb_Status &= ~X_DSSSTATUS_PAUSED;
|
||||
}
|
||||
|
||||
if (pThis->Host_isProcessing == false) {
|
||||
if (!(pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED)) {
|
||||
pThis->EmuFlags |= DSE_FLAG_IS_ACTIVATED;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD dwAudioBytes;
|
||||
HRESULT hRet = pThis->EmuDirectSoundBuffer8->GetStatus(&dwAudioBytes);
|
||||
if (hRet == DS_OK) {
|
||||
|
@ -289,9 +298,10 @@ bool DSStream_Packet_Process(
|
|||
bool isStreamEnd = packetCurrent->isStreamEnd;
|
||||
DSStream_Packet_Clear(packetCurrent, XMP_STATUS_SUCCESS, pThis->Xb_lpfnCallback, pThis->Xb_lpvContext, pThis);
|
||||
|
||||
if (pThis->Host_BufferPacketArray.size() == 0) {
|
||||
if (pThis->Host_BufferPacketArray.empty()) {
|
||||
if (isStreamEnd) {
|
||||
DSStream_Packet_Stop(pThis);
|
||||
DSStream_Packet_Complete(pThis);
|
||||
}
|
||||
else {
|
||||
DSStream_Packet_Starved(pThis);
|
||||
|
@ -325,7 +335,7 @@ bool DSStream_Packet_Process(
|
|||
DSStream_Packet_Prefill(pThis, packetCurrent);
|
||||
}
|
||||
// Out of packets, let's stop stream's buffer.
|
||||
if (pThis->Host_BufferPacketArray.size() == 0) {
|
||||
if (pThis->Host_BufferPacketArray.empty()) {
|
||||
DSStream_Packet_Starved(pThis);
|
||||
return 0;
|
||||
}
|
||||
|
@ -345,7 +355,7 @@ void DSStream_Packet_FlushEx_Reset(
|
|||
xbox::X_CDirectSoundStream* pThis
|
||||
)
|
||||
{
|
||||
// Remove flags only (This is the only place it will remove other than FlushEx perform set/remove the flags.)
|
||||
// Remove flags only (This is the only place it will remove beside FlushEx perform re-set the flags.)
|
||||
pThis->EmuFlags &= ~(DSE_FLAG_FLUSH_ASYNC | DSE_FLAG_ENVELOPE | DSE_FLAG_ENVELOPE2);
|
||||
pThis->Xb_rtFlushEx = 0LL;
|
||||
}
|
||||
|
@ -354,6 +364,9 @@ bool DSStream_Packet_Flush(
|
|||
xbox::X_CDirectSoundStream* pThis
|
||||
)
|
||||
{
|
||||
if ((pThis->EmuFlags & DSE_FLAG_IS_FLUSHING) == 0) {
|
||||
pThis->EmuFlags |= DSE_FLAG_IS_FLUSHING;
|
||||
}
|
||||
// If host's audio is still playing then return busy-state until buffer has stop playing.
|
||||
DWORD dwStatus;
|
||||
pThis->EmuDirectSoundBuffer8->GetStatus(&dwStatus);
|
||||
|
@ -371,8 +384,14 @@ bool DSStream_Packet_Flush(
|
|||
DSStream_Packet_Clear(buffer, XMP_STATUS_FLUSHED, pThis->Xb_lpfnCallback, pThis->Xb_lpvContext, pThis);
|
||||
}
|
||||
// Clear flags and set status to zero.
|
||||
DSStream_Packet_Complete(pThis);
|
||||
DSStream_Packet_FlushEx_Reset(pThis);
|
||||
pThis->EmuFlags &= ~DSE_FLAG_PAUSE;
|
||||
pThis->Xb_Status = 0;
|
||||
|
||||
// TESTCASE: Burnout 3 sets stream to pause state then calling SetFormat without processing any packets.
|
||||
// Which then doesn't need to clear pause flag.
|
||||
if ((pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED) != 0) {
|
||||
pThis->EmuFlags &= ~(DSE_FLAG_PAUSE | DSE_FLAG_IS_ACTIVATED);
|
||||
}
|
||||
pThis->EmuFlags &= ~DSE_FLAG_IS_FLUSHING;
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -899,7 +899,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSound_SynchPlayback)
|
|||
|
||||
vector_ds_stream::iterator ppDSStream = g_pDSoundStreamCache.begin();
|
||||
for (; ppDSStream != g_pDSoundStreamCache.end(); ppDSStream++) {
|
||||
if ((*ppDSStream)->Host_BufferPacketArray.size() == 0) {
|
||||
if ((*ppDSStream)->Host_BufferPacketArray.empty()) {
|
||||
continue;
|
||||
}
|
||||
if (((*ppDSStream)->EmuFlags & DSE_FLAG_SYNCHPLAYBACK_CONTROL) > 0) {
|
||||
|
|
|
@ -133,11 +133,13 @@ struct SharedDSBuffer : DSBUFFER_S {
|
|||
#define DSE_FLAG_PCM_UNKNOWN (1 << 2)
|
||||
#define DSE_FLAG_SYNCHPLAYBACK_CONTROL (1 << 10)
|
||||
#define DSE_FLAG_PAUSE (1 << 11)
|
||||
#define DSE_FLAG_FLUSH_ASYNC (1 << 12)
|
||||
#define DSE_FLAG_ENVELOPE (1 << 13)
|
||||
#define DSE_FLAG_ENVELOPE2 (1 << 14) // NOTE: This flag is a requirement for GetStatus to return X_DSSSTATUS_ENVELOPECOMPLETE value.
|
||||
#define DSE_FLAG_PAUSENOACTIVATE (1 << 12)
|
||||
#define DSE_FLAG_FLUSH_ASYNC (1 << 13)
|
||||
#define DSE_FLAG_ENVELOPE (1 << 14)
|
||||
#define DSE_FLAG_ENVELOPE2 (1 << 15) // NOTE: This flag is a requirement for GetStatus to return X_DSSSTATUS_ENVELOPECOMPLETE value.
|
||||
#define DSE_FLAG_RECIEVEDATA (1 << 20)
|
||||
#define DSE_FLAG_IS_ACTIVATED (1 << 21) // Only used for DirectSoundStream class, to acknowledge pause's no activate flag.
|
||||
#define DSE_FLAG_IS_FLUSHING (1 << 22) // Only used for DirectSoundStream class, to acknowledge pause's no activate flag.
|
||||
#define DSE_FLAG_DEBUG_MUTE (1 << 30) // Cxbx-R debugging usage only
|
||||
#define DSE_FLAG_BUFFER_EXTERNAL (1 << 31)
|
||||
#define DSE_FLAG_AUDIO_CODECS (DSE_FLAG_PCM | DSE_FLAG_XADPCM | DSE_FLAG_PCM_UNKNOWN)
|
||||
|
|
|
@ -849,14 +849,16 @@ static inline HRESULT HybridDirectSoundBuffer_Pause(
|
|||
pDSBuffer->Play(0, 0, dwEmuPlayFlags);
|
||||
}
|
||||
DSoundBufferSynchPlaybackFlagRemove(dwEmuFlags);
|
||||
dwEmuFlags &= ~DSE_FLAG_PAUSE;
|
||||
dwEmuFlags &= ~(DSE_FLAG_PAUSE | DSE_FLAG_PAUSENOACTIVATE);
|
||||
Xb_rtTimeStamp = 0;
|
||||
break;
|
||||
case X_DSSPAUSE_PAUSE:
|
||||
pDSBuffer->Stop();
|
||||
DSoundBufferSynchPlaybackFlagRemove(dwEmuFlags);
|
||||
dwEmuFlags |= DSE_FLAG_PAUSE;
|
||||
Xb_rtTimeStamp = rtTimeStamp;
|
||||
if ((dwEmuFlags & DSE_FLAG_PAUSENOACTIVATE) == 0) {
|
||||
dwEmuFlags |= DSE_FLAG_PAUSE;
|
||||
Xb_rtTimeStamp = rtTimeStamp;
|
||||
}
|
||||
break;
|
||||
case X_DSSPAUSE_SYNCHPLAYBACK:
|
||||
//TODO: Test case Rayman 3 - Hoodlum Havoc, Battlestar Galactica, Miami Vice, Star Wars: KotOR, and... ?
|
||||
|
@ -867,8 +869,13 @@ static inline HRESULT HybridDirectSoundBuffer_Pause(
|
|||
pDSBuffer->Stop();
|
||||
}
|
||||
break;
|
||||
// TODO: NOTE: If stream is playing, it perform same behavior as pause flag. If it is not played, it act as a queue until trigger to play it.
|
||||
// NOTE: If stream is paused with packets, it will trigger to play. If it is not played, it act as a queue until trigger to play it.
|
||||
case X_DSSPAUSE_PAUSENOACTIVATE:
|
||||
dwEmuFlags &= ~DSE_FLAG_PAUSE;
|
||||
if ((dwEmuFlags & DSE_FLAG_IS_ACTIVATED) == 0) {
|
||||
dwEmuFlags |= DSE_FLAG_PAUSENOACTIVATE;
|
||||
Xb_rtTimeStamp = rtTimeStamp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -126,14 +126,14 @@ void DirectSoundDoWork_Stream(xbox::LARGE_INTEGER& time)
|
|||
// Actually, DirectSoundStream need to process buffer packets here.
|
||||
vector_ds_stream::iterator ppDSStream = g_pDSoundStreamCache.begin();
|
||||
for (; ppDSStream != g_pDSoundStreamCache.end(); ppDSStream++) {
|
||||
if ((*ppDSStream)->Host_BufferPacketArray.size() == 0) {
|
||||
if ((*ppDSStream)->Host_BufferPacketArray.empty()) {
|
||||
continue;
|
||||
}
|
||||
xbox::X_CDirectSoundStream* pThis = (*ppDSStream);
|
||||
// TODO: Do we need this in async thread loop?
|
||||
if (pThis->Xb_rtPauseEx != 0LL && pThis->Xb_rtPauseEx <= time.QuadPart) {
|
||||
pThis->Xb_rtPauseEx = 0LL;
|
||||
pThis->EmuFlags &= ~DSE_FLAG_PAUSE;
|
||||
pThis->EmuFlags &= ~(DSE_FLAG_PAUSE | DSE_FLAG_PAUSENOACTIVATE);
|
||||
// Don't call play here, let DSStream_Packet_Process deal with it.
|
||||
}
|
||||
// If has flush async requested then verify time has expired to perform flush process.
|
||||
|
@ -191,7 +191,7 @@ xbox::ulong_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Release)
|
|||
}
|
||||
|
||||
for (auto buffer = pThis->Host_BufferPacketArray.begin(); buffer != pThis->Host_BufferPacketArray.end();) {
|
||||
DSStream_Packet_Clear(buffer, XMP_STATUS_RELEASE_CXBXR, nullptr, nullptr, pThis);
|
||||
DSStream_Packet_Clear(buffer, XMP_STATUS_FLUSHED, pThis->Xb_lpfnCallback, pThis->Xb_lpvContext, pThis);
|
||||
}
|
||||
|
||||
if (pThis->EmuBufferDesc.lpwfxFormat != nullptr) {
|
||||
|
@ -380,6 +380,18 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Discontinuity)
|
|||
return DS_OK;
|
||||
}
|
||||
|
||||
xbox::hresult_xt CxbxrImpl_CDirectSoundStream_Flush
|
||||
(
|
||||
xbox::X_CDirectSoundStream* pThis)
|
||||
{
|
||||
|
||||
DSoundBufferSynchPlaybackFlagRemove(pThis->EmuFlags);
|
||||
|
||||
while (DSStream_Packet_Flush(pThis));
|
||||
|
||||
return DS_OK;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: CDirectSoundStream_Flush
|
||||
// ******************************************************************
|
||||
|
@ -391,11 +403,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Flush)
|
|||
|
||||
LOG_FUNC_ONE_ARG(pThis);
|
||||
|
||||
DSoundBufferSynchPlaybackFlagRemove(pThis->EmuFlags);
|
||||
|
||||
while (DSStream_Packet_Flush(pThis));
|
||||
|
||||
return DS_OK;
|
||||
return CxbxrImpl_CDirectSoundStream_Flush(pThis);
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
|
@ -412,7 +420,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_FlushEx)
|
|||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(pThis)
|
||||
LOG_FUNC_ARG(rtTimeStamp)
|
||||
LOG_FUNC_ARG(dwFlags)
|
||||
LOG_FUNC_ARG_TYPE(DSSFLUSHEX_FLAG, dwFlags)
|
||||
LOG_FUNC_END;
|
||||
|
||||
HRESULT hRet = DSERR_INVALIDPARAM;
|
||||
|
@ -422,22 +430,20 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_FlushEx)
|
|||
// Cannot use rtTimeStamp here, it must be flush.
|
||||
if (dwFlags == X_DSSFLUSHEX_IMMEDIATE) {
|
||||
|
||||
hRet = xbox::EMUPATCH(CDirectSoundStream_Flush)(pThis);
|
||||
hRet = CxbxrImpl_CDirectSoundStream_Flush(pThis);
|
||||
|
||||
}
|
||||
// Remaining flags require X_DSSFLUSHEX_ASYNC to be include.
|
||||
else if ((dwFlags & X_DSSFLUSHEX_ASYNC) > 0) {
|
||||
else if ((dwFlags & X_DSSFLUSHEX_ASYNC) > 0 && !pThis->Host_BufferPacketArray.empty()) {
|
||||
// If rtTimeStamp is zero'd, then call flush once and allow process flush in worker thread.
|
||||
if (rtTimeStamp == 0LL) {
|
||||
bool isBusy = DSStream_Packet_Flush(pThis);
|
||||
if (!isBusy) {
|
||||
// testcase: Obscure will crash after new game's video if not call DSStream_Packet_Flush in same thread.
|
||||
// If flush is not busy, then we don't need worker thread to continue flushing.
|
||||
return hRet;
|
||||
}
|
||||
xbox::LARGE_INTEGER getTime;
|
||||
xbox::KeQuerySystemTime(&getTime);
|
||||
pThis->Xb_rtFlushEx = getTime.QuadPart;
|
||||
pThis->EmuFlags |= DSE_FLAG_IS_FLUSHING;
|
||||
// HACK: Need to find a way to remove Flush call without break Obscure.
|
||||
// Otherwise, it will behave like on hardware.
|
||||
DSStream_Packet_Flush(pThis);
|
||||
}
|
||||
else {
|
||||
pThis->Xb_rtFlushEx = rtTimeStamp;
|
||||
|
@ -549,14 +555,17 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetStatus__r2)
|
|||
|
||||
// Convert host to xbox status flag.
|
||||
if (hRet == DS_OK) {
|
||||
if (pThis->Host_isProcessing && !(dwStatusXbox & X_DSSSTATUS_PAUSED)) {
|
||||
dwStatusXbox |= X_DSSSTATUS_PLAYING;
|
||||
|
||||
}
|
||||
if (pThis->Host_BufferPacketArray.size() != pThis->X_MaxAttachedPackets) {
|
||||
dwStatusXbox |= X_DSSSTATUS_READY;
|
||||
}
|
||||
|
||||
if (!pThis->Host_BufferPacketArray.empty()) {
|
||||
if ((pThis->EmuFlags & DSE_FLAG_PAUSE) != 0) {
|
||||
dwStatusXbox |= X_DSSSTATUS_PAUSED;
|
||||
}
|
||||
else if ((pThis->EmuFlags & (DSE_FLAG_PAUSE | DSE_FLAG_PAUSENOACTIVATE | DSE_FLAG_IS_FLUSHING)) == 0) {
|
||||
dwStatusXbox |= X_DSSSTATUS_PLAYING;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
dwStatusXbox = 0;
|
||||
hRet = DSERR_GENERIC;
|
||||
|
@ -601,19 +610,38 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_GetVoiceProperties)
|
|||
return hRet;
|
||||
}
|
||||
|
||||
|
||||
xbox::hresult_xt CxbxrImpl_CDirectSoundStream_PauseEx(
|
||||
xbox::X_CDirectSoundStream* pThis,
|
||||
xbox::REFERENCE_TIME rtTimestamp,
|
||||
xbox::dword_xt dwPause)
|
||||
{
|
||||
xbox::hresult_xt hRet = HybridDirectSoundBuffer_Pause(pThis->EmuDirectSoundBuffer8, dwPause, pThis->EmuFlags, pThis->EmuPlayFlags,
|
||||
pThis->Host_isProcessing, rtTimestamp, pThis->Xb_rtPauseEx);
|
||||
|
||||
if ((pThis->EmuFlags & DSE_FLAG_PAUSE) != 0) {
|
||||
pThis->Host_isProcessing = false;
|
||||
}
|
||||
else if (!pThis->Host_isProcessing) {
|
||||
DSStream_Packet_Process(pThis);
|
||||
}
|
||||
|
||||
return hRet;
|
||||
}
|
||||
|
||||
// ******************************************************************
|
||||
// * patch: CDirectSoundStream_Pause
|
||||
// ******************************************************************
|
||||
xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Pause)
|
||||
(
|
||||
X_CDirectSoundStream* pThis,
|
||||
dword_xt dwPause)
|
||||
dword_xt dwPause)
|
||||
{
|
||||
DSoundMutexGuardLock;
|
||||
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(pThis)
|
||||
LOG_FUNC_ARG(dwPause)
|
||||
LOG_FUNC_ARG_TYPE(DSSPAUSE_FLAG, dwPause)
|
||||
LOG_FUNC_END;
|
||||
|
||||
if (!pThis) {
|
||||
|
@ -621,26 +649,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Pause)
|
|||
return xbox::status_success;
|
||||
}
|
||||
|
||||
HRESULT hRet = HybridDirectSoundBuffer_Pause(pThis->EmuDirectSoundBuffer8, dwPause, pThis->EmuFlags, pThis->EmuPlayFlags,
|
||||
pThis->Host_isProcessing, 0LL, pThis->Xb_rtPauseEx);
|
||||
|
||||
if (dwPause == X_DSSPAUSE_PAUSENOACTIVATE) {
|
||||
if (pThis->Host_BufferPacketArray.size() == 0 && !(pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED)) {
|
||||
pThis->EmuFlags |= DSE_FLAG_PAUSE;
|
||||
}
|
||||
}
|
||||
|
||||
if ((pThis->EmuFlags & DSE_FLAG_PAUSE) > 0) {
|
||||
pThis->Host_isProcessing = false;
|
||||
if ((pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED) > 0) {
|
||||
if (pThis->Host_BufferPacketArray.size() != 0) {
|
||||
pThis->Xb_Status |= X_DSSSTATUS_PAUSED;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!pThis->Host_isProcessing) {
|
||||
DSStream_Packet_Process(pThis);
|
||||
}
|
||||
HRESULT hRet = CxbxrImpl_CDirectSoundStream_PauseEx(pThis, 0LL, dwPause);
|
||||
|
||||
return hRet;
|
||||
}
|
||||
|
@ -652,21 +661,19 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_PauseEx)
|
|||
(
|
||||
X_CDirectSoundStream *pThis,
|
||||
REFERENCE_TIME rtTimestamp,
|
||||
dword_xt dwPause)
|
||||
dword_xt dwPause)
|
||||
{
|
||||
DSoundMutexGuardLock;
|
||||
|
||||
LOG_FUNC_BEGIN
|
||||
LOG_FUNC_ARG(pThis)
|
||||
LOG_FUNC_ARG(rtTimestamp)
|
||||
LOG_FUNC_ARG(dwPause)
|
||||
LOG_FUNC_ARG_TYPE(DSSPAUSE_FLAG, dwPause)
|
||||
LOG_FUNC_END;
|
||||
|
||||
// This function wasn't part of the XDK until 4721. (Same as IDirectSoundBuffer_PauseEx?)
|
||||
// TODO: Implement time stamp feature (a thread maybe?)
|
||||
|
||||
HRESULT hRet = HybridDirectSoundBuffer_Pause(pThis->EmuDirectSoundBuffer8, dwPause, pThis->EmuFlags, pThis->EmuPlayFlags,
|
||||
pThis->Host_isProcessing, rtTimestamp, pThis->Xb_rtPauseEx);
|
||||
HRESULT hRet = CxbxrImpl_CDirectSoundStream_PauseEx(pThis, rtTimestamp, dwPause);
|
||||
|
||||
return hRet;
|
||||
}
|
||||
|
@ -735,9 +742,7 @@ xbox::hresult_xt WINAPI xbox::EMUPATCH(CDirectSoundStream_Process)
|
|||
if ((pThis->Xb_Status & X_DSSSTATUS_STARVED) > 0) {
|
||||
pThis->Xb_Status &= ~X_DSSSTATUS_STARVED;
|
||||
}
|
||||
if ((pThis->EmuFlags & DSE_FLAG_IS_ACTIVATED) > 0 && (pThis->EmuFlags & DSE_FLAG_PAUSE) > 0) {
|
||||
pThis->Xb_Status |= X_DSSSTATUS_PAUSED;
|
||||
}
|
||||
pThis->EmuFlags &= ~DSE_FLAG_IS_FLUSHING;
|
||||
DSStream_Packet_Process(pThis);
|
||||
// Once full it needs to change status to flushed when cannot hold any more packets.
|
||||
} else {
|
||||
|
|
|
@ -118,12 +118,12 @@ FLAGS2STR_START(DSSFLUSHEX_FLAG)
|
|||
FLAG2STR(X_DSSFLUSHEX_ENVELOPE2)
|
||||
FLAGS2STR_END_and_LOGRENDER(DSSFLUSHEX_FLAG)
|
||||
|
||||
FLAGS2STR_START(DSSPAUSE_FLAG)
|
||||
FLAG2STR(X_DSSPAUSE_RESUME)
|
||||
FLAG2STR(X_DSSPAUSE_PAUSE)
|
||||
FLAG2STR(X_DSSPAUSE_SYNCHPLAYBACK)
|
||||
FLAG2STR(X_DSSPAUSE_PAUSENOACTIVATE)
|
||||
FLAGS2STR_END_and_LOGRENDER(DSSPAUSE_FLAG)
|
||||
ENUM2STR_START(DSSPAUSE_FLAG)
|
||||
ENUM2STR_CASE(X_DSSPAUSE_RESUME)
|
||||
ENUM2STR_CASE(X_DSSPAUSE_PAUSE)
|
||||
ENUM2STR_CASE(X_DSSPAUSE_SYNCHPLAYBACK)
|
||||
ENUM2STR_CASE(X_DSSPAUSE_PAUSENOACTIVATE)
|
||||
ENUM2STR_END_and_LOGRENDER(DSSPAUSE_FLAG)
|
||||
|
||||
FLAGS2STR_START(DSSSTATUS_FLAG)
|
||||
FLAG2STR(X_DSSSTATUS_READY)
|
||||
|
@ -139,7 +139,6 @@ ENUM2STR_START(XMP_STATUS)
|
|||
ENUM2STR_CASE(XMP_STATUS_PENDING)
|
||||
ENUM2STR_CASE(XMP_STATUS_FLUSHED)
|
||||
ENUM2STR_CASE(XMP_STATUS_FAILURE)
|
||||
ENUM2STR_CASE((int)XMP_STATUS_RELEASE_CXBXR) // NOTE: Custom status for Cxbx-Reloaded.
|
||||
ENUM2STR_END_and_LOGRENDER(XMP_STATUS)
|
||||
|
||||
FLAGS2STR_START(XMO_STREAMF)
|
||||
|
|
|
@ -67,7 +67,7 @@ FLAGS2STR_HEADER(DSBSTOPEX_FLAG)
|
|||
// DSound Stream flag/enum
|
||||
FLAGS2STR_HEADER(DSSCAPS_FLAG)
|
||||
FLAGS2STR_HEADER(DSSFLUSHEX_FLAG)
|
||||
FLAGS2STR_HEADER(DSSPAUSE_FLAG)
|
||||
ENUM2STR_HEADER(DSSPAUSE_FLAG)
|
||||
FLAGS2STR_HEADER(DSSSTATUS_FLAG)
|
||||
|
||||
// DSound class usage
|
||||
|
|
|
@ -225,7 +225,6 @@ XMEDIAPACKET, *PXMEDIAPACKET, *LPXMEDIAPACKET;
|
|||
#define XMP_STATUS_PENDING E_PENDING
|
||||
#define XMP_STATUS_FLUSHED E_ABORT
|
||||
#define XMP_STATUS_FAILURE E_FAIL
|
||||
#define XMP_STATUS_RELEASE_CXBXR 0xFFFFFFFF
|
||||
|
||||
// ******************************************************************
|
||||
// * XMEDIAINFO
|
||||
|
|
Loading…
Reference in New Issue