Chris Robinson : quartz: Stop DSound buffer playback when the filter is paused or stopped, not the next time it's processed.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Mar 12 08:28:31 CDT 2007


Module: wine
Branch: master
Commit: 868dd534e850a11241818d8ad53ff6b318a45bfe
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=868dd534e850a11241818d8ad53ff6b318a45bfe

Author: Chris Robinson <chris.kcat at gmail.com>
Date:   Sat Mar 10 04:09:43 2007 -0800

quartz: Stop DSound buffer playback when the filter is paused or stopped, not the next time it's processed.

---

 dlls/quartz/dsoundrender.c |   46 +++++++++++++++++++++++++++++++------------
 1 files changed, 33 insertions(+), 13 deletions(-)

diff --git a/dlls/quartz/dsoundrender.c b/dlls/quartz/dsoundrender.c
index 67ab550..7db6765 100644
--- a/dlls/quartz/dsoundrender.c
+++ b/dlls/quartz/dsoundrender.c
@@ -166,17 +166,6 @@ static HRESULT DSoundRender_SendSampleData(DSoundRenderImpl* This, LPBYTE data,
     DWORD size2;
     DWORD play_pos,buf_free;
 
-    if (This->state != State_Running) {
-        DWORD state;
-        if (SUCCEEDED(IDirectSoundBuffer_GetStatus(This->dsbuffer, &state))) {
-            if (state & DSBSTATUS_PLAYING) {
-                IDirectSoundBuffer_Stop(This->dsbuffer);
-                This->started = FALSE;
-            }
-        }
-        return S_OK;
-    }
-
     while (1)
     {
         hr = IDirectSoundBuffer_GetCurrentPosition(This->dsbuffer, &play_pos, NULL);
@@ -241,6 +230,9 @@ static HRESULT DSoundRender_Sample(LPVOID iface, IMediaSample * pSample)
     HRESULT hr;
 
     TRACE("%p %p\n", iface, pSample);
+
+    if (This->state != State_Running)
+        return VFW_E_WRONG_STATE;
     
     hr = IMediaSample_GetPointer(pSample, &pbSrcStream);
     if (FAILED(hr))
@@ -452,7 +444,21 @@ static HRESULT WINAPI DSoundRender_Stop(IBaseFilter * iface)
 
     EnterCriticalSection(&This->csFilter);
     {
-        This->state = State_Stopped;
+        DWORD state = 0;
+        if (This->dsbuffer)
+        {
+            hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state);
+            if (SUCCEEDED(hr))
+            {
+                if (state & DSBSTATUS_PLAYING)
+                    hr = IDirectSoundBuffer_Stop(This->dsbuffer);
+            }
+        }
+        if (SUCCEEDED(hr))
+        {
+            This->started = FALSE;
+            This->state = State_Stopped;
+        }
     }
     LeaveCriticalSection(&This->csFilter);
     
@@ -468,7 +474,21 @@ static HRESULT WINAPI DSoundRender_Pause(IBaseFilter * iface)
 
     EnterCriticalSection(&This->csFilter);
     {
-        This->state = State_Paused;
+        DWORD state = 0;
+        if (This->dsbuffer)
+        {
+            hr = IDirectSoundBuffer_GetStatus(This->dsbuffer, &state);
+            if (SUCCEEDED(hr))
+            {
+                if (state & DSBSTATUS_PLAYING)
+                    hr = IDirectSoundBuffer_Stop(This->dsbuffer);
+            }
+        }
+        if (SUCCEEDED(hr))
+        {
+            This->started = FALSE;
+            This->state = State_Paused;
+        }
     }
     LeaveCriticalSection(&This->csFilter);
 




More information about the wine-cvs mailing list