Allow configuration of output devices to use and change standard
output plugin requested to "default".

diff --git a/dlls/winmm/winealsa/Makefile.in b/dlls/winmm/winealsa/Makefile.in
index 1a830c4..5a15eba 100644
--- a/dlls/winmm/winealsa/Makefile.in
+++ b/dlls/winmm/winealsa/Makefile.in
@@ -3,7 +3,7 @@
 SRCDIR    = @srcdir@
 VPATH     = @srcdir@
 MODULE    = winealsa.drv
-IMPORTS   = winmm user32 kernel32 ntdll
+IMPORTS   = winmm user32 advapi32 kernel32 ntdll
 EXTRALIBS = -ldxguid -luuid @ALSALIBS@
 
 C_SRCS = \
diff --git a/dlls/winmm/winealsa/audio.c b/dlls/winmm/winealsa/audio.c
index 9881929..97cc22c 100644
--- a/dlls/winmm/winealsa/audio.c
+++ b/dlls/winmm/winealsa/audio.c
@@ -50,6 +50,7 @@
 #include "winerror.h"
 #include "winuser.h"
 #include "winnls.h"
+#include "winreg.h"
 #include "mmddk.h"
 #include "dsound.h"
 #include "dsdriver.h"
@@ -148,7 +149,7 @@
     WAVEOUTCAPSA		caps;
 
     /* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
-    char			device[32];
+    char*                      device;
     snd_pcm_t*                  p_handle;                 /* handle to ALSA playback device */
     snd_pcm_t*                  c_handle;                 /* handle to ALSA capture device */
     snd_pcm_hw_params_t *	hw_params;		/* ALSA Hw params */
@@ -192,7 +193,7 @@
     WAVEOUTCAPSA		caps;
 
     /* ALSA information (ALSA 0.9/1.x uses two different devices for playback/capture) */
-    char			device[32];
+    char*                      device;
     snd_pcm_t*                  p_handle;                 /* handle to ALSA playback device */
     snd_pcm_t*                  c_handle;                 /* handle to ALSA capture device */
     snd_pcm_hw_params_t *	hw_params;		/* ALSA Hw params */
@@ -471,7 +472,46 @@
 
 }
 
+/* return a string duplicated on the win32 process heap, free with HeapFree */
+static char* ALSA_strdup(char *s) {
+    char *result = HeapAlloc(GetProcessHeap(), 0, strlen(s)+1);
+    strcpy(result, s);
+    return result;
+}
 
+/******************************************************************
+ *             ALSA_GetDeviceFromReg
+ *
+ * Returns either "default" or reads the registry so the user can
+ * override the playback/record device used.
+ */
+char *ALSA_GetDeviceFromReg(char *value)
+{
+    DWORD res;
+    DWORD type;
+    HKEY playbackKey = 0;
+    char *result = NULL;
+    DWORD resultSize;
+
+    res = RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\\Wine\\Wine\\Config\\ALSA", 0, KEY_QUERY_VALUE, &playbackKey);
+    if (res != ERROR_SUCCESS) goto end;
+
+    res = RegQueryValueExA(playbackKey, value, NULL, &type, NULL, &resultSize);
+    if (res != ERROR_SUCCESS) goto end;
+
+    if (type != REG_SZ) {
+       ERR("Registry key [HKEY_LOCAL_MACHINE\\Software\\Wine\\Wine\\ALSA\\%s] must be a string\n", value);
+       goto end;
+    }
+
+    result = HeapAlloc(GetProcessHeap(), 0, resultSize);
+    res = RegQueryValueExA(playbackKey, value, NULL, NULL, result, &resultSize);
+
+end:
+    if (!result) result = ALSA_strdup("default");
+    if (playbackKey) RegCloseKey(playbackKey);
+    return result;
+}
 
 /******************************************************************
  *		ALSA_WaveInit
@@ -489,7 +529,9 @@
     wwo = &WOutDev[0];
 
     /* FIXME: use better values */
-    strcpy(wwo->device, "hw");
+    wwo->device = ALSA_GetDeviceFromReg("PlaybackDevice");
+    TRACE("using waveout device \"%s\"\n", wwo->device);
+
     wwo->caps.wMid = 0x0002;
     wwo->caps.wPid = 0x0104;
     strcpy(wwo->caps.szPname, "SB16 Wave Out");
@@ -597,7 +639,9 @@
     wwi = &WInDev[0];
 
     /* FIXME: use better values */
-    strcpy(wwi->device, "hw");
+    wwi->device = ALSA_GetDeviceFromReg("RecordDevice");
+    TRACE("using wavein device \"%s\"\n", wwi->device);
+
     wwi->caps.wMid = 0x0002;
     wwi->caps.wPid = 0x0104;
     strcpy(wwi->caps.szPname, "SB16 Wave In");
@@ -1513,6 +1557,8 @@
 	wwo->p_handle = NULL;
 
 	ret = wodNotifyClient(wwo, WOM_CLOSE, 0L, 0L);
+
+       HeapFree(GetProcessHeap(), 0, wwo->device);
     }
 
     HeapFree(GetProcessHeap(), 0, wwo->ufds);
@@ -2998,6 +3044,8 @@
 	wwi->p_handle = NULL;
 
 	ret = widNotifyClient(wwi, WIM_CLOSE, 0L, 0L);
+
+       HeapFree(GetProcessHeap(), 0, wwi->device);
     }
 
     HeapFree(GetProcessHeap(), 0, wwi->ufds);