--- dlls/winealsa.drv/mmdevdrv.c.orig	2012-02-07 00:55:55.000000000 +0200
+++ dlls/winealsa.drv/mmdevdrv.c	2012-02-07 22:38:58.000000000 +0200
@@ -350,14 +350,51 @@ static HRESULT alsa_enum_devices(EDataFl
     card = -1;
     *num = 0;
 
-    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));
+    void **hints, **n;
+    snd_pcm_stream_t stream2 = SND_PCM_STREAM_PLAYBACK;
+    char *name, *io;
+    const char *filter;
+    WCHAR *nameW;
+    DWORD len;
+
+    if (snd_device_name_hint(-1, "pcm", &hints) >= 0){
+        n = hints;
+        filter = stream2 == SND_PCM_STREAM_CAPTURE ? "Input" : "Output";
+        while (*n != NULL) {
+            name = snd_device_name_get_hint(*n, "NAME");
+            io = snd_device_name_get_hint(*n, "IOID");
+            /*Skip hw devices, it will be added later*/
+            if(strstr(name, ":") != NULL )
+                goto __end;
+            if (io != NULL && strcmp(io, filter) != 0)
+                goto __end;
+            if(alsa_try_open(name, stream)){
+                if(ids && keys){
+                    len = MultiByteToWideChar(CP_UNIXCP, 0, name, -1, NULL, 0);
+                    nameW = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+                    MultiByteToWideChar(CP_UNIXCP, 0, name, -1, nameW, len);
+                    ids[*num] = HeapAlloc(GetProcessHeap(), 0, len * sizeof(WCHAR));
+                    if(!ids[*num]){
+                        return E_OUTOFMEMORY;
+                    }
+                    memcpy(ids[*num], nameW, len * sizeof(WCHAR));
+                    keys[*num] = HeapAlloc(GetProcessHeap(), 0, len);
+                    if(!keys[*num]){
+                        HeapFree(GetProcessHeap(), 0, ids[*num]);
+                        return E_OUTOFMEMORY;
+                    }
+                    memcpy(keys[*num], name, len);
+                }
+            ++*num;
+            }
+
+            __end:
+            if (name != NULL)
+                free(name);
+            if (io != NULL)
+                free(io);
+            n++;
         }
-        ++*num;
     }
 
     for(err = snd_card_next(&card); card != -1 && err >= 0;
