Nikolay Sivov : mfplat/tests: Get source events in async mode.
Alexandre Julliard
julliard at winehq.org
Fri Jan 8 15:04:54 CST 2021
Module: wine
Branch: master
Commit: f72f1ff9529e3c340f639fc9509011a7933fece8
URL: https://source.winehq.org/git/wine.git/?a=commit;h=f72f1ff9529e3c340f639fc9509011a7933fece8
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Fri Jan 8 17:42:34 2021 +0300
mfplat/tests: Get source events in async mode.
Fixes test crashes on Windows 7, that happen on synchronous GetEvent().
Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mfplat/tests/mfplat.c | 95 ++++++++++++++++++++++++++++++++--------------
1 file changed, 67 insertions(+), 28 deletions(-)
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index b361d4da162..77ac299c918 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -191,6 +191,7 @@ struct test_callback
IMFAsyncCallback IMFAsyncCallback_iface;
HANDLE event;
DWORD param;
+ IMFMediaEvent *media_event;
};
static struct test_callback *impl_from_IMFAsyncCallback(IMFAsyncCallback *iface)
@@ -420,38 +421,77 @@ static const IMFAsyncCallbackVtbl test_create_from_file_handler_callback_vtbl =
test_create_from_file_handler_callback_Invoke,
};
+static HRESULT WINAPI source_events_callback_Invoke(IMFAsyncCallback *iface, IMFAsyncResult *result)
+{
+ struct test_callback *callback = impl_from_IMFAsyncCallback(iface);
+ IMFMediaEventGenerator *generator;
+ HRESULT hr;
+
+ ok(!!result, "Unexpected result object.\n");
+
+ generator = (IMFMediaEventGenerator *)IMFAsyncResult_GetStateNoAddRef(result);
+
+ hr = IMFMediaEventGenerator_EndGetEvent(generator, result, &callback->media_event);
+ ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr);
+
+ SetEvent(callback->event);
+
+ return S_OK;
+}
+
+static const IMFAsyncCallbackVtbl events_callback_vtbl =
+{
+ testcallback_QueryInterface,
+ testcallback_AddRef,
+ testcallback_Release,
+ testcallback_GetParameters,
+ source_events_callback_Invoke,
+};
+
static BOOL get_event(IMFMediaEventGenerator *generator, MediaEventType expected_event_type, PROPVARIANT *value)
{
+ struct test_callback callback = { 0 };
MediaEventType event_type;
- HRESULT hr, event_status;
- IMFMediaEvent *event;
+ BOOL ret = FALSE;
+ HRESULT hr;
- hr = IMFMediaEventGenerator_GetEvent(generator, 0, &event);
- ok(hr == S_OK, "Failed to get event, hr %#x.\n", hr);
+ callback.IMFAsyncCallback_iface.lpVtbl = &events_callback_vtbl;
+ callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
- hr = IMFMediaEvent_GetStatus(event, &event_status);
- ok(hr == S_OK, "Failed to get status code, hr %#x.\n", hr);
- ok(event_status == S_OK, "Unexpected event status code %#x.\n", event_status);
+ for (;;)
+ {
+ hr = IMFMediaEventGenerator_BeginGetEvent(generator, &callback.IMFAsyncCallback_iface,
+ (IUnknown *)generator);
+ ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
- hr = IMFMediaEvent_GetType(event, &event_type);
- ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr);
- ok(event_type == expected_event_type, "Unexpected event type %u, expected %u.\n", event_type, expected_event_type);
+ if (WaitForSingleObject(callback.event, 1000) == WAIT_TIMEOUT)
+ {
+ ok(0, "timeout\n");
+ break;
+ }
- if (event_type != expected_event_type)
- {
- IMFMediaEvent_Release(event);
- return FALSE;
- }
+ Sleep(10);
- if (value)
- {
- hr = IMFMediaEvent_GetValue(event, value);
- ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
+ hr = IMFMediaEvent_GetType(callback.media_event, &event_type);
+ ok(hr == S_OK, "Failed to event type, hr %#x.\n", hr);
+
+ if ((ret = (event_type == expected_event_type)))
+ {
+ if (value)
+ {
+ hr = IMFMediaEvent_GetValue(callback.media_event, value);
+ ok(hr == S_OK, "Failed to get value of event, hr %#x.\n", hr);
+ }
+
+ break;
+ }
}
- IMFMediaEvent_Release(event);
+ CloseHandle(callback.event);
+ if (callback.media_event)
+ IMFMediaEvent_Release(callback.media_event);
- return TRUE;
+ return ret;
}
static void test_source_resolver(void)
@@ -612,14 +652,13 @@ todo_wine
hr = IMFMediaSource_Start(mediasource, descriptor, &GUID_NULL, &var);
ok(hr == S_OK, "Failed to start media source, hr %#x.\n", hr);
- get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var);
- ok(var.vt == VT_UNKNOWN, "Unexpected value type %u from MENewStream event.\n", var.vt);
- video_stream = (IMFMediaStream *)var.punkVal;
-
- get_event((IMFMediaEventGenerator *)mediasource, MESourceStarted, NULL);
+ video_stream = NULL;
+ if (get_event((IMFMediaEventGenerator *)mediasource, MENewStream, &var))
+ {
+ ok(var.vt == VT_UNKNOWN, "Unexpected value type.\n");
+ video_stream = (IMFMediaStream *)var.punkVal;
+ }
- /* Request samples, our file is 10 frames at 25fps */
- get_event((IMFMediaEventGenerator *)video_stream, MEStreamStarted, NULL);
sample_count = 10;
for (i = 0; i < sample_count; ++i)
More information about the wine-cvs
mailing list