From d87283a9be8b89676d67dd7f8db4237df20c47d6 Mon Sep 17 00:00:00 2001 From: Maarten Lankhorst Date: Wed, 19 Mar 2008 18:27:07 -0700 Subject: [PATCH] quartz: Add critical sections to IMediaSeeking --- dlls/quartz/control.c | 50 ++++++++++++++++++++++++++++++---------- dlls/quartz/control_private.h | 4 ++- dlls/quartz/parser.c | 2 +- 3 files changed, 41 insertions(+), 15 deletions(-) diff --git a/dlls/quartz/control.c b/dlls/quartz/control.c index 5c7c547..2fd08a5 100644 --- a/dlls/quartz/control.c +++ b/dlls/quartz/control.c @@ -29,7 +29,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(quartz); -HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking) +HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect) { assert(fnChangeStop && fnChangeStart && fnChangeRate); @@ -47,6 +47,8 @@ HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, C pSeeking->llStop = ((ULONGLONG)0x80000000) << 32; pSeeking->llDuration = pSeeking->llStop - pSeeking->llStart; pSeeking->dRate = 1.0; + pSeeking->timeformat = TIME_FORMAT_MEDIA_TIME; + pSeeking->crst = crit_sect; return S_OK; } @@ -99,24 +101,29 @@ HRESULT WINAPI MediaSeekingImpl_QueryPreferredFormat(IMediaSeeking * iface, GUID HRESULT WINAPI MediaSeekingImpl_GetTimeFormat(IMediaSeeking * iface, GUID * pFormat) { + MediaSeekingImpl *This = (MediaSeekingImpl *)iface; TRACE("(%s)\n", qzdebugstr_guid(pFormat)); - *pFormat = TIME_FORMAT_MEDIA_TIME; + EnterCriticalSection(This->crst); + *pFormat = This->timeformat; + LeaveCriticalSection(This->crst); + return S_OK; } HRESULT WINAPI MediaSeekingImpl_IsUsingTimeFormat(IMediaSeeking * iface, const GUID * pFormat) { - TRACE("(%s)\n", qzdebugstr_guid(pFormat)); - - return (IsEqualIID(pFormat, &TIME_FORMAT_MEDIA_TIME) ? S_OK : S_FALSE); -} + MediaSeekingImpl *This = (MediaSeekingImpl *)iface; + HRESULT hr = S_OK; -HRESULT WINAPI MediaSeekingImpl_SetTimeFormat(IMediaSeeking * iface, const GUID * pFormat) -{ TRACE("(%s)\n", qzdebugstr_guid(pFormat)); - return (IsEqualIID(pFormat, &TIME_FORMAT_MEDIA_TIME) ? S_OK : S_FALSE); + EnterCriticalSection(This->crst); + if (!IsEqualIID(pFormat, &This->timeformat)) + hr = S_FALSE; + LeaveCriticalSection(This->crst); + + return hr; } HRESULT WINAPI MediaSeekingImpl_GetDuration(IMediaSeeking * iface, LONGLONG * pDuration) @@ -125,7 +132,9 @@ HRESULT WINAPI MediaSeekingImpl_GetDuration(IMediaSeeking * iface, LONGLONG * pD TRACE("(%p)\n", pDuration); + EnterCriticalSection(This->crst); *pDuration = This->llDuration; + LeaveCriticalSection(This->crst); return S_OK; } @@ -136,7 +145,9 @@ HRESULT WINAPI MediaSeekingImpl_GetStopPosition(IMediaSeeking * iface, LONGLONG TRACE("(%p)\n", pStop); + EnterCriticalSection(This->crst); *pStop = This->llStop; + LeaveCriticalSection(This->crst); return S_OK; } @@ -147,7 +158,9 @@ HRESULT WINAPI MediaSeekingImpl_GetCurrentPosition(IMediaSeeking * iface, LONGLO TRACE("(%p)\n", pCurrent); + EnterCriticalSection(This->crst); *pCurrent = This->llStart; + LeaveCriticalSection(This->crst); return S_OK; } @@ -188,6 +201,7 @@ HRESULT WINAPI MediaSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG * p TRACE("(%p, %x, %p, %x)\n", pCurrent, dwCurrentFlags, pStop, dwStopFlags); + EnterCriticalSection(This->crst); llNewStart = Adjust(This->llStart, pCurrent, dwCurrentFlags); llNewStop = Adjust(This->llStop, pStop, dwStopFlags); @@ -208,6 +222,7 @@ HRESULT WINAPI MediaSeekingImpl_SetPositions(IMediaSeeking * iface, LONGLONG * p This->fnChangeStart(This->pUserData); if (bChangeStop) This->fnChangeStop(This->pUserData); + LeaveCriticalSection(This->crst); return S_OK; } @@ -218,9 +233,11 @@ HRESULT WINAPI MediaSeekingImpl_GetPositions(IMediaSeeking * iface, LONGLONG * p TRACE("(%p, %p)\n", pCurrent, pStop); + EnterCriticalSection(This->crst); *pCurrent = This->llStart; *pStop = This->llStop; - + LeaveCriticalSection(This->crst); + return S_OK; } @@ -230,8 +247,10 @@ HRESULT WINAPI MediaSeekingImpl_GetAvailable(IMediaSeeking * iface, LONGLONG * p TRACE("(%p, %p)\n", pEarliest, pLatest); + EnterCriticalSection(This->crst); *pEarliest = 0; *pLatest = This->llDuration; + LeaveCriticalSection(This->crst); return S_OK; } @@ -240,14 +259,17 @@ HRESULT WINAPI MediaSeekingImpl_SetRate(IMediaSeeking * iface, double dRate) { MediaSeekingImpl *This = (MediaSeekingImpl *)iface; BOOL bChangeRate = (dRate != This->dRate); + HRESULT hr = S_OK; TRACE("(%e)\n", dRate); + EnterCriticalSection(This->crst); This->dRate = dRate; if (bChangeRate) - return This->fnChangeRate(This->pUserData); - else - return S_OK; + hr = This->fnChangeRate(This->pUserData); + LeaveCriticalSection(This->crst); + + return hr; } HRESULT WINAPI MediaSeekingImpl_GetRate(IMediaSeeking * iface, double * dRate) @@ -256,7 +278,9 @@ HRESULT WINAPI MediaSeekingImpl_GetRate(IMediaSeeking * iface, double * dRate) TRACE("(%p)\n", dRate); + EnterCriticalSection(This->crst); *dRate = This->dRate; + LeaveCriticalSection(This->crst); return S_OK; } diff --git a/dlls/quartz/control_private.h b/dlls/quartz/control_private.h index c594f60..80e550d 100644 --- a/dlls/quartz/control_private.h +++ b/dlls/quartz/control_private.h @@ -34,9 +34,11 @@ typedef struct MediaSeekingImpl LONGLONG llStart; LONGLONG llStop; LONGLONG llDuration; /* FIXME: needed? */ + GUID timeformat; + PCRITICAL_SECTION crst; } MediaSeekingImpl; -HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking); +HRESULT MediaSeekingImpl_Init(IBaseFilter *pUserData, CHANGEPROC fnChangeStop, CHANGEPROC fnChangeStart, CHANGEPROC fnChangeRate, MediaSeekingImpl * pSeeking, PCRITICAL_SECTION crit_sect); HRESULT WINAPI MediaSeekingImpl_GetCapabilities(IMediaSeeking * iface, DWORD * pCapabilities); HRESULT WINAPI MediaSeekingImpl_CheckCapabilities(IMediaSeeking * iface, DWORD * pCapabilities); diff --git a/dlls/quartz/parser.c b/dlls/quartz/parser.c index 1531431..868c625 100644 --- a/dlls/quartz/parser.c +++ b/dlls/quartz/parser.c @@ -80,7 +80,7 @@ HRESULT Parser_Create(ParserImpl* pParser, const CLSID* pClsid, PFN_PROCESS_SAMP piInput.pFilter = (IBaseFilter *)pParser; lstrcpynW(piInput.achName, wcsInputPinName, sizeof(piInput.achName) / sizeof(piInput.achName[0])); - MediaSeekingImpl_Init((IBaseFilter*)pParser, Parser_ChangeStop, Parser_ChangeStart, Parser_ChangeRate, &pParser->mediaSeeking); + MediaSeekingImpl_Init((IBaseFilter*)pParser, Parser_ChangeStop, Parser_ChangeStart, Parser_ChangeRate, &pParser->mediaSeeking, &pParser->csFilter); pParser->mediaSeeking.lpVtbl = &Parser_Seeking_Vtbl; hr = Parser_InputPin_Construct(&piInput, fnProcessSample, (LPVOID)pParser, fnQueryAccept, &pParser->csFilter, (IPin **)&pParser->pInputPin); -- 1.5.4.1