diff --git a/src/CxbxKrnl/EmuDSound.cpp b/src/CxbxKrnl/EmuDSound.cpp index 605b02433..51eb085a1 100755 --- a/src/CxbxKrnl/EmuDSound.cpp +++ b/src/CxbxKrnl/EmuDSound.cpp @@ -3394,6 +3394,8 @@ HRESULT WINAPI XTL::EMUPATCH(CDirectSoundStream_SetFormat) LOG_FUNC_ARG(pwfxFormat) LOG_FUNC_END; + XTL::EMUPATCH(CDirectSoundStream_Flush)(pThis); + return HybridDirectSoundBuffer_SetFormat(pThis->EmuDirectSoundBuffer8, pwfxFormat, pThis->EmuBufferDesc, pThis->EmuFlags, pThis->EmuPlayFlags, pThis->EmuDirectSound3DBuffer8, 0, pThis->X_BufferCache, pThis->X_BufferCacheSize); diff --git a/src/CxbxKrnl/EmuDSoundInline.hpp b/src/CxbxKrnl/EmuDSoundInline.hpp index 4211abb2e..2f0172f98 100644 --- a/src/CxbxKrnl/EmuDSoundInline.hpp +++ b/src/CxbxKrnl/EmuDSoundInline.hpp @@ -286,7 +286,10 @@ inline void GeneratePCMFormat( GenerateXboxBufferCache(pDSBufferDesc, dwEmuFlags, X_BufferSizeRequest, X_BufferCache, X_BufferCacheSize); } - pDSBufferDesc->dwBufferBytes = DSoundBufferGetPCMBufferSize(dwEmuFlags, X_BufferCacheSize); + // Handle DSound Buffer only + if (X_BufferCacheSize > 0) { + pDSBufferDesc->dwBufferBytes = DSoundBufferGetPCMBufferSize(dwEmuFlags, X_BufferCacheSize); + } } inline void DSoundGenericUnlock( @@ -1060,6 +1063,11 @@ inline HRESULT HybridDirectSoundBuffer_SetFormat( if (g_pDSoundPrimaryBuffer == pDSBuffer) { hRet = pDSBuffer->SetFormat(pBufferDesc->lpwfxFormat); } else { + // DSound Stream only + if (X_BufferCacheSize == 0) { + // Allocate at least 5 second worth of bytes in PCM format. + pBufferDesc->dwBufferBytes = pBufferDesc->lpwfxFormat->nAvgBytesPerSec * 5; + } DSoundBufferReplace(pDSBuffer, pBufferDesc, dwPlayFlags, pDS3DBuffer); }