[PATCH 14/32] quartz: Use IMediaSeekingPassThru for dsound renderer

Maarten Lankhorst m.b.lankhorst at gmail.com
Sat May 22 08:59:35 CDT 2010


Fix tiny deadlock wrt state changes too
---
 dlls/quartz/dsoundrender.c |  111 +++++++-------------------------------------
 1 files changed, 17 insertions(+), 94 deletions(-)

diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 8631cd5..043f328 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -54,6 +54,7 @@ typedef struct DSoundRenderImpl
     const IBasicAudioVtbl *IBasicAudio_vtbl;
     const IReferenceClockVtbl *IReferenceClock_vtbl;
     const IAMDirectSoundVtbl *IAMDirectSound_vtbl;
+    IUnknown *seekthru_unk;
 
     LONG refCount;
     CRITICAL_SECTION csFilter;
@@ -75,7 +76,6 @@ typedef struct DSoundRenderImpl
     DWORD in_loop;
 
     REFERENCE_TIME play_time;
-    MediaSeekingImpl mediaSeeking;
 
     HANDLE state_change, blocked;
 
@@ -83,41 +83,6 @@ typedef struct DSoundRenderImpl
     LONG pan;
 } DSoundRenderImpl;
 
-/* Seeking is not needed for a renderer, rely on newsegment for the appropriate changes */
-static HRESULT sound_mod_stop(IBaseFilter *iface)
-{
-    TRACE("(%p)\n", iface);
-    return S_OK;
-}
-
-static HRESULT sound_mod_start(IBaseFilter *iface)
-{
-    TRACE("(%p)\n", iface);
-
-    return S_OK;
-}
-
-static HRESULT sound_mod_rate(IBaseFilter *iface)
-{
-    DSoundRenderImpl *This = (DSoundRenderImpl *)iface;
-
-    WAVEFORMATEX *format = (WAVEFORMATEX*)This->pInputPin->pin.mtCurrent.pbFormat;
-    DWORD freq = format->nSamplesPerSec;
-    double rate = This->mediaSeeking.dRate;
-
-    freq = (DWORD)((double)freq * rate);
-
-    TRACE("(%p)\n", iface);
-
-    if (freq > DSBFREQUENCY_MAX)
-        return VFW_E_UNSUPPORTED_AUDIO;
-
-    if (freq < DSBFREQUENCY_MIN)
-        return VFW_E_UNSUPPORTED_AUDIO;
-
-    return S_OK;
-}
-
 static inline HRESULT DSoundRender_GetPos(DSoundRenderImpl *This, DWORD *pPlayPos, REFERENCE_TIME *pRefTime)
 {
     HRESULT hr;
@@ -319,6 +284,8 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
     hr = IMediaSample_GetTime(pSample, &tStart, &tStop);
     if (FAILED(hr))
         ERR("Cannot get sample time (%x)\n", hr);
+    else
+        MediaSeekingPassThru_RegisterMediaTime(This->seekthru_unk, tStart);
 
     if (This->rtLastStop != tStart && (IMediaSample_IsDiscontinuity(pSample) == S_FALSE))
         WARN("Unexpected discontinuity: Last: %u.%03u, tStart: %u.%03u\n",
@@ -352,6 +319,7 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
             LeaveCriticalSection(&This->csFilter);
             return S_OK;
         }
+        SetEvent(This->state_change);
     }
 
     cbSrcStream = IMediaSample_GetActualDataLength(pSample);
@@ -442,18 +410,19 @@ HRESULT DSoundRender_create(IUnknown * pUnkOuter, LPVOID * ppv)
 
     if (SUCCEEDED(hr))
     {
-        MediaSeekingImpl_Init((IBaseFilter*)pDSoundRender, sound_mod_stop, sound_mod_start, sound_mod_rate, &pDSoundRender->mediaSeeking, &pDSoundRender->csFilter);
-        pDSoundRender->mediaSeeking.lpVtbl = &IMediaSeeking_Vtbl;
-
+        ISeekingPassThru *passthru;
         pDSoundRender->state_change = CreateEventW(NULL, TRUE, TRUE, NULL);
-        pDSoundRender->blocked = CreateEventW(NULL, FALSE, FALSE, NULL);
-
-        if (!pDSoundRender->state_change || !pDSoundRender->blocked)
+        pDSoundRender->blocked = CreateEventW(NULL, TRUE, TRUE, NULL);
+        hr = CoCreateInstance(&CLSID_SeekingPassThru, (IUnknown*)pDSoundRender, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&pDSoundRender->seekthru_unk);
+        if (!pDSoundRender->state_change || !pDSoundRender->blocked || FAILED(hr))
         {
             IUnknown_Release((IUnknown *)pDSoundRender);
             return HRESULT_FROM_WIN32(GetLastError());
         }
 
+        IUnknown_QueryInterface(pDSoundRender->seekthru_unk, &IID_ISeekingPassThru, (void**)&passthru);
+        ISeekingPassThru_Init(passthru, TRUE, (IPin*)pDSoundRender->pInputPin);
+        ISeekingPassThru_Release(passthru);
         *ppv = pDSoundRender;
     }
     else
@@ -488,7 +457,7 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri
     else if (IsEqualIID(riid, &IID_IReferenceClock))
         *ppv = &This->IReferenceClock_vtbl;
     else if (IsEqualIID(riid, &IID_IMediaSeeking))
-        *ppv = &This->mediaSeeking.lpVtbl;
+        return IUnknown_QueryInterface(This->seekthru_unk, riid, ppv);
     else if (IsEqualIID(riid, &IID_IAMDirectSound))
         *ppv = &This->IAMDirectSound_vtbl;
 
@@ -546,7 +515,8 @@ static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
 
         This->lpVtbl = NULL;
         This->IBasicAudio_vtbl = NULL;
-        
+        if (This->seekthru_unk)
+            IUnknown_Release(This->seekthru_unk);
         This->csFilter.DebugInfo->Spare[0] = 0;
         DeleteCriticalSection(&This->csFilter);
 
@@ -601,6 +571,7 @@ static HRESULT WINAPI DSoundRender_Stop(IBaseFilter * iface)
         /* Complete our transition */
         SetEvent(This->state_change);
         SetEvent(This->blocked);
+        MediaSeekingPassThru_ResetMediaTime(This->seekthru_unk);
     }
     LeaveCriticalSection(&This->csFilter);
     
@@ -967,6 +938,7 @@ static HRESULT WINAPI DSoundRender_InputPin_EndOfStream(IPin * iface)
         hr = IMediaEventSink_Notify(pEventSink, EC_COMPLETE, S_OK, 0);
         IMediaEventSink_Release(pEventSink);
     }
+    MediaSeekingPassThru_EOS(me->seekthru_unk);
     LeaveCriticalSection(This->pin.pCritSec);
 
     return hr;
@@ -1024,6 +996,7 @@ static HRESULT WINAPI DSoundRender_InputPin_EndFlush(IPin * iface)
     }
     hr = InputPin_EndFlush(iface);
     LeaveCriticalSection(This->pin.pCritSec);
+    MediaSeekingPassThru_ResetMediaTime(pFilter->seekthru_unk);
 
     return hr;
 }
@@ -1301,56 +1274,6 @@ static const IReferenceClockVtbl IReferenceClock_Vtbl =
     ReferenceClock_Unadvise
 };
 
-static inline DSoundRenderImpl *impl_from_IMediaSeeking( IMediaSeeking *iface )
-{
-    return (DSoundRenderImpl *)((char*)iface - FIELD_OFFSET(DSoundRenderImpl, mediaSeeking.lpVtbl));
-}
-
-static HRESULT WINAPI sound_seek_QueryInterface(IMediaSeeking * iface, REFIID riid, LPVOID * ppv)
-{
-    DSoundRenderImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_QueryInterface((IUnknown *)This, riid, ppv);
-}
-
-static ULONG WINAPI sound_seek_AddRef(IMediaSeeking * iface)
-{
-    DSoundRenderImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_AddRef((IUnknown *)This);
-}
-
-static ULONG WINAPI sound_seek_Release(IMediaSeeking * iface)
-{
-    DSoundRenderImpl *This = impl_from_IMediaSeeking(iface);
-
-    return IUnknown_Release((IUnknown *)This);
-}
-
-static const IMediaSeekingVtbl IMediaSeeking_Vtbl =
-{
-    sound_seek_QueryInterface,
-    sound_seek_AddRef,
-    sound_seek_Release,
-    MediaSeekingImpl_GetCapabilities,
-    MediaSeekingImpl_CheckCapabilities,
-    MediaSeekingImpl_IsFormatSupported,
-    MediaSeekingImpl_QueryPreferredFormat,
-    MediaSeekingImpl_GetTimeFormat,
-    MediaSeekingImpl_IsUsingTimeFormat,
-    MediaSeekingImpl_SetTimeFormat,
-    MediaSeekingImpl_GetDuration,
-    MediaSeekingImpl_GetStopPosition,
-    MediaSeekingImpl_GetCurrentPosition,
-    MediaSeekingImpl_ConvertTimeFormat,
-    MediaSeekingImpl_SetPositions,
-    MediaSeekingImpl_GetPositions,
-    MediaSeekingImpl_GetAvailable,
-    MediaSeekingImpl_SetRate,
-    MediaSeekingImpl_GetRate,
-    MediaSeekingImpl_GetPreroll
-};
-
 /*** IUnknown methods ***/
 static HRESULT WINAPI AMDirectSound_QueryInterface(IAMDirectSound *iface,
 						REFIID riid,
-- 
1.7.0.4


--------------080504020406000808070007--



More information about the wine-patches mailing list