Zebediah Figura : devenum: Implement IMoniker::BindToObject() for DMO devices.

Alexandre Julliard julliard at winehq.org
Fri Apr 17 16:12:55 CDT 2020


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

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Thu Apr 16 14:46:06 2020 -0500

devenum: Implement IMoniker::BindToObject() for DMO devices.

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

---

 dlls/devenum/Makefile.in       |  2 +-
 dlls/devenum/devenum_private.h | 17 ++---------
 dlls/devenum/mediacatenum.c    | 21 +++++++++++---
 dlls/devenum/tests/devenum.c   | 66 ++++++++++++++++++++++++++++++++++++------
 4 files changed, 78 insertions(+), 28 deletions(-)

diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in
index d563b9a83e..6ce1967a6d 100644
--- a/dlls/devenum/Makefile.in
+++ b/dlls/devenum/Makefile.in
@@ -1,5 +1,5 @@
 MODULE    = devenum.dll
-IMPORTS   = strmiids uuid ole32 oleaut32 avicap32 winmm user32 advapi32 dsound msdmo
+IMPORTS   = dmoguids strmiids uuid ole32 oleaut32 avicap32 winmm user32 advapi32 dsound msdmo
 DELAYIMPORTS = msvfw32
 
 EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h
index 43a5a0c50e..6bd3c7cac4 100644
--- a/dlls/devenum/devenum_private.h
+++ b/dlls/devenum/devenum_private.h
@@ -22,21 +22,10 @@
  * - Private file where devenum globals are declared
  */
 
-#include <stdarg.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "wingdi.h"
-#include "winuser.h"
-#include "winreg.h"
-#include "winerror.h"
-
 #define COBJMACROS
-
-#include "ole2.h"
-#include "strmif.h"
-#include "olectl.h"
-#include "uuids.h"
+#include "dshow.h"
+#include "dmo.h"
+#include "dmodshow.h"
 
 /**********************************************************************
  * Dll lifetime tracking declaration for devenum.dll
diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c
index d0c4a303b5..c0006ad53e 100644
--- a/dlls/devenum/mediacatenum.c
+++ b/dlls/devenum/mediacatenum.c
@@ -23,9 +23,6 @@
  */
 
 #include "devenum_private.h"
-#include "oleauto.h"
-#include "ocidl.h"
-#include "dmoreg.h"
 
 #include "wine/debug.h"
 
@@ -393,9 +390,25 @@ static HRESULT WINAPI moniker_BindToObject(IMoniker *iface, IBindCtx *bind_ctx,
     if (!out)
         return E_POINTER;
 
-    VariantInit(&var);
     *out = NULL;
 
+    if (moniker->type == DEVICE_DMO)
+    {
+        IDMOWrapperFilter *wrapper;
+
+        if (FAILED(hr = CoCreateInstance(&CLSID_DMOWrapperFilter, NULL,
+                CLSCTX_INPROC_SERVER, &IID_IDMOWrapperFilter, (void **)&wrapper)))
+            return hr;
+
+        if (SUCCEEDED(hr = IDMOWrapperFilter_Init(wrapper, &moniker->clsid, &moniker->class)))
+        {
+            hr = IDMOWrapperFilter_QueryInterface(wrapper, iid, out);
+        }
+        IDMOWrapperFilter_Release(wrapper);
+        return hr;
+    }
+
+    VariantInit(&var);
     V_VT(&var) = VT_BSTR;
     if (FAILED(hr = IPropertyBag_Read(&moniker->IPropertyBag_iface, L"CLSID", &var, NULL)))
         return hr;
diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c
index decc53ff81..93692f75e6 100644
--- a/dlls/devenum/tests/devenum.c
+++ b/dlls/devenum/tests/devenum.c
@@ -20,20 +20,15 @@
 
 #define COBJMACROS
 
-#include <stdio.h>
-
-#include "wine/test.h"
 #include "initguid.h"
-#include "ole2.h"
-#include "strmif.h"
-#include "uuids.h"
-#include "vfwmsgs.h"
-#include "mmsystem.h"
+#include "dshow.h"
+#include "dmo.h"
+#include "dmodshow.h"
 #include "dsound.h"
 #include "mmddk.h"
 #include "vfw.h"
-#include "dmoreg.h"
 #include "setupapi.h"
+#include "wine/test.h"
 
 DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
 
@@ -603,10 +598,15 @@ static void test_dmo(void)
 {
     IParseDisplayName *parser;
     IPropertyBag *prop_bag;
+    IBaseFilter *filter;
+    IMediaObject *dmo;
+    IEnumDMO *enumdmo;
     WCHAR buffer[200];
     IMoniker *mon;
     VARIANT var;
+    WCHAR *name;
     HRESULT hr;
+    GUID clsid;
 
     hr = CoCreateInstance(&CLSID_CDeviceMoniker, NULL, CLSCTX_INPROC, &IID_IParseDisplayName, (void **)&parser);
     ok(hr == S_OK, "Failed to create ParseDisplayName: %#x\n", hr);
@@ -657,6 +657,54 @@ static void test_dmo(void)
     }
     IPropertyBag_Release(prop_bag);
     IMoniker_Release(mon);
+
+    hr = DMOEnum(&DMOCATEGORY_AUDIO_DECODER, 0, 0, NULL, 0, NULL, &enumdmo);
+    ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+    while (IEnumDMO_Next(enumdmo, 1, &clsid, &name, NULL) == S_OK)
+    {
+        wcscpy(buffer, L"@device:dmo:");
+        StringFromGUID2(&clsid, buffer + wcslen(buffer), CHARS_IN_GUID);
+        StringFromGUID2(&DMOCATEGORY_AUDIO_DECODER, buffer + wcslen(buffer), CHARS_IN_GUID);
+        mon = check_display_name(parser, buffer);
+        ok(find_moniker(&DMOCATEGORY_AUDIO_DECODER, mon), "DMO was not found.\n");
+
+        hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag);
+        ok(hr == S_OK, "Got hr %#x.\n", hr);
+
+        VariantClear(&var);
+        hr = IPropertyBag_Read(prop_bag, L"FriendlyName", &var, NULL);
+        ok(hr == S_OK, "got %#x\n", hr);
+        ok(!wcscmp(V_BSTR(&var), name), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
+
+        VariantClear(&var);
+        V_VT(&var) = VT_BSTR;
+        V_BSTR(&var) = SysAllocString(L"devenum test");
+        hr = IPropertyBag_Write(prop_bag, L"FriendlyName", &var);
+        ok(hr == E_ACCESSDENIED, "Write failed: %#x\n", hr);
+
+        VariantClear(&var);
+        hr = IPropertyBag_Read(prop_bag, L"CLSID", &var, NULL);
+        ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "got %#x\n", hr);
+
+        IPropertyBag_Release(prop_bag);
+        CoTaskMemFree(name);
+
+        hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter);
+        ok(hr == S_OK, "got %#x\n", hr);
+
+        hr = IBaseFilter_GetClassID(filter, &clsid);
+        ok(hr == S_OK, "got %#x\n", hr);
+        ok(IsEqualGUID(&clsid, &CLSID_DMOWrapperFilter), "Got CLSID %s.\n", debugstr_guid(&clsid));
+
+        hr = IBaseFilter_QueryInterface(filter, &IID_IMediaObject, (void **)&dmo);
+        ok(hr == S_OK, "got %#x\n", hr);
+        IMediaObject_Release(dmo);
+
+        IBaseFilter_Release(filter);
+    }
+    IEnumDMO_Release(enumdmo);
+
     IParseDisplayName_Release(parser);
 }
 




More information about the wine-cvs mailing list