From 868dd534e850a11241818d8ad53ff6b318a45bfe Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Sat, 10 Mar 2007 04:09:43 -0800 Subject: [PATCH] quartz: Stop DSound buffer playback when the filter is paused or stopped, not the next time it's processed. --- dlls/quartz/dsoundrender.c | 46 +++++++++++++++++++++++++++----------- 1 file changed, 33 insertions(+), 13 deletions(-) diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index 67ab55065d8..7db676599dc 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -166,17 +166,6 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, LPBYTE data, DWORD size2; DWORD play_pos,buf_free; - if (This->state != State_Running) { - DWORD state; - if (SUCCEEDED(IDirectSoundBuffer_GetStatus(This->dsbuffer, &state))) { - if (state & DSBSTATUS_PLAYING) { - IDirectSoundBuffer_Stop(This->dsbuffer); - This->started = FALSE; - } - } - return S_OK; - } - while (1) { hr = IDirectSoundBuffer_GetCurrentPosition(This->dsbuffer, &play_pos, NULL); @@ -241,6 +230,9 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample) HRESULT hr; TRACE("%p %p\n", iface, pSample); + + if (This->state != State_Running) + return VFW_E_WRONG_STATE; hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) @@ -452,7 +444,21 @@ static HRESULT WINAPI DSoundRender_Stop(IBaseFilter * iface) EnterCriticalSection(&This->csFilter); { - This->state = State_Stopped; + DWORD state = 0; + if (This->dsbuffer) + { + hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state); + if (SUCCEEDED(hr)) + { + if (state & DSBSTATUS_PLAYING) + hr = IDirectSoundBuffer_Stop(This->dsbuffer); + } + } + if (SUCCEEDED(hr)) + { + This->started = FALSE; + This->state = State_Stopped; + } } LeaveCriticalSection(&This->csFilter); @@ -468,7 +474,21 @@ static HRESULT WINAPI DSoundRender_Pause(IBaseFilter * iface) EnterCriticalSection(&This->csFilter); { - This->state = State_Paused; + DWORD state = 0; + if (This->dsbuffer) + { + hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state); + if (SUCCEEDED(hr)) + { + if (state & DSBSTATUS_PLAYING) + hr = IDirectSoundBuffer_Stop(This->dsbuffer); + } + } + if (SUCCEEDED(hr)) + { + This->started = FALSE; + This->state = State_Paused; + } } LeaveCriticalSection(&This->csFilter);