Cosmetic fixes.
Changed way of allocation open mci drivers (array => list).
Started implementing mci command table resources.

diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index 4f97062..5413343 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -17,14 +17,9 @@
  *        and long term pointers to 16 bit space in here
  */
 
-#include <stdlib.h>
 #include <string.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <sys/ioctl.h>
 
 #include "winbase.h"
-#include "windef.h"
 #include "wine/winbase16.h"
 #include "heap.h"
 #include "user.h"
@@ -43,7 +38,7 @@
 LONG   WINAPI DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, 
 			       DWORD dwParam1, DWORD dwParam2);
 
-static LPWINE_MM_IDATA	lpFirstIData = 0;
+static LPWINE_MM_IDATA		lpFirstIData = NULL;
 
 /**************************************************************************
  * 			MULTIMEDIA_GetIData			[internal]
@@ -91,8 +86,7 @@
 	break;
     case DLL_PROCESS_DETACH:
 	iData = MULTIMEDIA_GetIData();
-	if (!iData) 	{ERR("Idata is NULL, please report\n"); return FALSE;}
-	{
+	if (iData) {
 	    LPWINE_MM_IDATA*	ppid;
 	    
 	    for (ppid = &lpFirstIData; *ppid; ppid = &(*ppid)->lpNextIData) {
@@ -101,6 +95,9 @@
 		    break;
 		}
 	    }
+	} else {
+	    ERR("Idata is NULL, please report\n"); 
+	    return FALSE;
 	}
 	/* FIXME: should also free content and resources allocated inside iData */
 	HeapFree(GetProcessHeap(), 0, iData);
@@ -145,7 +142,10 @@
 	break;
     case DLL_PROCESS_DETACH:
 	iData = MULTIMEDIA_GetIData();
-	if (!iData) 	{ERR("Idata is NULL, please report\n"); return FALSE;}
+	if (!iData) {
+	    ERR("Idata is NULL, please report\n"); 
+	    return FALSE;
+	}
 	FreeLibrary(iData->h16Module32);
 	break;
     case DLL_THREAD_ATTACH:
@@ -553,7 +553,7 @@
 /**************************************************************************
  * 				mmsystemGetVersion	[WINMM.134]
  */
-UINT WINAPI mmsystemGetVersion()
+UINT WINAPI mmsystemGetVersion(void)
 {
     return mmsystemGetVersion16();
 }
@@ -562,7 +562,7 @@
  * 				mmsystemGetVersion	[MMSYSTEM.5]
  * return value borrowed from Win95 winmm.dll ;)
  */
-UINT16 WINAPI mmsystemGetVersion16()
+UINT16 WINAPI mmsystemGetVersion16(void)
 {
     TRACE("3.10 (Win95?)\n");
     return 0x030a;
@@ -671,7 +671,7 @@
 /**************************************************************************
  * 				mixerGetNumDevs			[MMSYSTEM.800]
  */
-UINT16 WINAPI mixerGetNumDevs16() 
+UINT16 WINAPI mixerGetNumDevs16(void) 
 {
     return mixerGetNumDevs();
 }
@@ -1221,7 +1221,7 @@
 /**************************************************************************
  * 				auxGetNumDevs		[WINMM.22]
  */
-UINT WINAPI auxGetNumDevs()
+UINT WINAPI auxGetNumDevs(void)
 {
     return auxGetNumDevs16();
 }
@@ -1229,7 +1229,7 @@
 /**************************************************************************
  * 				auxGetNumDevs		[MMSYSTEM.350]
  */
-UINT16 WINAPI auxGetNumDevs16()
+UINT16 WINAPI auxGetNumDevs16(void)
 {
     UINT16	count;
 
@@ -1715,13 +1715,18 @@
  */
 DWORD WINAPI mciGetDriverData(UINT uDeviceID) 
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%04x)\n", uDeviceID);
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+
+    wmd = MCI_GetDriver(uDeviceID);
+
+    if (!wmd) {
 	WARN("Bad uDeviceID\n");
 	return 0L;
     }
     
-    return MCI_GetDrv(uDeviceID)->dwPrivate;
+    return wmd->dwPrivate;
 }
 
 /**************************************************************************
@@ -1737,13 +1742,18 @@
  */
 BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD data) 
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%04x, %08lx)\n", uDeviceID, data);
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+
+    wmd = MCI_GetDriver(uDeviceID);
+
+    if (!wmd) {
 	WARN("Bad uDeviceID\n");
 	return FALSE;
     }
     
-    MCI_GetDrv(uDeviceID)->dwPrivate = data;
+    wmd->dwPrivate = data;
     return TRUE;
 }
 
@@ -1754,35 +1764,35 @@
 {
     char            buf[200];
     OFSTRUCT        ofs;
-    HANDLE16        xhinst;
-    HRSRC16         hrsrc;
+    HRSRC16         hrsrc = 0;
     HGLOBAL16       hmem;
     LPSTR           segstr;
-    SEGPTR          xmem;
-    LPBYTE          lmem;
-    static UINT16   mcidevtype = 0;
     
     FIXME("(%04x, %s, %d): stub!\n", hinst, resname, type);
     if (!lstrcmpiA(resname, "core")) {
 	FIXME("(...,\"core\",...), have to use internal tables... (not there yet)\n");
 	return 0;
     }
-    return ++mcidevtype;
     /* if file exists "resname.mci", then load resource "resname" from it
      * otherwise directly from driver
      */
-    strcpy(buf,resname);
+    strcpy(buf, resname);
     strcat(buf, ".mci");
-    if (OpenFile(buf, &ofs, OF_EXIST) != HFILE_ERROR) {
-	xhinst = LoadLibrary16(buf);
-	if (xhinst > 32)
-	    hinst = xhinst;
-    } /* else use passed hinst */
     segstr = SEGPTR_STRDUP(resname);
-    hrsrc = FindResource16(hinst, SEGPTR_GET(segstr), type);
+
+    if (!type && OpenFile(buf, &ofs, OF_EXIST) != HFILE_ERROR) {
+	HANDLE16	xhinst = LoadLibrary16(buf);
+
+	if (xhinst > 32) {
+	    hrsrc = FindResource16(xhinst, SEGPTR_GET(segstr), 0x800a);
+	}
+    }
+    if (!hrsrc) {
+	hrsrc = FindResource16(hinst, SEGPTR_GET(segstr), 0x800a);
+    }
     SEGPTR_FREE(segstr);
     if (!hrsrc) {
-	WARN("no special commandlist found in resource\n");
+	WARN("no special commandlist found in resource (hinst=%04x)\n", hinst);
 	return MCI_NO_COMMAND_TABLE;
     }
     hmem = LoadResource16(hinst, hrsrc);
@@ -1790,16 +1800,32 @@
 	WARN("couldn't load resource??\n");
 	return MCI_NO_COMMAND_TABLE;
     }
-    xmem = WIN16_LockResource16(hmem);
-    if (!xmem) {
-	WARN("couldn't lock resource??\n");
-	FreeResource16(hmem);
-	return MCI_NO_COMMAND_TABLE;
+    if (TRACE_ON(mmsys)) {
+	SEGPTR          xmem;
+	LPBYTE          lmem, cmd;
+	
+	xmem = WIN16_LockResource16(hmem);
+	if (!xmem) {
+	    WARN("couldn't lock resource??\n");
+	} else {
+	    lmem = PTR_SEG_TO_LIN(xmem);
+	    TRACE("first resource entry is %s\n", (char*)lmem);
+	    /* parse resource, register stuff, return unique id */
+
+	    while (*lmem) {
+		while (*lmem) {
+		    cmd = lmem;
+		    lmem += strlen(lmem) + 1;
+		    TRACE("cmd='%s' %08lx %04x\n", cmd, *(LPDWORD)lmem, *(LPWORD)(lmem + sizeof(DWORD)));
+		    lmem += sizeof(DWORD) + sizeof(WORD);
+		}
+		lmem++;
+		TRACE("eoc %08lx %04x\n", *(LPDWORD)lmem, *(LPWORD)(lmem + sizeof(DWORD)));
+	    }
+	    TRACE("eot\n");
+	}
     }
-    lmem = PTR_SEG_TO_LIN(xmem);
-    TRACE("first resource entry is %s\n", (char*)lmem);
-    /* parse resource, register stuff, return unique id */
-    return ++mcidevtype;
+    return hmem;
 }
 
 /**************************************************************************
@@ -1808,6 +1834,8 @@
 BOOL16 WINAPI mciFreeCommandResource16(UINT16 uTable)
 {
     FIXME("(%04x) stub\n", uTable);
+
+    FreeResource16((HANDLE16)uTable);
     return 0;
 }
  
@@ -1880,18 +1908,19 @@
  */
 DWORD WINAPI mciSendCommand16(UINT16 wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
 {
-    DWORD	dwRet = MCIERR_UNRECOGNIZED_COMMAND;
+    DWORD		dwRet = MCIERR_UNRECOGNIZED_COMMAND;
+    LPWINE_MCIDRIVER	wmd;
 
     TRACE("(%04X, %s, %08lX, %08lX)\n", 
 	  wDevID, MCI_CommandToString(wMsg), dwParam1, dwParam2);
 
     switch (wMsg) {
     case MCI_OPEN:
-	switch (MCI_MapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, &dwParam2)) {
+	switch (MCI_MapMsg16To32A(0, wMsg, &dwParam2)) {
 	case MCI_MAP_OK:
 	case MCI_MAP_OKMEM:
 	    dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
-	    MCI_UnMapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, dwParam2);
+	    MCI_UnMapMsg16To32A(0, wMsg, dwParam2);
 	    break;
 	default: break; /* so that gcc does not bark */
 	}
@@ -1900,14 +1929,14 @@
 	if (wDevID == MCI_ALL_DEVICE_ID) {
 	    FIXME("unhandled MCI_ALL_DEVICE_ID\n");
 	    dwRet = MCIERR_CANNOT_USE_ALL;
-	} else if (!MCI_DevIDValid(wDevID)) {
+	} else if (!(wmd = MCI_GetDriver(wDevID))) {
 	    dwRet = MCIERR_INVALID_DEVICE_ID;
 	} else {
-	    switch (MCI_MapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, &dwParam2)) {
+	    switch (MCI_MapMsg16To32A(wmd->wType, wMsg, &dwParam2)) {
 	    case MCI_MAP_OK:
 	    case MCI_MAP_OKMEM:
 		dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
-		MCI_UnMapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, dwParam2);
+		MCI_UnMapMsg16To32A(wmd->wType, wMsg, dwParam2);
 		break;
 	    default: break; /* so that gcc does not bark */
 	    }
@@ -1954,32 +1983,9 @@
  */
 UINT16 WINAPI mciGetDeviceID16(LPCSTR lpstrName)
 {
-    UINT16	wDevID;
     TRACE("(\"%s\")\n", lpstrName);
 
-    if (!lpstrName)
-	return 0;
-    
-    if (!lstrcmpiA(lpstrName, "ALL"))
-	return MCI_ALL_DEVICE_ID;
-    
-    for (wDevID = MCI_FirstDevID(); MCI_DevIDValid(wDevID); wDevID = MCI_NextDevID(wDevID)) {
-	if (MCI_GetDrv(wDevID)->modp.wType) {
-	    FIXME("This is wrong for compound devices\n");
-	    /* FIXME: for compound devices, lpstrName is matched against 
-	     * the name of the file, not the name of the device... 
-	     */
-	    if (MCI_GetOpenDrv(wDevID)->lpstrDeviceType && 
-		strcmp(MCI_GetOpenDrv(wDevID)->lpstrDeviceType, lpstrName) == 0)
-		return wDevID;
-    
-	    if (MCI_GetOpenDrv(wDevID)->lpstrAlias && 
-		strcmp(MCI_GetOpenDrv(wDevID)->lpstrAlias, lpstrName) == 0)
-		return wDevID;
-	}
-    }
-    
-    return 0;
+    return MCI_GetDriverFromString(lpstrName);
 }
 
 /**************************************************************************
@@ -1987,7 +1993,7 @@
  */
 UINT WINAPI mciGetDeviceIDA(LPCSTR lpstrName)
 {
-    return mciGetDeviceID16(lpstrName);
+    return MCI_GetDriverFromString(lpstrName);
 }
 
 /**************************************************************************
@@ -1999,7 +2005,7 @@
     UINT	ret;
 
     lpstrName = HEAP_strdupWtoA(GetProcessHeap(), 0, lpwstrName);
-    ret = mciGetDeviceID16(lpstrName);
+    ret = MCI_GetDriverFromString(lpstrName);
     HeapFree(GetProcessHeap(), 0, lpstrName);
     return ret;
 }
@@ -2032,16 +2038,18 @@
  */
 BOOL16 WINAPI mciSetYieldProc16(UINT16 uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData)
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData);
 
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
 	WARN("Bad uDeviceID\n");
 	return FALSE;
     }
     
-    MCI_GetDrv(uDeviceID)->lpfnYieldProc = fpYieldProc;
-    MCI_GetDrv(uDeviceID)->dwYieldData   = dwYieldData;
-    MCI_GetDrv(uDeviceID)->bIs32         = FALSE;
+    wmd->lpfnYieldProc = fpYieldProc;
+    wmd->dwYieldData   = dwYieldData;
+    wmd->bIs32         = FALSE;
 
     return TRUE;
 }
@@ -2051,16 +2059,18 @@
  */
 BOOL WINAPI mciSetYieldProc(UINT uDeviceID, YIELDPROC fpYieldProc, DWORD dwYieldData)
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%u, %p, %08lx)\n", uDeviceID, fpYieldProc, dwYieldData);
 
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
 	WARN("Bad uDeviceID\n");
 	return FALSE;
     }
     
-    MCI_GetDrv(uDeviceID)->lpfnYieldProc = fpYieldProc;
-    MCI_GetDrv(uDeviceID)->dwYieldData   = dwYieldData;
-    MCI_GetDrv(uDeviceID)->bIs32         = TRUE;
+    wmd->lpfnYieldProc = fpYieldProc;
+    wmd->dwYieldData   = dwYieldData;
+    wmd->bIs32         = TRUE;
 
     return TRUE;
 }
@@ -2091,21 +2101,23 @@
  */
 YIELDPROC WINAPI mciGetYieldProc16(UINT16 uDeviceID, DWORD* lpdwYieldData)
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%u, %p)\n", uDeviceID, lpdwYieldData);
 
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
 	WARN("Bad uDeviceID\n");
 	return NULL;
     }
-    if (!MCI_GetDrv(uDeviceID)->lpfnYieldProc) {
+    if (!wmd->lpfnYieldProc) {
 	WARN("No proc set\n");
 	return NULL;
     }
-    if (MCI_GetDrv(uDeviceID)->bIs32) {
+    if (wmd->bIs32) {
 	WARN("Proc is 32 bit\n");
 	return NULL;
     }
-    return MCI_GetDrv(uDeviceID)->lpfnYieldProc;
+    return wmd->lpfnYieldProc;
 }
     
 /**************************************************************************
@@ -2113,21 +2125,23 @@
  */
 YIELDPROC WINAPI mciGetYieldProc(UINT uDeviceID, DWORD* lpdwYieldData)
 {
+    LPWINE_MCIDRIVER	wmd;
+
     TRACE("(%u, %p)\n", uDeviceID, lpdwYieldData);
 
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) {
+    if (!(wmd = MCI_GetDriver(uDeviceID))) {
 	WARN("Bad uDeviceID\n");
 	return NULL;
     }
-    if (!MCI_GetDrv(uDeviceID)->lpfnYieldProc) {
+    if (!wmd->lpfnYieldProc) {
 	WARN("No proc set\n");
 	return NULL;
     }
-    if (!MCI_GetDrv(uDeviceID)->bIs32) {
+    if (!wmd->bIs32) {
 	WARN("Proc is 32 bit\n");
 	return NULL;
     }
-    return MCI_GetDrv(uDeviceID)->lpfnYieldProc;
+    return wmd->lpfnYieldProc;
 }
 
 /**************************************************************************
@@ -2143,12 +2157,12 @@
  */
 HTASK WINAPI mciGetCreatorTask(UINT uDeviceID)
 {
-    HTASK	ret;
+    LPWINE_MCIDRIVER	wmd;
+    HTASK		ret;
 
     TRACE("(%u)\n", uDeviceID);
 
-    ret = (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0) ?
-	0 : MCI_GetDrv(uDeviceID)->hCreatorTask;
+    ret = (!(wmd = MCI_GetDriver(uDeviceID))) ? 0 : wmd->hCreatorTask;
 
     TRACE("=> %04x\n", ret);
     return ret;
@@ -2159,15 +2173,15 @@
  */
 UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID) 
 {
-    UINT16	ret = 0;
+    LPWINE_MCIDRIVER	wmd;
+    UINT16		ret = 0;
 
     /*    TRACE("(%04x)\n", uDeviceID); */
 
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
-	!MCI_GetDrv(uDeviceID)->lpfnYieldProc || MCI_GetDrv(uDeviceID)->bIs32) {
+    if (!(wmd = MCI_GetDriver(uDeviceID)) || wmd->lpfnYieldProc || wmd->bIs32) {
 	UserYield16();
     } else {
-	ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
+	ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData);
     }
 
     return ret;
@@ -2178,14 +2192,15 @@
  */
 UINT WINAPI mciDriverYield(UINT uDeviceID) 
 {
-    UINT	ret = 0;
+    LPWINE_MCIDRIVER	wmd;
+    UINT		ret = 0;
 
     TRACE("(%04x)\n", uDeviceID);
-    if (!MCI_DevIDValid(uDeviceID) || MCI_GetDrv(uDeviceID)->modp.wType == 0 ||
-	!MCI_GetDrv(uDeviceID)->lpfnYieldProc || !MCI_GetDrv(uDeviceID)->bIs32) {
+
+    if (!(wmd = MCI_GetDriver(uDeviceID)) || wmd->lpfnYieldProc || wmd->bIs32) {
 	UserYield16();
     } else {
-	ret = MCI_GetDrv(uDeviceID)->lpfnYieldProc(uDeviceID, MCI_GetDrv(uDeviceID)->dwYieldData);
+	ret = wmd->lpfnYieldProc(uDeviceID, wmd->dwYieldData);
     }
 
     return ret;
@@ -3882,7 +3897,7 @@
 /**************************************************************************
  * 				waveOutGetNumDevs		[MMSYSTEM.401]
  */
-UINT WINAPI waveOutGetNumDevs() 
+UINT WINAPI waveOutGetNumDevs(void) 
 {
     return waveOutGetNumDevs16();
 }
@@ -3890,12 +3905,11 @@
 /**************************************************************************
  * 				waveOutGetNumDevs		[WINMM.167]
  */
-UINT16 WINAPI waveOutGetNumDevs16()
+UINT16 WINAPI waveOutGetNumDevs16(void)
 {
     UINT16	count = 0;
     TRACE("waveOutGetNumDevs\n");
-    /* FIXME: I'm not sure MCI_FirstDevID() is correct */
-    count += wodMessage(MCI_FirstDevID(), WODM_GETNUMDEVS, 0L, 0L, 0L);
+    count += wodMessage(0, WODM_GETNUMDEVS, 0L, 0L, 0L);
     TRACE("waveOutGetNumDevs return %u \n", count);
     return count;
 }
@@ -3992,10 +4006,11 @@
 static UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize)
 {
     LPSTR	msgptr;
-    TRACE("(%04X, %p, %d);\n", 
-	  uError, lpText, uSize);
-    if ((lpText == NULL) || (uSize < 1)) return(FALSE);
+    TRACE("(%04X, %p, %d);\n", uError, lpText, uSize);
+
+    if ((lpText == NULL) || (uSize < 1)) return FALSE;
     lpText[0] = '\0';
+
     switch (uError) {
     case MMSYSERR_NOERROR:
 	msgptr = "The specified command was carried out.";
@@ -4065,7 +4080,7 @@
     UINT	ret = waveOutOpen16(&hwo16, uDeviceID, lpFormat, dwCallback, dwInstance,
 				    CALLBACK32CONV(dwFlags));
 
-    if (lphWaveOut) *lphWaveOut=hwo16;
+    if (lphWaveOut) *lphWaveOut = hwo16;
     return ret;
 }
 
@@ -4103,6 +4118,9 @@
     if (uDeviceID >= MAXWAVEDRIVERS)
 	uDeviceID = 0;
     while (uDeviceID < MAXWAVEDRIVERS) {
+	/* FIXME: dwUser parameter is wrong, it's not lpDesc->dwInstancen but
+	 * a pointer to a DWORD (see ms/ddkdoc/s2abc.htm)
+	 */
 	dwRet = wodMessage(uDeviceID, WODM_OPEN, 
 			   lpDesc->dwInstance, (DWORD)lpDesc, dwFlags);
 	if (dwRet == MMSYSERR_NOERROR) break;
@@ -4146,6 +4164,7 @@
 
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     dwRet = wodMessage(lpDesc->uDeviceID, WODM_CLOSE, lpDesc->dwInstance, 0L, 0L);
     USER_HEAP_FREE(hWaveOut);
     return dwRet;
@@ -4165,6 +4184,7 @@
     if (lpDesc == NULL) 
 	return MMSYSERR_INVALHANDLE;
     lpWaveOutHdr->reserved = (DWORD)lpWaveOutHdr;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_PREPARE, lpDesc->dwInstance, 
 		      (DWORD)lpWaveOutHdr, uSize);
 }
@@ -4185,6 +4205,7 @@
     if (lpDesc == NULL) 
 	return MMSYSERR_INVALHANDLE;
     lpWaveOutHdr->reserved = (DWORD)_lpWaveOutHdr;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     ret = wodMessage(lpDesc->uDeviceID, WODM_PREPARE, lpDesc->dwInstance, 
 		     (DWORD)lpWaveOutHdr, uSize);
     return ret;
@@ -4203,6 +4224,7 @@
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
     lpWaveOutHdr->reserved = (DWORD)lpWaveOutHdr;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_UNPREPARE, lpDesc->dwInstance, 
 		      (DWORD)lpWaveOutHdr, uSize);
 }
@@ -4221,6 +4243,7 @@
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) 
 	return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     ret = wodMessage(lpDesc->uDeviceID, WODM_UNPREPARE, lpDesc->dwInstance, 
 		     (DWORD)lpWaveOutHdr, uSize);
     return ret;
@@ -4239,6 +4262,7 @@
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) 
 	return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_WRITE, lpDesc->dwInstance, 
 		      (DWORD)lpWaveOutHdr, uSize);
 }
@@ -4257,7 +4281,9 @@
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) 
 	return MMSYSERR_INVALHANDLE;
-    ret = wodMessage(lpDesc->uDeviceID, WODM_WRITE, lpDesc->dwInstance, (DWORD)lpWaveOutHdr, uSize);
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
+    ret = wodMessage(lpDesc->uDeviceID, WODM_WRITE, lpDesc->dwInstance, 
+		     (DWORD)lpWaveOutHdr, uSize);
     return ret;
 }
 
@@ -4280,6 +4306,7 @@
 
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_PAUSE, lpDesc->dwInstance, 0L, 0L);
 }
 
@@ -4302,6 +4329,7 @@
 
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_RESTART, lpDesc->dwInstance, 0L, 0L);
 }
 
@@ -4324,6 +4352,7 @@
 
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_RESET, lpDesc->dwInstance, 0L, 0L);
 }
 
@@ -4352,43 +4381,44 @@
     TRACE("(%04X, %p, %u);\n", hWaveOut, lpTime, uSize);
     lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);
     if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */
     return wodMessage(lpDesc->uDeviceID, WODM_GETPOS, lpDesc->dwInstance, 
 		       (DWORD)lpTime, (DWORD)uSize);
 }
 
-#define WAVEOUT_SHORTCUT_1(xx, XX, atype) 				\
-	UINT WINAPI waveOut##xx(HWAVEOUT hWaveOut, atype x)		\
-{									\
-	return waveOut##xx##16(hWaveOut, x);				\
-}									\
-UINT16 WINAPI waveOut##xx##16(HWAVEOUT16 hWaveOut, atype x)		\
-{									\
-	LPWAVEOPENDESC	lpDesc;						\
-	TRACE("(%04X, %08lx);\n", hWaveOut, (DWORD)x);           	\
-	lpDesc = (LPWAVEOPENDESC) USER_HEAP_LIN_ADDR(hWaveOut);		\
-	if (lpDesc == NULL) return MMSYSERR_INVALHANDLE;		\
-	return wodMessage(lpDesc->uDeviceID, WODM_##XX, 		\
-			  lpDesc->dwInstance, (DWORD)x, 0L);		\
+#define WAVEOUT_SHORTCUT_1(xx, XX, atype) 			\
+UINT WINAPI waveOut##xx(HWAVEOUT hWaveOut, atype x)		\
+{return waveOut##xx##16(hWaveOut, x);}				\
+UINT16 WINAPI waveOut##xx##16(HWAVEOUT16 hWaveOut, atype x)	\
+{								\
+    LPWAVEOPENDESC	lpDesc;					\
+    TRACE("(%04X, %08lx);\n", hWaveOut, (DWORD)x);           	\
+    lpDesc = (LPWAVEOPENDESC)USER_HEAP_LIN_ADDR(hWaveOut);	\
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */	\
+    return (lpDesc == NULL) ? MMSYSERR_INVALHANDLE :		\
+	wodMessage(lpDesc->uDeviceID, WODM_##XX, 		\
+		   lpDesc->dwInstance, (DWORD)x, 0L);		\
 }
 
 WAVEOUT_SHORTCUT_1(GetPitch, GETPITCH, LPDWORD)
 WAVEOUT_SHORTCUT_1(SetPitch, SETPITCH, DWORD)
 WAVEOUT_SHORTCUT_1(GetPlaybackRate, GETPLAYBACKRATE, LPDWORD)
 WAVEOUT_SHORTCUT_1(SetPlaybackRate, SETPLAYBACKRATE, DWORD)
+#undef WAVEOUT_SHORTCUT_1
     
-#define WAVEOUT_SHORTCUT_2(xx, XX, atype) 				\
-	UINT WINAPI waveOut##xx(UINT devid, atype x)			\
-{									\
-	return waveOut##xx##16(devid, x);				\
-}									\
-UINT16 WINAPI waveOut##xx##16(UINT16 devid, atype x)			\
-{									\
-	TRACE("(%04X, %08lx);\n", devid, (DWORD)x);	        	\
-	return wodMessage(devid, WODM_##XX, 0, (DWORD)x, 0L);		\
+#define WAVEOUT_SHORTCUT_2(xx, XX, atype) 			\
+UINT WINAPI waveOut##xx(UINT devid, atype x)			\
+{return waveOut##xx##16(devid, x);}				\
+UINT16 WINAPI waveOut##xx##16(UINT16 devid, atype x)		\
+{								\
+    TRACE("(%04X, %08lx);\n", devid, (DWORD)x);	        	\
+    /* FIXME: dwUser parameter is wrong (cf waveOutOpen) */	\
+    return wodMessage(devid, WODM_##XX, 0, (DWORD)x, 0L);	\
 }
     
 WAVEOUT_SHORTCUT_2(GetVolume, GETVOLUME, LPDWORD)
 WAVEOUT_SHORTCUT_2(SetVolume, SETVOLUME, DWORD)
+#undef WAVEOUT_SHORTCUT_1
     
 /**************************************************************************
  * 				waveOutBreakLoop 	[MMSYSTEM.419]
@@ -4443,7 +4473,7 @@
  * 				waveOutMessage 		[MMSYSTEM.421]
  */
 DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, 
-                              DWORD dwParam1, DWORD dwParam2)
+			    DWORD dwParam1, DWORD dwParam2)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4532,7 +4562,7 @@
 /**************************************************************************
  * 				waveInGetNumDevs 		[WINMM.151]
  */
-UINT WINAPI waveInGetNumDevs()
+UINT WINAPI waveInGetNumDevs(void)
 {
     return waveInGetNumDevs16();
 }
@@ -4540,7 +4570,7 @@
 /**************************************************************************
  * 				waveInGetNumDevs 		[MMSYSTEM.501]
  */
-UINT16 WINAPI waveInGetNumDevs16()
+UINT16 WINAPI waveInGetNumDevs16(void)
 {
     UINT16	count = 0;
 
@@ -4647,10 +4677,10 @@
                            const LPWAVEFORMAT lpFormat, DWORD dwCallback,
                            DWORD dwInstance, DWORD dwFlags)
 {
-    HWAVEIN16 hWaveIn;
+    HWAVEIN16		hWaveIn;
     LPWAVEOPENDESC	lpDesc;
-    DWORD	dwRet = 0;
-    BOOL	bMapperFlg = FALSE;
+    DWORD		dwRet = 0;
+    BOOL		bMapperFlg = FALSE;
 
     TRACE("(%p, %d, %p, %08lX, %08lX, %08lX);\n", 
 	  lphWaveIn, uDeviceID, lpFormat, dwCallback, dwInstance, dwFlags);
@@ -5442,7 +5472,7 @@
     if (hndl && mmThreadIsValid16(hndl)) {
 	WINE_MMTHREAD*	lpMMThd = (WINE_MMTHREAD*)PTR_SEG_OFF_TO_LIN(hndl, 0);
 	ret = (GetCurrentThreadId() == lpMMThd->dwThreadID);
-#if 1 /* EPP */
+#if 0 /* EPP */
 	/* FIXME: just a test */
 	SYSLEVEL_ReleaseWin16Lock();
 	SYSLEVEL_RestoreWin16Lock();