Rémi Bernon : qasf: Start/stop the WM reader in asf_reader_init/cleanup_stream.

Alexandre Julliard julliard at winehq.org
Sat Aug 13 14:20:31 CDT 2022


Module: wine
Branch: master
Commit: 8d369f42d7106a8623bbb446c7db9639b7027d23
URL:    https://gitlab.winehq.org/wine/wine/-/commit/8d369f42d7106a8623bbb446c7db9639b7027d23

Author: Rémi Bernon <rbernon at codeweavers.com>
Date:   Fri Aug  5 08:55:35 2022 +0200

qasf: Start/stop the WM reader in asf_reader_init/cleanup_stream.

---

 dlls/qasf/asfreader.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 63 insertions(+)

diff --git a/dlls/qasf/asfreader.c b/dlls/qasf/asfreader.c
index 935619bea4f..e127c91a92d 100644
--- a/dlls/qasf/asfreader.c
+++ b/dlls/qasf/asfreader.c
@@ -217,8 +217,30 @@ static HRESULT asf_reader_init_stream(struct strmbase_filter *iface)
             WARN("Failed to commit stream %u allocator, hr %#lx\n", i, hr);
             break;
         }
+
+        if (FAILED(hr = IPin_NewSegment(stream->source.pin.peer, 0, 0, 1)))
+        {
+            WARN("Failed to start stream %u new segment, hr %#lx\n", i, hr);
+            break;
+        }
     }
 
+    if (FAILED(hr))
+        return hr;
+
+    EnterCriticalSection(&filter->status_cs);
+    if (SUCCEEDED(hr = IWMReader_Start(filter->reader, 0, 0, 1, NULL)))
+    {
+        filter->status = -1;
+        while (filter->status != WMT_STARTED)
+            SleepConditionVariableCS(&filter->status_cv, &filter->status_cs, INFINITE);
+        hr = filter->result;
+    }
+    LeaveCriticalSection(&filter->status_cs);
+
+    if (FAILED(hr))
+        WARN("Failed to start WMReader %p, hr %#lx\n", filter->reader, hr);
+
     return hr;
 }
 
@@ -230,6 +252,19 @@ static HRESULT asf_reader_cleanup_stream(struct strmbase_filter *iface)
 
     TRACE("iface %p\n", iface);
 
+    EnterCriticalSection(&filter->status_cs);
+    if (SUCCEEDED(hr = IWMReader_Stop(filter->reader)))
+    {
+        filter->status = -1;
+        while (filter->status != WMT_STOPPED)
+            SleepConditionVariableCS(&filter->status_cv, &filter->status_cs, INFINITE);
+        hr = filter->result;
+    }
+    LeaveCriticalSection(&filter->status_cs);
+
+    if (FAILED(hr))
+        WARN("Failed to stop WMReader %p, hr %#lx\n", filter->reader, hr);
+
     for (i = 0; i < filter->stream_count; ++i)
     {
         struct asf_stream *stream = filter->streams + i;
@@ -506,6 +541,34 @@ static HRESULT WINAPI reader_callback_OnStatus(IWMReaderCallback *iface, WMT_STA
             WakeConditionVariable(&filter->status_cv);
             break;
 
+        case WMT_END_OF_STREAMING:
+            for (i = 0; i < filter->stream_count; ++i)
+            {
+                struct asf_stream *stream = filter->streams + i;
+
+                if (!stream->source.pin.peer)
+                    continue;
+
+                IPin_EndOfStream(stream->source.pin.peer);
+            }
+            break;
+
+        case WMT_STARTED:
+            EnterCriticalSection(&filter->status_cs);
+            filter->result = result;
+            filter->status = WMT_STARTED;
+            LeaveCriticalSection(&filter->status_cs);
+            WakeConditionVariable(&filter->status_cv);
+            break;
+
+        case WMT_STOPPED:
+            EnterCriticalSection(&filter->status_cs);
+            filter->result = result;
+            filter->status = WMT_STOPPED;
+            LeaveCriticalSection(&filter->status_cs);
+            WakeConditionVariable(&filter->status_cv);
+            break;
+
         default:
             WARN("Ignoring status %#x.\n", status);
             break;




More information about the wine-cvs mailing list