Zebediah Figura : winegstreamer: Implement IWMReader::Open().

Alexandre Julliard julliard at winehq.org
Tue Nov 9 15:55:05 CST 2021


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

Author: Zebediah Figura <zfigura at codeweavers.com>
Date:   Mon Nov  8 15:24:32 2021 -0600

winegstreamer: Implement IWMReader::Open().

Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/winegstreamer/wm_asyncreader.c | 19 +++++++++++---
 dlls/wmvcore/tests/wmvcore.c        | 49 +++++++++++++++++++++++++++++++++++++
 2 files changed, 64 insertions(+), 4 deletions(-)

diff --git a/dlls/winegstreamer/wm_asyncreader.c b/dlls/winegstreamer/wm_asyncreader.c
index 4193d7d75de..b7b96c8b884 100644
--- a/dlls/winegstreamer/wm_asyncreader.c
+++ b/dlls/winegstreamer/wm_asyncreader.c
@@ -188,11 +188,22 @@ static ULONG WINAPI WMReader_Release(IWMReader *iface)
     return IWMProfile3_Release(&reader->reader.IWMProfile3_iface);
 }
 
-static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url, IWMReaderCallback *callback, void *context)
+static HRESULT WINAPI WMReader_Open(IWMReader *iface, const WCHAR *url,
+        IWMReaderCallback *callback, void *context)
 {
-    struct async_reader *This = impl_from_IWMReader(iface);
-    FIXME("(%p)->(%s %p %p)\n", This, debugstr_w(url), callback, context);
-    return E_NOTIMPL;
+    struct async_reader *reader = impl_from_IWMReader(iface);
+    HRESULT hr;
+
+    TRACE("reader %p, url %s, callback %p, context %p.\n",
+            reader, debugstr_w(url), callback, context);
+
+    EnterCriticalSection(&reader->reader.cs);
+
+    if (SUCCEEDED(hr = wm_reader_open_file(&reader->reader, url)))
+        open_stream(reader, callback, context);
+
+    LeaveCriticalSection(&reader->reader.cs);
+    return hr;
 }
 
 static HRESULT WINAPI WMReader_Close(IWMReader *iface)
diff --git a/dlls/wmvcore/tests/wmvcore.c b/dlls/wmvcore/tests/wmvcore.c
index f8962b784ac..591ecf209eb 100644
--- a/dlls/wmvcore/tests/wmvcore.c
+++ b/dlls/wmvcore/tests/wmvcore.c
@@ -1613,6 +1613,54 @@ static void test_async_reader_types(void)
     ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(filename), GetLastError());
 }
 
+static void test_async_reader_file(void)
+{
+    const WCHAR *filename = load_resource(L"test.wmv");
+    struct callback callback;
+    IWMReader *reader;
+    DWORD count;
+    HRESULT hr;
+    ULONG ref;
+    BOOL ret;
+
+    callback_init(&callback);
+
+    hr = WMCreateReader(NULL, 0, &reader);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IWMReader_Open(reader, filename, &callback.IWMReaderCallback_iface, (void **)0xdeadbeef);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(callback.refcount > 1, "Got refcount %d.\n", callback.refcount);
+    ret = WaitForSingleObject(callback.got_opened, 1000);
+    ok(!ret, "Wait timed out.\n");
+
+    count = 0xdeadbeef;
+    hr = IWMReader_GetOutputCount(reader, &count);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(count == 2, "Got count %u.\n", count);
+
+    hr = IWMReader_Start(reader, 0, 0, 1.0f, (void *)0xfacade);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    hr = IWMReader_Close(reader);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+    ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
+    ok(callback.refcount == 1, "Got outstanding refcount %d.\n", callback.refcount);
+    callback_cleanup(&callback);
+
+    hr = IWMReader_Close(reader);
+    ok(hr == NS_E_INVALID_REQUEST, "Got hr %#x.\n", hr);
+
+    ref = IWMReader_Release(reader);
+    ok(!ref, "Got outstanding refcount %d.\n", ref);
+    ok(callback.got_closed == 1, "Got %u WMT_CLOSED callbacks.\n", callback.got_closed);
+    ok(callback.refcount == 1, "Got outstanding refcount %d.\n", callback.refcount);
+    callback_cleanup(&callback);
+
+    ret = DeleteFileW(filename);
+    ok(ret, "Failed to delete %s, error %u.\n", debugstr_w(filename), GetLastError());
+}
+
 START_TEST(wmvcore)
 {
     HRESULT hr;
@@ -1634,6 +1682,7 @@ START_TEST(wmvcore)
     test_sync_reader_file();
     test_async_reader_streaming();
     test_async_reader_types();
+    test_async_reader_file();
 
     CoUninitialize();
 }




More information about the wine-cvs mailing list