Commit 3658bf23 authored by Maarten Lankhorst's avatar Maarten Lankhorst Committed by Alexandre Julliard

quartz: Fix flushing in dsound renderer.

parent 213d84be
...@@ -72,6 +72,7 @@ typedef struct DSoundRenderImpl ...@@ -72,6 +72,7 @@ typedef struct DSoundRenderImpl
DWORD last_play_pos; DWORD last_play_pos;
DWORD play_loops; DWORD play_loops;
DWORD in_loop;
REFERENCE_TIME play_time; REFERENCE_TIME play_time;
MediaSeekingImpl mediaSeeking; MediaSeekingImpl mediaSeeking;
...@@ -199,9 +200,20 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, const BYTE *d ...@@ -199,9 +200,20 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, const BYTE *d
buf_free = This->buf_size - This->write_pos + play_pos; buf_free = This->buf_size - This->write_pos + play_pos;
/* Wait for enough of the buffer to empty before filling it */ /* Wait for enough of the buffer to empty before filling it */
if(buf_free < This->buf_size/4) if(buf_free < This->buf_size/20)
{ {
Sleep(50); DWORD ret;
This->in_loop = 1;
LeaveCriticalSection(&This->csFilter);
ret = WaitForSingleObject(This->blocked, 50);
if (ret != WAIT_TIMEOUT)
ERR("%x\n", ret);
EnterCriticalSection(&This->csFilter);
This->in_loop = 0;
if (This->pInputPin->flushing)
return VFW_E_WRONG_STATE;
if (This->state == State_Stopped)
return VFW_E_WRONG_STATE;
continue; continue;
} }
...@@ -296,8 +308,6 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample) ...@@ -296,8 +308,6 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
} }
} }
SetEvent(This->state_change);
hr = IMediaSample_GetPointer(pSample, &pbSrcStream); hr = IMediaSample_GetPointer(pSample, &pbSrcStream);
if (FAILED(hr)) if (FAILED(hr))
{ {
...@@ -325,6 +335,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample) ...@@ -325,6 +335,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
if (This->state == State_Paused) if (This->state == State_Paused)
{ {
SetEvent(This->state_change);
LeaveCriticalSection(&This->csFilter); LeaveCriticalSection(&This->csFilter);
WaitForSingleObject(This->blocked, INFINITE); WaitForSingleObject(This->blocked, INFINITE);
EnterCriticalSection(&This->csFilter); EnterCriticalSection(&This->csFilter);
...@@ -360,6 +371,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample) ...@@ -360,6 +371,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
#endif #endif
hr = DSoundRender_SendSampleData(This, pbSrcStream, cbSrcStream); hr = DSoundRender_SendSampleData(This, pbSrcStream, cbSrcStream);
SetEvent(This->state_change);
LeaveCriticalSection(&This->csFilter); LeaveCriticalSection(&This->csFilter);
return hr; return hr;
} }
...@@ -651,6 +663,7 @@ static HRESULT WINAPI DSoundRender_Run(IBaseFilter * iface, REFERENCE_TIME tStar ...@@ -651,6 +663,7 @@ static HRESULT WINAPI DSoundRender_Run(IBaseFilter * iface, REFERENCE_TIME tStar
ResetEvent(This->state_change); ResetEvent(This->state_change);
This->pInputPin->end_of_stream = 0; This->pInputPin->end_of_stream = 0;
} }
ResetEvent(This->blocked);
This->state = State_Running; This->state = State_Running;
} }
...@@ -964,16 +977,39 @@ static HRESULT WINAPI DSoundRender_InputPin_BeginFlush(IPin * iface) ...@@ -964,16 +977,39 @@ static HRESULT WINAPI DSoundRender_InputPin_BeginFlush(IPin * iface)
InputPin *This = (InputPin *)iface; InputPin *This = (InputPin *)iface;
DSoundRenderImpl *pFilter = (DSoundRenderImpl *)This->pin.pinInfo.pFilter; DSoundRenderImpl *pFilter = (DSoundRenderImpl *)This->pin.pinInfo.pFilter;
HRESULT hr; HRESULT hr;
LPBYTE buffer;
DWORD size;
TRACE("\n"); TRACE("\n");
EnterCriticalSection(This->pin.pCritSec); EnterCriticalSection(This->pin.pCritSec);
hr = InputPin_BeginFlush(iface); hr = InputPin_BeginFlush(iface);
SetEvent(pFilter->blocked);
LeaveCriticalSection(This->pin.pCritSec);
return hr;
}
static HRESULT WINAPI DSoundRender_InputPin_EndFlush(IPin * iface)
{
InputPin *This = (InputPin *)iface;
DSoundRenderImpl *pFilter = (DSoundRenderImpl *)This->pin.pinInfo.pFilter;
HRESULT hr;
TRACE("\n");
EnterCriticalSection(This->pin.pCritSec);
if (pFilter->in_loop) {
ResetEvent(pFilter->state_change);
LeaveCriticalSection(This->pin.pCritSec);
WaitForSingleObject(pFilter->state_change, -1);
EnterCriticalSection(This->pin.pCritSec);
}
if (pFilter->state != State_Stopped)
ResetEvent(pFilter->blocked);
if (pFilter->dsbuffer) if (pFilter->dsbuffer)
{ {
LPBYTE buffer;
DWORD size;
IDirectSoundBuffer_Stop(pFilter->dsbuffer); IDirectSoundBuffer_Stop(pFilter->dsbuffer);
/* Force a reset */ /* Force a reset */
...@@ -986,27 +1022,7 @@ static HRESULT WINAPI DSoundRender_InputPin_BeginFlush(IPin * iface) ...@@ -986,27 +1022,7 @@ static HRESULT WINAPI DSoundRender_InputPin_BeginFlush(IPin * iface)
memset(buffer, 0, size); memset(buffer, 0, size);
IDirectSoundBuffer_Unlock(pFilter->dsbuffer, buffer, size, NULL, 0); IDirectSoundBuffer_Unlock(pFilter->dsbuffer, buffer, size, NULL, 0);
} }
if (pFilter->state == State_Paused)
SetEvent(pFilter->blocked);
LeaveCriticalSection(This->pin.pCritSec);
return hr;
}
static HRESULT WINAPI DSoundRender_InputPin_EndFlush(IPin * iface)
{
InputPin *This = (InputPin *)iface;
DSoundRenderImpl *pFilter = (DSoundRenderImpl *)This->pin.pinInfo.pFilter;
HRESULT hr;
TRACE("\n");
EnterCriticalSection(This->pin.pCritSec);
hr = InputPin_EndFlush(iface); hr = InputPin_EndFlush(iface);
if (pFilter->state == State_Paused)
SetEvent(pFilter->blocked);
LeaveCriticalSection(This->pin.pCritSec); LeaveCriticalSection(This->pin.pCritSec);
return hr; return hr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment