[PATCH 2/2] quartz: Fix IMediaEventEx::SetNotifyFlags behavior.
Anton Baskanov
baskanov at gmail.com
Sun Feb 14 06:14:15 CST 2021
Signed-off-by: Anton Baskanov <baskanov at gmail.com>
---
dlls/quartz/filtergraph.c | 49 +++++++++++++++++++++++++--------
dlls/quartz/tests/filtergraph.c | 16 +++++------
2 files changed, 46 insertions(+), 19 deletions(-)
diff --git a/dlls/quartz/filtergraph.c b/dlls/quartz/filtergraph.c
index 58038829217..1ccb4f1b3d4 100644
--- a/dlls/quartz/filtergraph.c
+++ b/dlls/quartz/filtergraph.c
@@ -142,6 +142,17 @@ static BOOL EventsQueue_GetEvent(EventsQueue* omr, Event* evt, LONG msTimeOut)
return TRUE;
}
+static void EventsQueue_Clear(EventsQueue* omr)
+{
+ EnterCriticalSection(&omr->msg_crst);
+
+ omr->msg_toget = 0;
+ omr->msg_tosave = 0;
+ ResetEvent(omr->msg_event);
+
+ LeaveCriticalSection(&omr->msg_crst);
+}
+
#define MAX_ITF_CACHE_ENTRIES 3
typedef struct _ITF_CACHE_ENTRY {
const IID* riid;
@@ -1748,6 +1759,9 @@ static HRESULT graph_start(struct filter_graph *graph, REFERENCE_TIME stream_sta
graph->EcCompleteCount = 0;
update_render_count(graph);
+ if (graph->notif.disabled)
+ ResetEvent(graph->evqueue.msg_event);
+
if (graph->defaultclock && !graph->refClock)
IFilterGraph2_SetDefaultSyncSource(&graph->IFilterGraph2_iface);
@@ -4794,6 +4808,9 @@ static HRESULT WINAPI MediaEvent_GetEvent(IMediaEventEx *iface, LONG *lEventCode
return S_OK;
}
+ if (This->notif.disabled)
+ ResetEvent(This->evqueue.msg_event);
+
*lEventCode = 0;
return E_ABORT;
}
@@ -4890,6 +4907,9 @@ static HRESULT WINAPI MediaEvent_SetNotifyFlags(IMediaEventEx *iface, LONG lNoNo
This->notif.disabled = lNoNotifyFlags;
+ if (lNoNotifyFlags)
+ EventsQueue_Clear(&This->evqueue);
+
return S_OK;
}
@@ -5288,15 +5308,22 @@ static HRESULT WINAPI MediaEventSink_Notify(IMediaEventSink *iface, LONG EventCo
TRACE("Process EC_COMPLETE notification\n");
if (++This->EcCompleteCount == This->nRenderers)
{
- evt.lEventCode = EC_COMPLETE;
- evt.lParam1 = S_OK;
- evt.lParam2 = 0;
- TRACE("Send EC_COMPLETE to app\n");
- EventsQueue_PutEvent(&This->evqueue, &evt);
- if (!This->notif.disabled && This->notif.hWnd)
- {
- TRACE("Send Window message\n");
- PostMessageW(This->notif.hWnd, This->notif.msg, 0, This->notif.instance);
+ if (!This->notif.disabled)
+ {
+ evt.lEventCode = EC_COMPLETE;
+ evt.lParam1 = S_OK;
+ evt.lParam2 = 0;
+ TRACE("Send EC_COMPLETE to app\n");
+ EventsQueue_PutEvent(&This->evqueue, &evt);
+ if (This->notif.hWnd)
+ {
+ TRACE("Send Window message\n");
+ PostMessageW(This->notif.hWnd, This->notif.msg, 0, This->notif.instance);
+ }
+ }
+ else
+ {
+ SetEvent(This->evqueue.msg_event);
}
This->CompletionStatus = EC_COMPLETE;
This->got_ec_complete = 1;
@@ -5307,13 +5334,13 @@ static HRESULT WINAPI MediaEventSink_Notify(IMediaEventSink *iface, LONG EventCo
{
/* FIXME: Not handled yet */
}
- else
+ else if (!This->notif.disabled)
{
evt.lEventCode = EventCode;
evt.lParam1 = EventParam1;
evt.lParam2 = EventParam2;
EventsQueue_PutEvent(&This->evqueue, &evt);
- if (!This->notif.disabled && This->notif.hWnd)
+ if (This->notif.hWnd)
PostMessageW(This->notif.hWnd, This->notif.msg, 0, This->notif.instance);
}
diff --git a/dlls/quartz/tests/filtergraph.c b/dlls/quartz/tests/filtergraph.c
index c65d60d840d..faf12a8307e 100644
--- a/dlls/quartz/tests/filtergraph.c
+++ b/dlls/quartz/tests/filtergraph.c
@@ -5203,20 +5203,20 @@ static void test_set_notify_flags(void)
hr = IMediaEventEx_SetNotifyFlags(media_event, AM_MEDIAEVENT_NONOTIFY);
ok(hr == S_OK, "Got hr %#x.\n", hr);
- todo_wine ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
+ ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50);
- todo_wine ok(hr == E_ABORT, "Got hr %#x.\n", hr);
+ ok(hr == E_ABORT, "Got hr %#x.\n", hr);
hr = IMediaEventSink_Notify(media_event_sink, EC_STATUS, (LONG_PTR)"a", (LONG_PTR)"b");
ok(hr == S_OK, "Got hr %#x.\n", hr);
- todo_wine ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
+ ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
ok(!PeekMessageA(&msg, window, WM_USER, WM_USER, PM_REMOVE), "Window should not be notified.\n");
hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50);
- todo_wine ok(hr == E_ABORT, "Got hr %#x.\n", hr);
+ ok(hr == E_ABORT, "Got hr %#x.\n", hr);
hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK,
(LONG_PTR)&filter.IBaseFilter_iface);
@@ -5237,7 +5237,7 @@ static void test_set_notify_flags(void)
hr = IMediaControl_Run(media_control);
ok(hr == S_OK, "Got hr %#x.\n", hr);
- todo_wine ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
+ ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
hr = IMediaEventSink_Notify(media_event_sink, EC_COMPLETE, S_OK,
(LONG_PTR)&filter.IBaseFilter_iface);
@@ -5246,9 +5246,9 @@ static void test_set_notify_flags(void)
ok(WaitForSingleObject(event, 0) == 0, "Event should be signaled.\n");
hr = IMediaEventEx_GetEvent(media_event, &code, ¶m1, ¶m2, 50);
- todo_wine ok(hr == E_ABORT, "Got hr %#x.\n", hr);
+ ok(hr == E_ABORT, "Got hr %#x.\n", hr);
- todo_wine ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
+ ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
hr = IMediaEventEx_SetNotifyFlags(media_event, 0);
ok(hr == S_OK, "Got hr %#x.\n", hr);
@@ -5265,7 +5265,7 @@ static void test_set_notify_flags(void)
hr = IMediaEventEx_SetNotifyFlags(media_event, AM_MEDIAEVENT_NONOTIFY);
ok(hr == S_OK, "Got hr %#x.\n", hr);
- todo_wine ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
+ ok(WaitForSingleObject(event, 0) == WAIT_TIMEOUT, "Event should not be signaled.\n");
hr = IMediaControl_Stop(media_control);
ok(hr == S_OK, "Got hr %#x.\n", hr);
--
2.25.1
More information about the wine-devel
mailing list