Module: wine Branch: master Commit: 8a1d4d1e4c6dca0b3be6c0784861aed4c6451679 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8a1d4d1e4c6dca0b3be6c07848...
Author: Chris Robinson chris.kcat@gmail.com Date: Tue Mar 27 02:45:15 2007 -0700
quartz: Protect DSound buffer creation with a critical section lock.
---
dlls/quartz/dsoundrender.c | 21 ++++++++++++++++----- 1 files changed, 16 insertions(+), 5 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 80f7257..259a25b 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -132,11 +132,20 @@ static HRESULT DSoundRender_CreateSoundBuffer(IBaseFilter * iface) TRACE("nBlockAlign = %d\n", format->nBlockAlign); TRACE("wBitsPerSample = %d\n", format->wBitsPerSample); TRACE("cbSize = %d\n", format->cbSize); - + + /* Lock the critical section to make sure we're still marked to play while + setting up the playback buffer */ + EnterCriticalSection(&This->csFilter); + + if (This->state != State_Running) { + hr = VFW_E_WRONG_STATE; + goto getout; + } + hr = DirectSoundCreate(NULL, &This->dsound, NULL); if (FAILED(hr)) { ERR("Cannot create Direct Sound object\n"); - return hr; + goto getout; }
wav_fmt = *format; @@ -151,7 +160,7 @@ static HRESULT DSoundRender_CreateSoundBuffer(IBaseFilter * iface) if (FAILED(hr)) { ERR("Can't create sound buffer !\n"); IDirectSound_Release(This->dsound); - return hr; + goto getout; }
hr = IDirectSoundBuffer_SetVolume(This->dsbuffer, This->volume); @@ -167,11 +176,13 @@ static HRESULT DSoundRender_CreateSoundBuffer(IBaseFilter * iface) ERR("Can't start sound buffer (%x)!\n", hr); IDirectSoundBuffer_Release(This->dsbuffer); IDirectSound_Release(This->dsound); - return hr; + goto getout; }
This->write_pos = 0; - + +getout: + LeaveCriticalSection(&This->csFilter); return hr; }