Module: wine Branch: master Commit: a0e8b97ffe470718a27dca98c674a3b61c16c213 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a0e8b97ffe470718a27dca98c6...
Author: Maarten Lankhorst m.b.lankhorst@gmail.com Date: Wed Apr 16 14:27:06 2008 -0700
quartz: Check for discontinuities in the directsound renderer.
---
dlls/quartz/dsoundrender.c | 37 +++++++++++++++++++++++++++++++------ 1 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c index a199e5f..50892c0 100644 --- a/dlls/quartz/dsoundrender.c +++ b/dlls/quartz/dsoundrender.c @@ -56,7 +56,7 @@ typedef struct DSoundRenderImpl LONG refCount; CRITICAL_SECTION csFilter; FILTER_STATE state; - REFERENCE_TIME rtStreamStart; + REFERENCE_TIME rtStreamStart, rtLastStop; IReferenceClock * pClock; FILTER_INFO filterInfo;
@@ -79,21 +79,38 @@ typedef struct DSoundRenderImpl long pan; } DSoundRenderImpl;
+/* Seeking is not needed for a renderer, rely on newsegment for the appropiate changes */ static HRESULT sound_mod_stop(IBaseFilter *iface) { - FIXME("(%p) stub\n", iface); + TRACE("(%p)\n", iface); return S_OK; }
static HRESULT sound_mod_start(IBaseFilter *iface) { - FIXME("(%p) stub\n", iface); + TRACE("(%p)\n", iface); + return S_OK; }
static HRESULT sound_mod_rate(IBaseFilter *iface) { - FIXME("(%p) stub\n", 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; }
@@ -224,23 +241,30 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
TRACE("%p %p\n", iface, pSample);
+ /* Slightly incorrect, Pause completes when a frame is received so we should signal + * pause completion here, but for sound receiving a single frame doesn't make sense + */ if (This->state == State_Paused) return S_FALSE;
if (This->state == State_Stopped) - return VFW_E_WRONG_STATE; + return S_FALSE;
hr = IMediaSample_GetPointer(pSample, &pbSrcStream); if (FAILED(hr)) { ERR("Cannot get pointer to sample data (%x)\n", hr); - return hr; + return hr; }
hr = IMediaSample_GetTime(pSample, &tStart, &tStop); if (FAILED(hr)) ERR("Cannot get sample time (%x)\n", hr);
+ if (This->rtLastStop != tStart && (IMediaSample_IsDiscontinuity(pSample) == S_FALSE)) + FIXME("Unexpected discontinuity: Last: %lld, tStart: %lld\n", This->rtLastStop, tStart); + This->rtLastStop = tStop; + cbSrcStream = IMediaSample_GetActualDataLength(pSample); TRACE("Sample data ptr = %p, size = %ld\n", pbSrcStream, cbSrcStream);
@@ -673,6 +697,7 @@ static HRESULT WINAPI DSoundRender_InputPin_ReceiveConnection(IPin * iface, IPin EnterCriticalSection(This->pin.pCritSec); { DSImpl = (DSoundRenderImpl*)This->pin.pinInfo.pFilter; + DSImpl->rtLastStop = -1;
if (This->pin.pConnectedTo) hr = VFW_E_ALREADY_CONNECTED;