[DEVENUM] Device enumeration fixes
Maarten Lankhorst
m.b.lankhorst at gmail.com
Wed May 18 09:39:39 CDT 2005
I've sent these before, but they still haven't been applied, it's needed
for final submission of vfwcapture though.
Last time they were seperated..
mediacatenum: Pass property bag to ipersistpropertybag, if supported.
createdevenum: Add vfwindex when enumerating devices, and make sure
every device has a unique registry key, so multiple devices with same
name are allowed.
-------------- next part --------------
Index: Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/devenum/Makefile.in,v
retrieving revision 1.11
diff -u -p -r1.11 Makefile.in
--- Makefile.in 9 May 2005 14:42:35 -0000 1.11
+++ Makefile.in 12 May 2005 09:49:51 -0000
@@ -5,7 +5,7 @@ VPATH = @srcdir@
MODULE = devenum.dll
IMPORTLIB = libdevenum.$(IMPLIBEXT)
IMPORTS = ole32 oleaut32 avicap32 winmm user32 advapi32 kernel32
-EXTRALIBS = -lstrmiids -luuid
+EXTRALIBS = -lstrmiids -luuid $(LIBUNICODE)
C_SRCS = \
createdevenum.c \
Index: createdevenum.c
===================================================================
RCS file: /home/wine/wine/dlls/devenum/createdevenum.c,v
retrieving revision 1.10
diff -u -p -r1.10 createdevenum.c
--- createdevenum.c 27 Apr 2005 11:07:55 -0000 1.10
+++ createdevenum.c 12 May 2005 09:49:51 -0000
@@ -30,6 +30,7 @@
#include "vfw.h"
#include "wine/debug.h"
+#include "wine/unicode.h"
#include "mmddk.h"
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
@@ -420,13 +421,17 @@ static HRESULT DEVENUM_CreateSpecialCate
if (SUCCEEDED(res))
for (i = 0; i < 10; i++)
{
- WCHAR szDeviceName[80], szDeviceVersion[80];
+ WCHAR szDeviceName[32], szDeviceVersion[32], szDevicePath[10];
if (capGetDriverDescriptionW ((WORD) i,
szDeviceName, sizeof(szDeviceName)/sizeof(WCHAR),
szDeviceVersion, sizeof(szDeviceVersion)/sizeof(WCHAR)))
{
IMoniker * pMoniker = NULL;
+ IPropertyBag * pPropBag = NULL;
+ WCHAR dprintf[] = { 'v','i','d','e','o','%','d',0 };
+ snprintfW(szDevicePath, sizeof(szDevicePath)/sizeof(WCHAR), dprintf, i);
+ /* The above code prevents 1 device with a different ID overwriting another */
rfp2.nMediaTypes = 1;
pTypes = CoTaskMemAlloc(rfp2.nMediaTypes * sizeof(REGPINTYPES));
@@ -436,7 +441,7 @@ static HRESULT DEVENUM_CreateSpecialCate
}
pTypes[0].clsMajorType = &MEDIATYPE_Video;
- pTypes[0].clsMinorType = &MEDIASUBTYPE_RGB24;
+ pTypes[0].clsMinorType = &MEDIASUBTYPE_None;
rfp2.lpMediaType = pTypes;
@@ -445,11 +450,19 @@ static HRESULT DEVENUM_CreateSpecialCate
szDeviceName,
&pMoniker,
&CLSID_VideoInputDeviceCategory,
- szDeviceName,
+ szDevicePath,
&rf2);
- /* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */
- if (pMoniker) IMoniker_Release(pMoniker);
+ if (pMoniker) {
+ OLECHAR wszVfwIndex[] = { 'V','F','W','I','n','d','e','x',0 };
+ VARIANT var;
+ V_VT(&var) = VT_I4;
+ V_UNION(&var, ulVal) = (ULONG)i;
+ res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag);
+ if (SUCCEEDED(res))
+ res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var);
+ IMoniker_Release(pMoniker);
+ }
if (i == iDefaultDevice) FIXME("Default device\n");
CoTaskMemFree(pTypes);
Index: mediacatenum.c
===================================================================
RCS file: /home/wine/wine/dlls/devenum/mediacatenum.c,v
retrieving revision 1.15
diff -u -p -r1.15 mediacatenum.c
--- mediacatenum.c 26 Apr 2005 08:15:38 -0000 1.15
+++ mediacatenum.c 12 May 2005 09:49:51 -0000
@@ -25,6 +25,7 @@
#include "devenum_private.h"
#include "vfwmsgs.h"
#include "oleauto.h"
+#include "ocidl.h"
#include "wine/debug.h"
@@ -431,7 +432,18 @@ static HRESULT WINAPI DEVENUM_IMediaCatM
if (pObj!=NULL)
{
/* get the requested interface from the loaded class */
- res= IUnknown_QueryInterface(pObj,riidResult,ppvResult);
+ res = S_OK;
+ if (pProp) {
+ HRESULT res2;
+ LPVOID ppv = NULL;
+ res2 = IUnknown_QueryInterface(pObj, &IID_IPersistPropertyBag, &ppv);
+ if (SUCCEEDED(res2)) {
+ res = IPersistPropertyBag_Load((IPersistPropertyBag *) ppv, pProp, NULL);
+ IPersistPropertyBag_Release((IPersistPropertyBag *) ppv);
+ }
+ }
+ if (SUCCEEDED(res))
+ res= IUnknown_QueryInterface(pObj,riidResult,ppvResult);
IUnknown_Release(pObj);
}
More information about the wine-patches
mailing list