diff --git a/dlls/winmm/winealsa/midi.c b/dlls/winmm/winealsa/midi.c
index e4486b4..95e84ee 100644
--- a/dlls/winmm/winealsa/midi.c
+++ b/dlls/winmm/winealsa/midi.c
@@ -156,149 +156,6 @@
 }
 
 /**************************************************************************
- * 			OSS_MidiInit				[internal]
- *
- * Initializes the MIDI devices information variables
- */
-LONG ALSA_MidiInit(void)
-{
-    static	BOOL	bInitDone = FALSE;
-    snd_seq_client_info_t *cinfo;
-    snd_seq_port_info_t *pinfo;
-    int count;
-
-    if (bInitDone)
-	return TRUE;
-
-    TRACE("Initializing the MIDI variables.\n");
-    bInitDone = TRUE;
-
-    /* try to open device */
-    if (midiOpenSeq(0) == -1) {
-	return TRUE;
-    }
-
-#if 0 /* Debug purpose */
-    snd_lib_error_set_handler(error_handler);
-#endif
-    
-    snd_seq_client_info_alloca(&cinfo);
-    snd_seq_port_info_alloca(&pinfo);
-    snd_seq_client_info_set_client(cinfo, -1);
-    while(snd_seq_query_next_client(midiSeq, cinfo) >= 0) {
-        snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
-	snd_seq_port_info_set_port(pinfo, -1);
-	count = 0;
-	while (snd_seq_query_next_port(midiSeq, pinfo) >= 0) {
-            int cap = snd_seq_port_info_get_capability(pinfo);
-	    int type = snd_seq_port_info_get_type(pinfo);
-	    if (cap & SND_SEQ_PORT_CAP_WRITE) {
-                TRACE("OUT (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo),
-				                snd_seq_client_info_get_name(cinfo),
-						snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel",
-						snd_seq_port_info_get_port(pinfo),
-						snd_seq_port_info_get_name(pinfo),
-						type);
-		
-		if (MODM_NumDevs >= MAX_MIDIOUTDRV)
-		    continue;
-		if (!type)
-	            continue;
-
-		memcpy(&MidiOutDev[MODM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t));
-		
-		/* Manufac ID. We do not have access to this with soundcard.h
-		 * Does not seem to be a problem, because in mmsystem.h only
-		 * Microsoft's ID is listed.
-		 */
-		MidiOutDev[MODM_NumDevs].caps.wMid = 0x00FF;
-		MidiOutDev[MODM_NumDevs].caps.wPid = 0x0001; 	/* FIXME Product ID  */
-		/* Product Version. We simply say "1" */
-		MidiOutDev[MODM_NumDevs].caps.vDriverVersion = 0x001;
-		MidiOutDev[MODM_NumDevs].caps.wChannelMask   = 0xFFFF;
-
-		/* FIXME Do we have this information?
-		 * Assuming the soundcards can handle
-		 * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but
-		 * not MIDICAPS_CACHE.
-		 */
-		MidiOutDev[MODM_NumDevs].caps.dwSupport      = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
-                strcpy(MidiOutDev[MODM_NumDevs].caps.szPname, snd_seq_client_info_get_name(cinfo));
-
-                MidiOutDev[MODM_NumDevs].caps.wTechnology = MIDI_AlsaToWindowsDeviceType(type);
-                MidiOutDev[MODM_NumDevs].caps.wVoices     = 16;
-
-                /* FIXME Is it possible to know the maximum
-                 * number of simultaneous notes of a soundcard ?
-                 * I believe we don't have this information, but
-                 * it's probably equal or more than wVoices
-                 */
-                MidiOutDev[MODM_NumDevs].caps.wNotes = 16;
-                MidiOutDev[MODM_NumDevs].bEnabled    = TRUE;
-
-	        TRACE("MidiOut[%d]\tname='%s' techn=%d voices=%d notes=%d chnMsk=%04x support=%ld\n"
-	      	      "\tALSA info: midi dev-type=%lx, capa=%lx\n",
-	      	      MODM_NumDevs, MidiOutDev[MODM_NumDevs].caps.szPname, MidiOutDev[MODM_NumDevs].caps.wTechnology,
-	      	      MidiOutDev[MODM_NumDevs].caps.wVoices, MidiOutDev[MODM_NumDevs].caps.wNotes,
-	              MidiOutDev[MODM_NumDevs].caps.wChannelMask, MidiOutDev[MODM_NumDevs].caps.dwSupport,
-	              (long)type, (long)0);
-
-		
-		MODM_NumDevs++;
-            }
-	    if (cap & SND_SEQ_PORT_CAP_READ) {
-                TRACE("IN  (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo),
-				                snd_seq_client_info_get_name(cinfo),
-						snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel",
-						snd_seq_port_info_get_port(pinfo),
-						snd_seq_port_info_get_name(pinfo),
-						type);
-		
-		if (MIDM_NumDevs >= MAX_MIDIINDRV)
-		    continue;
-		if (!type)
-		    continue;
-
-		memcpy(&MidiInDev[MIDM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t));
-		
-		/* Manufac ID. We do not have access to this with soundcard.h
-		 * Does not seem to be a problem, because in mmsystem.h only
-		 * Microsoft's ID is listed.
-		 */
-		MidiInDev[MIDM_NumDevs].caps.wMid = 0x00FF;
-		MidiInDev[MIDM_NumDevs].caps.wPid = 0x0001; 	/* FIXME Product ID  */
-		/* Product Version. We simply say "1" */
-		MidiInDev[MIDM_NumDevs].caps.vDriverVersion = 0x001;
-
-		/* FIXME Do we have this information?
-		 * Assuming the soundcards can handle
-		 * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but
-		 * not MIDICAPS_CACHE.
-		 */
-		MidiInDev[MIDM_NumDevs].caps.dwSupport      = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
-                strcpy(MidiInDev[MIDM_NumDevs].caps.szPname, snd_seq_client_info_get_name(cinfo));
-
-                MidiInDev[MIDM_NumDevs].state = 0;
-
-                TRACE("MidiIn [%d]\tname='%s' support=%ld\n"
-	      	      "\tALSA info: midi dev-type=%lx, capa=%lx\n",
-	              MIDM_NumDevs, MidiInDev[MIDM_NumDevs].caps.szPname, MidiInDev[MIDM_NumDevs].caps.dwSupport,
-	              (long)type, (long)0);
-
-		MIDM_NumDevs++;
-	    }
-	}
-    }
-
-    /* close file and exit */
-    midiCloseSeq();
-
-    TRACE("End\n");
-    
-    return TRUE;
-}
-
-/**************************************************************************
  * 			MIDI_NotifyClient			[internal]
  */
 static DWORD MIDI_NotifyClient(UINT wDevID, WORD wMsg,
@@ -1102,6 +959,150 @@
  *======================================================================*/
 
 /**************************************************************************
+ * ALSA_MidiInit				[internal]
+ *
+ * Initializes the MIDI devices information variables
+ */
+LONG ALSA_MidiInit(void)
+{
+#if defined(HAVE_ALSA) && ((SND_LIB_MAJOR == 0 && SND_LIB_MINOR >= 9) || SND_LIB_MAJOR >= 1)
+    static	BOOL	bInitDone = FALSE;
+    snd_seq_client_info_t *cinfo;
+    snd_seq_port_info_t *pinfo;
+    int count;
+
+    if (bInitDone)
+	return TRUE;
+
+    TRACE("Initializing the MIDI variables.\n");
+    bInitDone = TRUE;
+
+    /* try to open device */
+    if (midiOpenSeq(0) == -1) {
+	return TRUE;
+    }
+
+#if 0 /* Debug purpose */
+    snd_lib_error_set_handler(error_handler);
+#endif
+    
+    snd_seq_client_info_alloca(&cinfo);
+    snd_seq_port_info_alloca(&pinfo);
+    snd_seq_client_info_set_client(cinfo, -1);
+    while(snd_seq_query_next_client(midiSeq, cinfo) >= 0) {
+        snd_seq_port_info_set_client(pinfo, snd_seq_client_info_get_client(cinfo));
+	snd_seq_port_info_set_port(pinfo, -1);
+	count = 0;
+	while (snd_seq_query_next_port(midiSeq, pinfo) >= 0) {
+            int cap = snd_seq_port_info_get_capability(pinfo);
+	    int type = snd_seq_port_info_get_type(pinfo);
+	    if (cap & SND_SEQ_PORT_CAP_WRITE) {
+                TRACE("OUT (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo),
+				                snd_seq_client_info_get_name(cinfo),
+						snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel",
+						snd_seq_port_info_get_port(pinfo),
+						snd_seq_port_info_get_name(pinfo),
+						type);
+		
+		if (MODM_NumDevs >= MAX_MIDIOUTDRV)
+		    continue;
+		if (!type)
+	            continue;
+
+		memcpy(&MidiOutDev[MODM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t));
+		
+		/* Manufac ID. We do not have access to this with soundcard.h
+		 * Does not seem to be a problem, because in mmsystem.h only
+		 * Microsoft's ID is listed.
+		 */
+		MidiOutDev[MODM_NumDevs].caps.wMid = 0x00FF;
+		MidiOutDev[MODM_NumDevs].caps.wPid = 0x0001; 	/* FIXME Product ID  */
+		/* Product Version. We simply say "1" */
+		MidiOutDev[MODM_NumDevs].caps.vDriverVersion = 0x001;
+		MidiOutDev[MODM_NumDevs].caps.wChannelMask   = 0xFFFF;
+
+		/* FIXME Do we have this information?
+		 * Assuming the soundcards can handle
+		 * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but
+		 * not MIDICAPS_CACHE.
+		 */
+		MidiOutDev[MODM_NumDevs].caps.dwSupport      = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
+                strcpy(MidiOutDev[MODM_NumDevs].caps.szPname, snd_seq_client_info_get_name(cinfo));
+
+                MidiOutDev[MODM_NumDevs].caps.wTechnology = MIDI_AlsaToWindowsDeviceType(type);
+                MidiOutDev[MODM_NumDevs].caps.wVoices     = 16;
+
+                /* FIXME Is it possible to know the maximum
+                 * number of simultaneous notes of a soundcard ?
+                 * I believe we don't have this information, but
+                 * it's probably equal or more than wVoices
+                 */
+                MidiOutDev[MODM_NumDevs].caps.wNotes = 16;
+                MidiOutDev[MODM_NumDevs].bEnabled    = TRUE;
+
+	        TRACE("MidiOut[%d]\tname='%s' techn=%d voices=%d notes=%d chnMsk=%04x support=%ld\n"
+	      	      "\tALSA info: midi dev-type=%lx, capa=%lx\n",
+	      	      MODM_NumDevs, MidiOutDev[MODM_NumDevs].caps.szPname, MidiOutDev[MODM_NumDevs].caps.wTechnology,
+	      	      MidiOutDev[MODM_NumDevs].caps.wVoices, MidiOutDev[MODM_NumDevs].caps.wNotes,
+	              MidiOutDev[MODM_NumDevs].caps.wChannelMask, MidiOutDev[MODM_NumDevs].caps.dwSupport,
+	              (long)type, (long)0);
+
+		
+		MODM_NumDevs++;
+            }
+	    if (cap & SND_SEQ_PORT_CAP_READ) {
+                TRACE("IN  (%d:%s:%s:%d:%s:%x)\n",snd_seq_client_info_get_client(cinfo),
+				                snd_seq_client_info_get_name(cinfo),
+						snd_seq_client_info_get_type(cinfo) == SND_SEQ_USER_CLIENT ? "user" : "kernel",
+						snd_seq_port_info_get_port(pinfo),
+						snd_seq_port_info_get_name(pinfo),
+						type);
+		
+		if (MIDM_NumDevs >= MAX_MIDIINDRV)
+		    continue;
+		if (!type)
+		    continue;
+
+		memcpy(&MidiInDev[MIDM_NumDevs].addr, snd_seq_port_info_get_addr(pinfo), sizeof(snd_seq_addr_t));
+		
+		/* Manufac ID. We do not have access to this with soundcard.h
+		 * Does not seem to be a problem, because in mmsystem.h only
+		 * Microsoft's ID is listed.
+		 */
+		MidiInDev[MIDM_NumDevs].caps.wMid = 0x00FF;
+		MidiInDev[MIDM_NumDevs].caps.wPid = 0x0001; 	/* FIXME Product ID  */
+		/* Product Version. We simply say "1" */
+		MidiInDev[MIDM_NumDevs].caps.vDriverVersion = 0x001;
+
+		/* FIXME Do we have this information?
+		 * Assuming the soundcards can handle
+		 * MIDICAPS_VOLUME and MIDICAPS_LRVOLUME but
+		 * not MIDICAPS_CACHE.
+		 */
+		MidiInDev[MIDM_NumDevs].caps.dwSupport      = MIDICAPS_VOLUME|MIDICAPS_LRVOLUME;
+                strcpy(MidiInDev[MIDM_NumDevs].caps.szPname, snd_seq_client_info_get_name(cinfo));
+
+                MidiInDev[MIDM_NumDevs].state = 0;
+
+                TRACE("MidiIn [%d]\tname='%s' support=%ld\n"
+	      	      "\tALSA info: midi dev-type=%lx, capa=%lx\n",
+	              MIDM_NumDevs, MidiInDev[MIDM_NumDevs].caps.szPname, MidiInDev[MIDM_NumDevs].caps.dwSupport,
+	              (long)type, (long)0);
+
+		MIDM_NumDevs++;
+	    }
+	}
+    }
+
+    /* close file and exit */
+    midiCloseSeq();
+
+    TRACE("End\n");
+#endif
+    return TRUE;
+}
+
+/**************************************************************************
  * 			midMessage (WINEOSS.4)
  */
 DWORD WINAPI ALSA_midMessage(UINT wDevID, UINT wMsg, DWORD dwUser,
