Andrew Eikum : winealsa.drv: Optionally load extra ALSA device names from the registry.
Alexandre Julliard
julliard at winehq.org
Wed Feb 15 13:14:04 CST 2012
Module: wine
Branch: master
Commit: 73cdf6530c2e463554194e11233c57251dc61a54
URL: http://source.winehq.org/git/wine.git/?a=commit;h=73cdf6530c2e463554194e11233c57251dc61a54
Author: Andrew Eikum <aeikum at codeweavers.com>
Date: Tue Feb 14 15:28:29 2012 -0600
winealsa.drv: Optionally load extra ALSA device names from the registry.
---
dlls/winealsa.drv/Makefile.in | 2 +-
dlls/winealsa.drv/mmdevdrv.c | 53 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 54 insertions(+), 1 deletions(-)
diff --git a/dlls/winealsa.drv/Makefile.in b/dlls/winealsa.drv/Makefile.in
index 336da8b..7086ce6 100644
--- a/dlls/winealsa.drv/Makefile.in
+++ b/dlls/winealsa.drv/Makefile.in
@@ -1,5 +1,5 @@
MODULE = winealsa.drv
-IMPORTS = uuid ole32
+IMPORTS = uuid ole32 advapi32
DELAYIMPORTS = winmm
EXTRALIBS = @ALSALIBS@
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 7621423..0f710a5 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -340,6 +340,57 @@ static HRESULT alsa_get_card_devices(snd_pcm_stream_t stream, WCHAR **ids, char
return S_OK;
}
+static void get_reg_devices(snd_pcm_stream_t stream, WCHAR **ids, char **keys,
+ UINT *num)
+{
+ static const WCHAR drv_keyW[] = {'S','o','f','t','w','a','r','e','\\',
+ 'W','i','n','e','\\','D','r','i','v','e','r','s','\\',
+ 'w','i','n','e','a','l','s','a','.','d','r','v',0};
+ static const WCHAR ALSAOutputDevices[] = {'A','L','S','A','O','u','t','p','u','t','D','e','v','i','c','e','s',0};
+ static const WCHAR ALSAInputDevices[] = {'A','L','S','A','I','n','p','u','t','D','e','v','i','c','e','s',0};
+ HKEY key;
+ WCHAR reg_devices[256];
+ DWORD size = sizeof(reg_devices), type, len;
+ const WCHAR *value_name = (stream == SND_PCM_STREAM_PLAYBACK) ? ALSAOutputDevices : ALSAInputDevices;
+
+ /* @@ Wine registry key: HKCU\Software\Wine\Drivers\winealsa.drv */
+ if(RegOpenKeyW(HKEY_CURRENT_USER, drv_keyW, &key) == ERROR_SUCCESS){
+ if(RegQueryValueExW(key, value_name, 0, &type,
+ (BYTE*)reg_devices, &size) == ERROR_SUCCESS){
+ WCHAR *p = reg_devices;
+
+ if(type != REG_MULTI_SZ){
+ ERR("Registry ALSA device list value type must be REG_MULTI_SZ\n");
+ RegCloseKey(key);
+ return;
+ }
+
+ while(*p){
+ char devname[64];
+
+ WideCharToMultiByte(CP_UNIXCP, 0, p, -1, devname, sizeof(devname), NULL, NULL);
+
+ if(alsa_try_open(devname, stream)){
+ if(ids && keys){
+ len = lstrlenW(p) + 1;
+ ids[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+ memcpy(ids[*num], p, len * sizeof(WCHAR));
+
+ len = strlen(devname) + 1;
+ keys[*num] = HeapAlloc(GetProcessHeap(), 0, len);
+ memcpy(keys[*num], devname, len);
+ }
+ ++*num;
+ }
+
+ p += lstrlenW(p) + 1;
+ }
+ }
+
+ RegCloseKey(key);
+ }
+}
+
static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, char **keys,
UINT *num)
{
@@ -360,6 +411,8 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, char **keys,
++*num;
}
+ get_reg_devices(stream, ids, keys, num);
+
for(err = snd_card_next(&card); card != -1 && err >= 0;
err = snd_card_next(&card)){
char cardpath[64];
More information about the wine-cvs
mailing list