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--