[PATCH 1/2] mmdevapi: Add code to enumerate NOTPRESENT devices
Maarten Lankhorst
m.b.lankhorst at gmail.com
Thu Jan 7 02:46:42 CST 2010
---
dlls/mmdevapi/devenum.c | 55 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 50 insertions(+), 5 deletions(-)
diff --git a/dlls/mmdevapi/devenum.c b/dlls/mmdevapi/devenum.c
index 40e296e..91eb028 100644
--- a/dlls/mmdevapi/devenum.c
+++ b/dlls/mmdevapi/devenum.c
@@ -24,6 +24,8 @@
#define COBJMACROS
#include "windef.h"
#include "winbase.h"
+#include "winnls.h"
+#include "winreg.h"
#include "wine/debug.h"
#include "ole2.h"
@@ -33,6 +35,13 @@
WINE_DEFAULT_DEBUG_CHANNEL(mmdevapi);
+static const WCHAR software_wine_mmdevapi[] =
+ { 'S','o','f','t','w','a','r','e','\\','W','i','n','e','\\','m','m','d','e','v','a','p','i',0};
+static const WCHAR inputguidstr[] =
+ { 'I','n','p','u','t','G','u','i','d',0 };
+static const WCHAR outputguidstr[] =
+ { 'O','u','t','p','u','t','G','u','i','d',0 };
+
typedef struct MMDevEnumImpl
{
const IMMDeviceEnumeratorVtbl *lpVtbl;
@@ -41,27 +50,34 @@ typedef struct MMDevEnumImpl
static MMDevEnumImpl *MMDevEnumerator;
static const IMMDeviceEnumeratorVtbl MMDevEnumVtbl;
+static const IMMDeviceCollectionVtbl MMDevColVtbl;
typedef struct MMDevColImpl
{
const IMMDeviceCollectionVtbl *lpVtbl;
LONG ref;
- MMDevEnumImpl *parent;
EDataFlow flow;
DWORD state;
} MMDevColImpl;
-static const IMMDeviceCollectionVtbl MMDevColVtbl;
-static HRESULT MMDevCol_Create(IMMDeviceCollection **ppv, MMDevEnumImpl *parent, EDataFlow flow, DWORD state)
+/* Creates or updates the state of a device
+ * If GUID is null, a random guid will be assigned
+ */
+static void MMDevice_Create(WCHAR *name, GUID *guid, EDataFlow flow, DWORD state)
+{
+ FIXME("stub\n");
+}
+
+static HRESULT MMDevCol_Create(IMMDeviceCollection **ppv, EDataFlow flow, DWORD state)
{
MMDevColImpl *This;
+
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
*ppv = NULL;
if (!This)
return E_OUTOFMEMORY;
This->lpVtbl = &MMDevColVtbl;
This->ref = 1;
- This->parent = parent;
This->flow = flow;
This->state = state;
*ppv = (IMMDeviceCollection*)This;
@@ -143,6 +159,11 @@ HRESULT MMDevEnum_Create(REFIID riid, void **ppv)
if (!This)
{
+ DWORD len, i = 0;
+ HKEY root;
+ LONG ret;
+ WCHAR name[MAX_PATH];
+
This = HeapAlloc(GetProcessHeap(), 0, sizeof(*This));
*ppv = NULL;
if (!This)
@@ -150,6 +171,30 @@ HRESULT MMDevEnum_Create(REFIID riid, void **ppv)
This->ref = 1;
This->lpVtbl = &MMDevEnumVtbl;
MMDevEnumerator = This;
+
+ ret = RegOpenKeyExW(HKEY_CURRENT_USER, software_wine_mmdevapi, 0, KEY_READ, &root);
+ if (ret != ERROR_SUCCESS)
+ TRACE("Couldn't open key: %u\n", ret);
+ else do {
+ WCHAR guidvalue[39];
+ GUID guid;
+
+ len = sizeof(name);
+ ret = RegEnumKeyExW(root, i++, name, &len, NULL, NULL, NULL, NULL);
+ if (ret == ERROR_NO_MORE_ITEMS)
+ break;
+ if (ret != ERROR_SUCCESS)
+ continue;
+ len = sizeof(guidvalue);
+ ret = RegGetValueW(root, name, inputguidstr, RRF_RT_REG_SZ, NULL, guidvalue, &len);
+ if (ret == ERROR_SUCCESS && SUCCEEDED(CLSIDFromString(guidvalue, &guid)))
+ MMDevice_Create(name, &guid, eCapture, DEVICE_STATE_NOTPRESENT);
+ len = sizeof(guidvalue);
+ ret = RegGetValueW(root, name, outputguidstr, RRF_RT_REG_SZ, NULL, guidvalue, &len);
+ if (ret == ERROR_SUCCESS && SUCCEEDED(CLSIDFromString(guidvalue, &guid)))
+ MMDevice_Create(name, &guid, eRender, DEVICE_STATE_NOTPRESENT);
+ } while (1);
+ RegCloseKey(root);
}
return IUnknown_QueryInterface((IUnknown*)This, riid, ppv);
}
@@ -206,7 +251,7 @@ static HRESULT WINAPI MMDevEnum_EnumAudioEndpoints(IMMDeviceEnumerator *iface, E
return E_INVALIDARG;
if (mask & ~DEVICE_STATEMASK_ALL)
return E_INVALIDARG;
- return MMDevCol_Create(devices, This, flow, mask);
+ return MMDevCol_Create(devices, flow, mask);
}
static HRESULT WINAPI MMDevEnum_GetDefaultAudioEndpoint(IMMDeviceEnumerator *iface, EDataFlow flow, ERole role, IMMDevice **device)
--
1.6.6
More information about the wine-patches
mailing list