Maarten Lankhorst : quartz: Handle EndOfStream more elegantly in dsound renderer.
Alexandre Julliard
julliard at winehq.org
Tue Dec 14 10:55:42 CST 2010
Module: wine
Branch: master
Commit: 220d610b3da682c75343f07bed0688a7affd5801
URL: http://source.winehq.org/git/wine.git/?a=commit;h=220d610b3da682c75343f07bed0688a7affd5801
Author: Maarten Lankhorst <m.b.lankhorst at gmail.com>
Date: Fri Dec 10 16:06:57 2010 +0100
quartz: Handle EndOfStream more elegantly in dsound renderer.
---
dlls/quartz/dsoundrender.c | 47 ++++++++++++++++++++++++++++++++++---------
1 files changed, 37 insertions(+), 10 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 975eee1..f48cc77 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -226,6 +226,42 @@ end:
return S_OK;
}
+static HRESULT DSoundRender_HandleEndOfStream(DSoundRenderImpl *This)
+{
+ HRESULT hr;
+ IMediaEventSink *pEventSink;
+
+ while (1)
+ {
+ DWORD pos1, pos2;
+ DSoundRender_UpdatePositions(This, &pos1, &pos2);
+ if (pos1 == pos2)
+ break;
+
+ This->in_loop = 1;
+ LeaveCriticalSection(&This->filter.csFilter);
+ WaitForSingleObject(This->blocked, 10);
+ EnterCriticalSection(&This->filter.csFilter);
+ This->in_loop = 0;
+ if (This->pInputPin->flushing ||
+ This->filter.state != State_Running) {
+ SetEvent(This->state_change);
+ return S_FALSE;
+ }
+ }
+
+ if (!This->filter.filterInfo.pGraph)
+ return S_OK;
+
+ hr = IFilterGraph_QueryInterface(This->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
+ if (SUCCEEDED(hr))
+ {
+ hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)This);
+ IMediaEventSink_Release(pEventSink);
+ }
+ return hr;
+}
+
static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, REFERENCE_TIME tStart, REFERENCE_TIME tStop, const BYTE *data, DWORD size)
{
HRESULT hr;
@@ -875,7 +911,6 @@ static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface)
{
BaseInputPin* This = (BaseInputPin*)iface;
DSoundRenderImpl *me = (DSoundRenderImpl*)This->pin.pinInfo.pFilter;
- IMediaEventSink* pEventSink;
HRESULT hr;
EnterCriticalSection(This->pin.pCritSec);
@@ -889,15 +924,7 @@ static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface)
return hr;
}
- if (me->filter.filterInfo.pGraph)
- {
- hr = IFilterGraph_QueryInterface(me->filter.filterInfo.pGraph, &IID_IMediaEventSink, (LPVOID*)&pEventSink);
- if (SUCCEEDED(hr))
- {
- hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, (LONG_PTR)me);
- IMediaEventSink_Release(pEventSink);
- }
- }
+ hr = DSoundRender_HandleEndOfStream(me);
MediaSeekingPassThru_EOS(me->seekthru_unk);
SetEvent(me->state_change);
LeaveCriticalSection(This->pin.pCritSec);
More information about the wine-cvs
mailing list