On Mon, Feb 13, 2012 at 02:12:02PM +0100, joerg-cyril.hoe...@t-systems.com 
wrote:
> Bottom line IMHO:
> 1. Wine-1.4 MUST have a means to select something
>    other than "default" without recompiling.
> 2. Via registry or winecfg, I don't mind.
> 
> A stupid registry entry would be fine with me.

Here's a stupid registry entry patch. The paths are:
HKCU\Software\Wine\Drivers\winealsa.drv\ALSAOutputDevice
HKCU\Software\Wine\Drivers\winealsa.drv\ALSAInputDevice

If we can't reach a sensible consensus about device enumeration
sometime this week, I'll submit this to fix 1.4.

Andrew
>From 3fca39549abc2606c7e51420d69dd241a9877a12 Mon Sep 17 00:00:00 2001
From: Andrew Eikum <aei...@codeweavers.com>
Date: Mon, 13 Feb 2012 09:47:03 -0600
Subject: winealsa.drv: Optionally load default ALSA device names from the
 registry
To: wine-patches <wine-patc...@winehq.org>
Reply-To: wine-devel <wine-devel@winehq.org>,Andrew Eikum <aei...@codeweavers.com>
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="------------1.7.9"

This is a multi-part message in MIME format.
--------------1.7.9
Content-Type: text/plain; charset=UTF-8; format=fixed
Content-Transfer-Encoding: 8bit

---
 dlls/winealsa.drv/Makefile.in |    2 +-
 dlls/winealsa.drv/mmdevdrv.c  |   38 ++++++++++++++++++++++++++++++--------
 2 files changed, 31 insertions(+), 9 deletions(-)


--------------1.7.9
Content-Type: text/x-patch; name="0004-winealsa.drv-Optionally-load-default-ALSA-device-nam.patch"
Content-Transfer-Encoding: 8bit
Content-Disposition: inline; filename="0004-winealsa.drv-Optionally-load-default-ALSA-device-nam.patch"

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..c58427a 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -147,8 +147,7 @@ static CRITICAL_SECTION_DEBUG g_sessions_lock_debug =
 static CRITICAL_SECTION g_sessions_lock = { &g_sessions_lock_debug, -1, 0, 0, 0, 0 };
 static struct list g_sessions = LIST_INIT(g_sessions);
 
-static const WCHAR defaultW[] = {'d','e','f','a','u','l','t',0};
-static const char defname[] = "default";
+static const char ALSA_Default[] = "default";
 
 static const IAudioClientVtbl AudioClient_Vtbl;
 static const IAudioRenderClientVtbl AudioRenderClient_Vtbl;
@@ -345,28 +344,51 @@ static HRESULT alsa_enum_devices(EDataFlow flow, WCHAR **ids, char **keys,
 {
     snd_pcm_stream_t stream = (flow == eRender ? SND_PCM_STREAM_PLAYBACK :
         SND_PCM_STREAM_CAPTURE);
+    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 char ALSAOutputDevice[] = "ALSAOutputDevice";
+    static const char ALSAInputDevice[] = "ALSAInputDevice";
+    DWORD len;
     int err, card;
+    HKEY key;
+    const char *defname = ALSA_Default;
+    char reg_default[64];
 
-    card = -1;
     *num = 0;
 
+    if(RegOpenKeyW(HKEY_CURRENT_USER, drv_keyW, &key) == ERROR_SUCCESS){
+        DWORD size = sizeof(reg_default);
+        const char *value_name = (flow == eRender) ? ALSAOutputDevice : ALSAInputDevice;
+
+        if(RegQueryValueExA(key, value_name, 0, NULL,
+                    (BYTE*)reg_default, &size) == ERROR_SUCCESS){
+            defname = reg_default;
+            TRACE("Loaded ALSA device from registry: %s\n", defname);
+        }
+
+        RegCloseKey(key);
+    }
+
     if(alsa_try_open(defname, stream)){
         if(ids && keys){
-            *ids = HeapAlloc(GetProcessHeap(), 0, sizeof(defaultW));
-            memcpy(*ids, defaultW, sizeof(defaultW));
-            *keys = HeapAlloc(GetProcessHeap(), 0, sizeof(defname));
-            memcpy(*keys, defname, sizeof(defname));
+            len = MultiByteToWideChar(CP_UNIXCP, 0, defname, -1, NULL, 0);
+            *ids = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+            MultiByteToWideChar(CP_UNIXCP, 0, defname, -1, *ids, len);
+
+            *keys = HeapAlloc(GetProcessHeap(), 0, strlen(defname) + 1);
+            memcpy(*keys, defname, strlen(defname) + 1);
         }
         ++*num;
     }
 
+    card = -1;
     for(err = snd_card_next(&card); card != -1 && err >= 0;
             err = snd_card_next(&card)){
         char cardpath[64];
         char *cardname;
         WCHAR *cardnameW;
         snd_ctl_t *ctl;
-        DWORD len;
 
         sprintf(cardpath, "hw:%u", card);
 

--------------1.7.9--




Reply via email to