Zebediah Figura : quartz: Return an error code if a filter reports an incorrect state.

Alexandre Julliard julliard at winehq.org
Wed Jul 15 16:44:44 CDT 2020


Module: wine
Branch: master
Commit: 9dd5aa17a0d1e53299599eb0f79800feb70cd8d6
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=9dd5aa17a0d1e53299599eb0f79800feb70cd8d6

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Tue Jul 14 19:56:25 2020 -0500

quartz: Return an error code if a filter reports an incorrect state.

Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/quartz/filtergraph.c       |  9 +++++++++
 dlls/quartz/tests/filtergraph.c | 45 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+)

diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 7319345931..273cd02110 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -4961,6 +4961,15 @@ static HRESULT WINAPI MediaFilter_GetState(IMediaFilter *iface, DWORD timeout, F
                 hr = VFW_S_STATE_INTERMEDIATE;
             else if (filter_hr != S_OK && filter_hr != VFW_S_STATE_INTERMEDIATE)
                 hr = filter_hr;
+
+            if (hr == S_OK && filter_state == State_Paused && graph->state != State_Paused)
+            {
+                async_filter = filter->filter;
+                hr = VFW_S_STATE_INTERMEDIATE;
+            }
+            else if (filter_state != graph->state && filter_state != State_Paused)
+                hr = E_FAIL;
+
             if (filter_state != graph->state)
                 ERR("Filter %p reported incorrect state %u.\n", filter->filter, filter_state);
         }
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index c0076191a8..99120133bb 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -3254,6 +3254,21 @@ static void test_filter_state(void)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Paused);
 
+    sink.state = State_Stopped;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == E_FAIL, "Got hr %#x.\n", hr);
+    ok(state == State_Paused, "Got state %u.\n", state);
+
+    sink.state = State_Running;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == E_FAIL, "Got hr %#x.\n", hr);
+    ok(state == State_Paused, "Got state %u.\n", state);
+
+    sink.state = State_Paused;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Paused, "Got state %u.\n", state);
+
     hr = IMediaControl_Stop(control);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Stopped);
@@ -3262,10 +3277,40 @@ static void test_filter_state(void)
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Running);
 
+    sink.state = State_Stopped;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == E_FAIL, "Got hr %#x.\n", hr);
+    ok(state == State_Running, "Got state %u.\n", state);
+
+    sink.state = State_Paused;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr);
+    ok(state == State_Running, "Got state %u.\n", state);
+
+    sink.state = State_Running;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Running, "Got state %u.\n", state);
+
     hr = IMediaControl_Stop(control);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Stopped);
 
+    sink.state = State_Running;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == E_FAIL, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+
+    sink.state = State_Paused;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == VFW_S_STATE_INTERMEDIATE, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+
+    sink.state = State_Stopped;
+    hr = IMediaControl_GetState(control, 0, &state);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(state == State_Stopped, "Got state %u.\n", state);
+
     hr = IMediaControl_Pause(control);
     ok(hr == S_OK, "Got hr %#x.\n", hr);
     check_filter_state(graph, State_Paused);




More information about the wine-cvs mailing list