Moved all MCI internal functions/variables/macros to mci.c.
Changed some interface names.

diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec
index db72fe4..346edd1 100644
--- a/if1632/mmsystem.spec
+++ b/if1632/mmsystem.spec
@@ -2,7 +2,7 @@
 type	win16
 
 #1      pascal  MMSYSTEM_WEP(word word word ptr) MMSYSTEM_WEP
-2      pascal  SNDPLAYSOUND(ptr word) sndPlaySound
+2      pascal  SNDPLAYSOUND(ptr word) sndPlaySoundA
 3      stub    PLAYSOUND
 5      pascal  mmsystemGetVersion() mmsystemGetVersion16
 6      pascal  DriverProc(long word word long long) DriverProc16
diff --git a/include/mmsystem.h b/include/mmsystem.h
index 0d89426..50a29fc 100644
--- a/include/mmsystem.h
+++ b/include/mmsystem.h
@@ -10,21 +10,21 @@
 #endif 
 #include "windef.h"
 
-typedef LPSTR		    HPSTR;          /* a huge version of LPSTR */
-typedef LPCSTR			HPCSTR;         /* a huge version of LPCSTR */
-
+typedef LPSTR		HPSTR;          /* a huge version of LPSTR */
+typedef LPCSTR		HPCSTR;         /* a huge version of LPCSTR */
+   
 #pragma pack(1)
-
+   
 #define MAXWAVEDRIVERS	10
 #define MAXMIDIDRIVERS	10
 #define MAXAUXDRIVERS	10
 #define MAXMCIDRIVERS	32
 #define MAXMIXERDRIVERS	10
-
+   
 #define MAXPNAMELEN      32     /* max product name length (including NULL) */
 #define MAXERRORLENGTH   128    /* max error text length (including NULL) */
 #define MAX_JOYSTICKOEMVXDNAME	260
-
+   
 typedef WORD    VERSION;        /* major (high byte), minor (low byte) */
 
 typedef UINT16	MMVERSION16;
@@ -125,26 +125,26 @@
 #define MCI_WAVE_OFFSET        1152
 #define MCI_SEQ_OFFSET         1216
 
-#define MMSYSERR_NOERROR      0                    /* no error */
-#define MMSYSERR_ERROR        (MMSYSERR_BASE + 1)  /* unspecified error */
-#define MMSYSERR_BADDEVICEID  (MMSYSERR_BASE + 2)  /* device ID out of range */
-#define MMSYSERR_NOTENABLED   (MMSYSERR_BASE + 3)  /* driver failed enable */
-#define MMSYSERR_ALLOCATED    (MMSYSERR_BASE + 4)  /* device already allocated */
-#define MMSYSERR_INVALHANDLE  (MMSYSERR_BASE + 5)  /* device handle is invalid */
-#define MMSYSERR_NODRIVER     (MMSYSERR_BASE + 6)  /* no device driver present */
-#define MMSYSERR_NOMEM        (MMSYSERR_BASE + 7)  /* memory allocation error */
-#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8)  /* function isn't supported */
-#define MMSYSERR_BADERRNUM    (MMSYSERR_BASE + 9)  /* error value out of range */
-#define MMSYSERR_INVALFLAG    (MMSYSERR_BASE + 10) /* invalid flag passed */
-#define MMSYSERR_INVALPARAM   (MMSYSERR_BASE + 11) /* invalid parameter passed */
-#define MMSYSERR_LASTERROR    (MMSYSERR_BASE + 11) /* last error in range */
+#define MMSYSERR_NOERROR      	0                    /* no error */
+#define MMSYSERR_ERROR        	(MMSYSERR_BASE + 1)  /* unspecified error */
+#define MMSYSERR_BADDEVICEID  	(MMSYSERR_BASE + 2)  /* device ID out of range */
+#define MMSYSERR_NOTENABLED   	(MMSYSERR_BASE + 3)  /* driver failed enable */
+#define MMSYSERR_ALLOCATED    	(MMSYSERR_BASE + 4)  /* device already allocated */
+#define MMSYSERR_INVALHANDLE  	(MMSYSERR_BASE + 5)  /* device handle is invalid */
+#define MMSYSERR_NODRIVER     	(MMSYSERR_BASE + 6)  /* no device driver present */
+#define MMSYSERR_NOMEM        	(MMSYSERR_BASE + 7)  /* memory allocation error */
+#define MMSYSERR_NOTSUPPORTED 	(MMSYSERR_BASE + 8)  /* function isn't supported */
+#define MMSYSERR_BADERRNUM    	(MMSYSERR_BASE + 9)  /* error value out of range */
+#define MMSYSERR_INVALFLAG    	(MMSYSERR_BASE + 10) /* invalid flag passed */
+#define MMSYSERR_INVALPARAM   	(MMSYSERR_BASE + 11) /* invalid parameter passed */
+#define MMSYSERR_LASTERROR    	(MMSYSERR_BASE + 11) /* last error in range */
 
-#define CALLBACK_TYPEMASK   0x00070000l    /* callback type mask */
-#define CALLBACK_NULL       0x00000000l    /* no callback */
-#define CALLBACK_WINDOW     0x00010000l    /* dwCallback is a HWND */
-#define CALLBACK_TASK       0x00020000l    /* dwCallback is a HTASK */
-#define CALLBACK_FUNCTION   0x00030000l    /* dwCallback is a FARPROC */
-#define CALLBACK_FUNC     0x00070000l    /* (ugly hack) 32-bit FARPROC */
+#define CALLBACK_TYPEMASK   	0x00070000l    /* callback type mask */
+#define CALLBACK_NULL       	0x00000000l    /* no callback */
+#define CALLBACK_WINDOW     	0x00010000l    /* dwCallback is a HWND */
+#define CALLBACK_TASK       	0x00020000l    /* dwCallback is a HTASK */
+#define CALLBACK_FUNCTION   	0x00030000l    /* dwCallback is a FARPROC */
+#define CALLBACK_FUNC     	0x00070000l    /* (ugly hack) 32-bit FARPROC */
 #define CALLBACK32CONV(x)   ((((x)&CALLBACK_TYPEMASK)==CALLBACK_FUNCTION) ? \
                              (((x)&~CALLBACK_TYPEMASK)|CALLBACK_FUNC) : (x))
 
@@ -170,27 +170,27 @@
 #define MM_PC_JOYSTICK          12      /* Joystick adapter */
 
 
-UINT16 WINAPI mmsystemGetVersion16(void);
-UINT WINAPI mmsystemGetVersion(void);
-BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
-BOOL WINAPI PlaySoundA(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
-BOOL WINAPI PlaySoundW(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
-#define PlaySound WINELIB_NAME_AW(PlaySound)
+UINT16		WINAPI	mmsystemGetVersion16(void);
+UINT 		WINAPI 	mmsystemGetVersion(void);
+BOOL16 		WINAPI 	sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags);
+BOOL 		WINAPI 	PlaySoundA(LPCSTR pszSound, HMODULE hmod, DWORD fdwSound);
+BOOL 		WINAPI 	PlaySoundW(LPCWSTR pszSound, HMODULE hmod, DWORD fdwSound);
+#define 		PlaySound WINELIB_NAME_AW(PlaySound)
 
-#define SND_SYNC            0x0000  /* play synchronously (default) */
-#define SND_ASYNC           0x0001  /* play asynchronously */
-#define SND_NODEFAULT       0x0002  /* don't use default sound */
-#define SND_MEMORY          0x0004  /* lpszSoundName points to a memory file */
-#define SND_LOOP            0x0008  /* loop the sound until next sndPlaySound */
-#define SND_NOSTOP          0x0010  /* don't stop any currently playing sound */
+#define SND_SYNC            	0x0000  /* play synchronously (default) */
+#define SND_ASYNC           	0x0001  /* play asynchronously */
+#define SND_NODEFAULT       	0x0002  /* don't use default sound */
+#define SND_MEMORY          	0x0004  /* lpszSoundName points to a memory file */
+#define SND_LOOP            	0x0008  /* loop the sound until next sndPlaySound */
+#define SND_NOSTOP          	0x0010  /* don't stop any currently playing sound */
 
-#define SND_NOWAIT	0x00002000L /* don't wait if the driver is busy */
-#define SND_ALIAS       0x00010000L /* name is a registry alias */
-#define SND_ALIAS_ID	0x00110000L /* alias is a predefined ID */
-#define SND_FILENAME    0x00020000L /* name is file name */
-#define SND_RESOURCE    0x00040004L /* name is resource name or atom */
-#define SND_PURGE	0x00000040L /* purge all sounds */
-#define SND_APPLICATION     0x00000080L  /* look for application specific association */
+#define SND_NOWAIT		0x00002000L /* don't wait if the driver is busy */
+#define SND_ALIAS       	0x00010000L /* name is a registry alias */
+#define SND_ALIAS_ID		0x00110000L /* alias is a predefined ID */
+#define SND_FILENAME    	0x00020000L /* name is file name */
+#define SND_RESOURCE    	0x00040004L /* name is resource name or atom */
+#define SND_PURGE		0x00000040L /* purge all sounds */
+#define SND_APPLICATION     	0x00000080L /* look for application specific association */
 
 /* waveform audio error return values */
 #define WAVERR_BADFORMAT      (WAVERR_BASE + 0)    /* unsupported wave format */
@@ -351,86 +351,86 @@
 } WAVEFORMATEX, *LPWAVEFORMATEX, *NPWAVEFORMATEX, *PWAVEFORMATEX;
 #endif
 
-UINT16 WINAPI waveOutGetNumDevs16(void);
-UINT WINAPI waveOutGetNumDevs(void);
-UINT16 WINAPI waveOutGetDevCaps16(UINT16,LPWAVEOUTCAPS16,UINT16);
-UINT WINAPI waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT);
-UINT WINAPI waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT);
-#define waveOutGetDevCaps WINELIB_NAME_AW(waveOutGetDevCaps)
-UINT16 WINAPI waveOutGetVolume16(UINT16,DWORD*);
-UINT WINAPI waveOutGetVolume(UINT,DWORD*);
-UINT16 WINAPI waveOutSetVolume16(UINT16,DWORD);
-UINT WINAPI waveOutSetVolume(UINT,DWORD);
-UINT16 WINAPI waveOutGetErrorText16(UINT16,LPSTR,UINT16);
-UINT WINAPI waveOutGetErrorTextA(UINT,LPSTR,UINT);
-UINT WINAPI waveOutGetErrorTextW(UINT,LPWSTR,UINT);
-#define waveOutGetErrorText WINELIB_NAME_AW(waveOutGetErrorText)
-UINT16 WINAPI waveOutOpen16(HWAVEOUT16*,UINT16,const LPWAVEFORMATEX,DWORD,DWORD,DWORD);
-UINT WINAPI waveOutOpen(HWAVEOUT*,UINT,const LPWAVEFORMATEX,DWORD,DWORD,DWORD);
-UINT16 WINAPI waveOutClose16(HWAVEOUT16);
-UINT WINAPI waveOutClose(HWAVEOUT);
-UINT16 WINAPI waveOutPrepareHeader16(HWAVEOUT16,WAVEHDR*,UINT16);
-UINT WINAPI waveOutPrepareHeader(HWAVEOUT,WAVEHDR*,UINT);
-UINT16 WINAPI waveOutUnprepareHeader16(HWAVEOUT16,WAVEHDR*,UINT16);
-UINT WINAPI waveOutUnprepareHeader(HWAVEOUT,WAVEHDR*,UINT);
-UINT16 WINAPI waveOutWrite16(HWAVEOUT16,WAVEHDR*,UINT16);
-UINT WINAPI waveOutWrite(HWAVEOUT,WAVEHDR*,UINT);
-UINT16 WINAPI waveOutPause16(HWAVEOUT16);
-UINT WINAPI waveOutPause(HWAVEOUT);
-UINT16 WINAPI waveOutRestart16(HWAVEOUT16);
-UINT WINAPI waveOutRestart(HWAVEOUT);
-UINT16 WINAPI waveOutReset16(HWAVEOUT16);
-UINT WINAPI waveOutReset(HWAVEOUT);
-UINT16 WINAPI waveOutBreakLoop16(HWAVEOUT16);
-UINT WINAPI waveOutBreakLoop(HWAVEOUT);
-UINT16 WINAPI waveOutGetPosition16(HWAVEOUT16,LPMMTIME16,UINT16);
-UINT WINAPI waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT);
-UINT16 WINAPI waveOutGetPitch16(HWAVEOUT16,DWORD*);
-UINT WINAPI waveOutGetPitch(HWAVEOUT,DWORD*);
-UINT16 WINAPI waveOutSetPitch16(HWAVEOUT16,DWORD);
-UINT WINAPI waveOutSetPitch(HWAVEOUT,DWORD);
-UINT16 WINAPI waveOutGetPlaybackRate16(HWAVEOUT16,DWORD*);
-UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT,DWORD*);
-UINT16 WINAPI waveOutSetPlaybackRate16(HWAVEOUT16,DWORD);
-UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT,DWORD);
-UINT16 WINAPI waveOutGetID16(HWAVEOUT16,UINT16*);
-UINT WINAPI waveOutGetID(HWAVEOUT,UINT*);
-DWORD WINAPI waveOutMessage16(HWAVEOUT16,UINT16,DWORD,DWORD);
-DWORD WINAPI waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD);
+UINT16 		WINAPI 	waveOutGetNumDevs16(void);
+UINT 		WINAPI 	waveOutGetNumDevs(void);
+UINT16 		WINAPI 	waveOutGetDevCaps16(UINT16,LPWAVEOUTCAPS16,UINT16);
+UINT 		WINAPI 	waveOutGetDevCapsA(UINT,LPWAVEOUTCAPSA,UINT);
+UINT 		WINAPI	waveOutGetDevCapsW(UINT,LPWAVEOUTCAPSW,UINT);
+#define 		waveOutGetDevCaps WINELIB_NAME_AW(waveOutGetDevCaps)
+UINT16 		WINAPI	waveOutGetVolume16(UINT16,DWORD*);
+UINT 		WINAPI	waveOutGetVolume(UINT,DWORD*);
+UINT16 		WINAPI 	waveOutSetVolume16(UINT16,DWORD);
+UINT 		WINAPI 	waveOutSetVolume(UINT,DWORD);
+UINT16 		WINAPI 	waveOutGetErrorText16(UINT16,LPSTR,UINT16);
+UINT 		WINAPI 	waveOutGetErrorTextA(UINT,LPSTR,UINT);
+UINT 		WINAPI 	waveOutGetErrorTextW(UINT,LPWSTR,UINT);
+#define 	    	waveOutGetErrorText WINELIB_NAME_AW(waveOutGetErrorText)
+UINT16 		WINAPI 	waveOutOpen16(HWAVEOUT16*,UINT16,const LPWAVEFORMATEX,DWORD,DWORD,DWORD);
+UINT 		WINAPI 	waveOutOpen(HWAVEOUT*,UINT,const LPWAVEFORMATEX,DWORD,DWORD,DWORD);
+UINT16 		WINAPI 	waveOutClose16(HWAVEOUT16);
+UINT 		WINAPI 	waveOutClose(HWAVEOUT);
+UINT16 		WINAPI 	waveOutPrepareHeader16(HWAVEOUT16,WAVEHDR*,UINT16);
+UINT 		WINAPI 	waveOutPrepareHeader(HWAVEOUT,WAVEHDR*,UINT);
+UINT16 		WINAPI 	waveOutUnprepareHeader16(HWAVEOUT16,WAVEHDR*,UINT16);
+UINT 		WINAPI 	waveOutUnprepareHeader(HWAVEOUT,WAVEHDR*,UINT);
+UINT16 		WINAPI 	waveOutWrite16(HWAVEOUT16,WAVEHDR*,UINT16);
+UINT 		WINAPI 	waveOutWrite(HWAVEOUT,WAVEHDR*,UINT);
+UINT16 		WINAPI 	waveOutPause16(HWAVEOUT16);
+UINT 		WINAPI 	waveOutPause(HWAVEOUT);
+UINT16 		WINAPI 	waveOutRestart16(HWAVEOUT16);
+UINT 		WINAPI 	waveOutRestart(HWAVEOUT);
+UINT16 		WINAPI 	waveOutReset16(HWAVEOUT16);
+UINT 		WINAPI 	waveOutReset(HWAVEOUT);
+UINT16 		WINAPI 	waveOutBreakLoop16(HWAVEOUT16);
+UINT 		WINAPI 	waveOutBreakLoop(HWAVEOUT);
+UINT16 		WINAPI 	waveOutGetPosition16(HWAVEOUT16,LPMMTIME16,UINT16);
+UINT 		WINAPI 	waveOutGetPosition(HWAVEOUT,LPMMTIME,UINT);
+UINT16 		WINAPI 	waveOutGetPitch16(HWAVEOUT16,DWORD*);
+UINT 		WINAPI 	waveOutGetPitch(HWAVEOUT,DWORD*);
+UINT16 		WINAPI 	waveOutSetPitch16(HWAVEOUT16,DWORD);
+UINT 		WINAPI 	waveOutSetPitch(HWAVEOUT,DWORD);
+UINT16 		WINAPI 	waveOutGetPlaybackRate16(HWAVEOUT16,DWORD*);
+UINT 		WINAPI 	waveOutGetPlaybackRate(HWAVEOUT,DWORD*);
+UINT16 		WINAPI 	waveOutSetPlaybackRate16(HWAVEOUT16,DWORD);
+UINT 		WINAPI 	waveOutSetPlaybackRate(HWAVEOUT,DWORD);
+UINT16 		WINAPI 	waveOutGetID16(HWAVEOUT16,UINT16*);
+UINT 		WINAPI 	waveOutGetID(HWAVEOUT,UINT*);
+DWORD 		WINAPI 	waveOutMessage16(HWAVEOUT16,UINT16,DWORD,DWORD);
+DWORD 		WINAPI 	waveOutMessage(HWAVEOUT,UINT,DWORD,DWORD);
 
-UINT16 WINAPI waveInGetNumDevs16(void);
-UINT WINAPI waveInGetNumDevs(void);
-UINT16 WINAPI waveInGetDevCaps16(UINT16,LPWAVEINCAPS16,UINT16);
-UINT WINAPI waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT);
-UINT WINAPI waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT);
-#define waveInGetDevCaps WINELIB_NAME_AW(waveInGetDevCaps)
-UINT16 WINAPI waveInGetErrorText16(UINT16,LPSTR,UINT16);
-UINT WINAPI waveInGetErrorTextA(UINT,LPSTR,UINT);
-UINT WINAPI waveInGetErrorTextW(UINT,LPWSTR,UINT);
-#define waveInGetErrorText WINELIB_NAME_AW(waveInGetErrorText)
-UINT16 WINAPI waveInOpen16(HWAVEIN16*,UINT16,const LPWAVEFORMAT,DWORD,DWORD,DWORD);
-UINT WINAPI waveInOpen(HWAVEIN*,UINT,const LPWAVEFORMAT,DWORD,DWORD,DWORD);
-UINT16 WINAPI waveInClose16(HWAVEIN16);
-UINT WINAPI waveInClose(HWAVEIN);
-UINT16 WINAPI waveInPrepareHeader16(HWAVEIN16,WAVEHDR*,UINT16);
-UINT WINAPI waveInPrepareHeader(HWAVEIN,WAVEHDR*,UINT);
-UINT16 WINAPI waveInUnprepareHeader16(HWAVEIN16,WAVEHDR*,UINT16);
-UINT WINAPI waveInUnprepareHeader(HWAVEIN,WAVEHDR*,UINT);
-UINT16 WINAPI waveInAddBuffer16(HWAVEIN16,WAVEHDR*,UINT16);
-UINT WINAPI waveInAddBuffer(HWAVEIN,WAVEHDR*,UINT);
-UINT16 WINAPI waveInStart16(HWAVEIN16);
-UINT WINAPI waveInStart(HWAVEIN);
-UINT16 WINAPI waveInStop16(HWAVEIN16);
-UINT WINAPI waveInStop(HWAVEIN);
-UINT16 WINAPI waveInReset16(HWAVEIN16);
-UINT WINAPI waveInReset(HWAVEIN);
-UINT16 WINAPI waveInGetPosition16(HWAVEIN16,LPMMTIME16,UINT16);
-UINT WINAPI waveInGetPosition(HWAVEIN,LPMMTIME,UINT);
-UINT16 WINAPI waveInGetID16(HWAVEIN16,UINT16*);
-UINT WINAPI waveInGetID(HWAVEIN,UINT*);
+UINT16 		WINAPI 	waveInGetNumDevs16(void);
+UINT 		WINAPI 	waveInGetNumDevs(void);
+UINT16 		WINAPI 	waveInGetDevCaps16(UINT16,LPWAVEINCAPS16,UINT16);
+UINT 		WINAPI 	waveInGetDevCapsA(UINT,LPWAVEINCAPSA,UINT);
+UINT 		WINAPI 	waveInGetDevCapsW(UINT,LPWAVEINCAPSW,UINT);
+#define 		waveInGetDevCaps WINELIB_NAME_AW(waveInGetDevCaps)
+UINT16 		WINAPI 	waveInGetErrorText16(UINT16,LPSTR,UINT16);
+UINT 		WINAPI 	waveInGetErrorTextA(UINT,LPSTR,UINT);
+UINT 		WINAPI 	waveInGetErrorTextW(UINT,LPWSTR,UINT);
+#define 		waveInGetErrorText WINELIB_NAME_AW(waveInGetErrorText)
+UINT16 		WINAPI  waveInOpen16(HWAVEIN16*,UINT16,const LPWAVEFORMAT,DWORD,DWORD,DWORD);
+UINT 		WINAPI  waveInOpen(HWAVEIN*,UINT,const LPWAVEFORMAT,DWORD,DWORD,DWORD);
+UINT16 		WINAPI  waveInClose16(HWAVEIN16);
+UINT 		WINAPI  waveInClose(HWAVEIN);
+UINT16 		WINAPI  waveInPrepareHeader16(HWAVEIN16,WAVEHDR*,UINT16);
+UINT 		WINAPI  waveInPrepareHeader(HWAVEIN,WAVEHDR*,UINT);
+UINT16 		WINAPI  waveInUnprepareHeader16(HWAVEIN16,WAVEHDR*,UINT16);
+UINT 		WINAPI  waveInUnprepareHeader(HWAVEIN,WAVEHDR*,UINT);
+UINT16 		WINAPI  waveInAddBuffer16(HWAVEIN16,WAVEHDR*,UINT16);
+UINT 		WINAPI  waveInAddBuffer(HWAVEIN,WAVEHDR*,UINT);
+UINT16 		WINAPI  waveInStart16(HWAVEIN16);
+UINT 		WINAPI  waveInStart(HWAVEIN);
+UINT16 		WINAPI  waveInStop16(HWAVEIN16);
+UINT 		WINAPI  waveInStop(HWAVEIN);
+UINT16 		WINAPI  waveInReset16(HWAVEIN16);
+UINT 		WINAPI  waveInReset(HWAVEIN);
+UINT16 		WINAPI  waveInGetPosition16(HWAVEIN16,LPMMTIME16,UINT16);
+UINT 		WINAPI  waveInGetPosition(HWAVEIN,LPMMTIME,UINT);
+UINT16 		WINAPI  waveInGetID16(HWAVEIN16,UINT16*);
+UINT 		WINAPI  waveInGetID(HWAVEIN,UINT*);
 
-DWORD WINAPI waveInMessage16(HWAVEIN16,UINT16,DWORD,DWORD);
-DWORD WINAPI waveInMessage(HWAVEIN,UINT,DWORD,DWORD);
+DWORD 		WINAPI 	waveInMessage16(HWAVEIN16,UINT16,DWORD,DWORD);
+DWORD 		WINAPI 	waveInMessage(HWAVEIN,UINT,DWORD,DWORD);
 
 #define MIDIERR_UNPREPARED    (MIDIERR_BASE + 0)   /* header not prepared */
 #define MIDIERR_STILLPLAYING  (MIDIERR_BASE + 1)   /* still something playing */
@@ -580,7 +580,7 @@
 #define MHDR_PREPARED   0x00000002       /* set if header prepared */
 #define MHDR_INQUEUE    0x00000004       /* reserved for driver */
 #define MHDR_ISSTRM	0x00000008	 /* FIXME is this a correct
-					  * value ? Win32 only*/
+					  * value ? Win32 only */
 typedef struct {
     DWORD		cbStruct;
     DWORD		dwTempo;
@@ -617,94 +617,94 @@
 #define	MEVT_TEMPO	0x01
 #define	MEVT_VERSION	0x84
 
-UINT16 WINAPI midiOutGetNumDevs16(void);
-UINT WINAPI midiOutGetNumDevs(void);
-UINT16 WINAPI midiOutGetDevCaps16(UINT16,LPMIDIOUTCAPS16,UINT16);
-UINT WINAPI midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT);
-UINT WINAPI midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT);
-#define midiOutGetDevCaps WINELIB_NAME_AW(midiOutGetDevCaps)
-UINT16 WINAPI midiOutGetVolume16(UINT16,DWORD*);
-UINT WINAPI midiOutGetVolume(UINT,DWORD*);
-UINT16 WINAPI midiOutSetVolume16(UINT16,DWORD);
-UINT WINAPI midiOutSetVolume(UINT,DWORD);
-UINT16 WINAPI midiOutGetErrorText16(UINT16,LPSTR,UINT16);
-UINT WINAPI midiOutGetErrorTextA(UINT,LPSTR,UINT);
-UINT WINAPI midiOutGetErrorTextW(UINT,LPWSTR,UINT);
-#define midiOutGetErrorText WINELIB_NAME_AW(midiOutGetErrorText)
-UINT16 WINAPI midiGetErrorText(UINT16,LPSTR,UINT16);
-UINT16 WINAPI midiOutOpen16(HMIDIOUT16*,UINT16,DWORD,DWORD,DWORD);
-UINT WINAPI midiOutOpen(HMIDIOUT*,UINT,DWORD,DWORD,DWORD);
-UINT16 WINAPI midiOutClose16(HMIDIOUT16);
-UINT WINAPI midiOutClose(HMIDIOUT);
-UINT16 WINAPI midiOutPrepareHeader16(HMIDIOUT16,MIDIHDR16*,UINT16);
-UINT WINAPI midiOutPrepareHeader(HMIDIOUT,MIDIHDR16*,UINT);
-UINT16 WINAPI midiOutUnprepareHeader16(HMIDIOUT16,MIDIHDR16*,UINT16);
-UINT WINAPI midiOutUnprepareHeader(HMIDIOUT,MIDIHDR16*,UINT);
-UINT16 WINAPI midiOutShortMsg16(HMIDIOUT16,DWORD);
-UINT WINAPI midiOutShortMsg(HMIDIOUT,DWORD);
-UINT16 WINAPI midiOutLongMsg16(HMIDIOUT16,MIDIHDR16*,UINT16);
-UINT WINAPI midiOutLongMsg(HMIDIOUT,MIDIHDR16*,UINT);
-UINT16 WINAPI midiOutReset16(HMIDIOUT16);
-UINT WINAPI midiOutReset(HMIDIOUT);
-UINT16 WINAPI midiOutCachePatches16(HMIDIOUT16,UINT16,WORD*,UINT16);
-UINT WINAPI midiOutCachePatches(HMIDIOUT,UINT,WORD*,UINT);
-UINT16 WINAPI midiOutCacheDrumPatches16(HMIDIOUT16,UINT16,WORD*,UINT16);
-UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT,UINT,WORD*,UINT);
-UINT16 WINAPI midiOutGetID16(HMIDIOUT16,UINT16*);
-UINT WINAPI midiOutGetID(HMIDIOUT,UINT*);
+UINT16		WINAPI	midiOutGetNumDevs16(void);
+UINT		WINAPI	midiOutGetNumDevs(void);
+UINT16		WINAPI	midiOutGetDevCaps16(UINT16,LPMIDIOUTCAPS16,UINT16);
+UINT		WINAPI	midiOutGetDevCapsA(UINT,LPMIDIOUTCAPSA,UINT);
+UINT		WINAPI	midiOutGetDevCapsW(UINT,LPMIDIOUTCAPSW,UINT);
+#define 		midiOutGetDevCaps WINELIB_NAME_AW(midiOutGetDevCaps)
+UINT16		WINAPI	midiOutGetVolume16(UINT16,DWORD*);
+UINT		WINAPI	midiOutGetVolume(UINT,DWORD*);
+UINT16		WINAPI	midiOutSetVolume16(UINT16,DWORD);
+UINT		WINAPI	midiOutSetVolume(UINT,DWORD);
+UINT16		WINAPI	midiOutGetErrorText16(UINT16,LPSTR,UINT16);
+UINT		WINAPI	midiOutGetErrorTextA(UINT,LPSTR,UINT);
+UINT		WINAPI	midiOutGetErrorTextW(UINT,LPWSTR,UINT);
+#define 		midiOutGetErrorText WINELIB_NAME_AW(midiOutGetErrorText)
+UINT16		WINAPI	midiGetErrorText(UINT16,LPSTR,UINT16);
+UINT16		WINAPI	midiOutOpen16(HMIDIOUT16*,UINT16,DWORD,DWORD,DWORD);
+UINT		WINAPI	midiOutOpen(HMIDIOUT*,UINT,DWORD,DWORD,DWORD);
+UINT16		WINAPI	midiOutClose16(HMIDIOUT16);
+UINT		WINAPI	midiOutClose(HMIDIOUT);
+UINT16		WINAPI	midiOutPrepareHeader16(HMIDIOUT16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiOutPrepareHeader(HMIDIOUT,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiOutUnprepareHeader16(HMIDIOUT16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiOutUnprepareHeader(HMIDIOUT,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiOutShortMsg16(HMIDIOUT16,DWORD);
+UINT		WINAPI	midiOutShortMsg(HMIDIOUT,DWORD);
+UINT16		WINAPI	midiOutLongMsg16(HMIDIOUT16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiOutLongMsg(HMIDIOUT,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiOutReset16(HMIDIOUT16);
+UINT		WINAPI	midiOutReset(HMIDIOUT);
+UINT16		WINAPI	midiOutCachePatches16(HMIDIOUT16,UINT16,WORD*,UINT16);
+UINT		WINAPI	midiOutCachePatches(HMIDIOUT,UINT,WORD*,UINT);
+UINT16		WINAPI	midiOutCacheDrumPatches16(HMIDIOUT16,UINT16,WORD*,UINT16);
+UINT		WINAPI	midiOutCacheDrumPatches(HMIDIOUT,UINT,WORD*,UINT);
+UINT16		WINAPI	midiOutGetID16(HMIDIOUT16,UINT16*);
+UINT		WINAPI	midiOutGetID(HMIDIOUT,UINT*);
 
-DWORD WINAPI midiOutMessage16(HMIDIOUT16,UINT16,DWORD,DWORD);
-DWORD WINAPI midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD);
+DWORD		WINAPI	midiOutMessage16(HMIDIOUT16,UINT16,DWORD,DWORD);
+DWORD		WINAPI	midiOutMessage(HMIDIOUT,UINT,DWORD,DWORD);
 
-UINT16 WINAPI midiInGetNumDevs16(void);
-UINT WINAPI midiInGetNumDevs(void);
-UINT16 WINAPI midiInGetDevCaps16(UINT16,LPMIDIINCAPS16,UINT16);
-UINT WINAPI midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT);
-UINT WINAPI midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT);
-#define midiInGetDevCaps WINELIB_NAME_AW(midiInGetDevCaps)
-UINT16 WINAPI midiInGetErrorText16(UINT16,LPSTR,UINT16);
-UINT WINAPI midiInGetErrorTextA(UINT,LPSTR,UINT);
-UINT WINAPI midiInGetErrorTextW(UINT,LPWSTR,UINT);
-#define midiInGetErrorText WINELIB_NAME_AW(midiInGetErrorText)
-UINT16 WINAPI midiInOpen16(HMIDIIN16*,UINT16,DWORD,DWORD,DWORD);
-UINT WINAPI midiInOpen(HMIDIIN*,UINT,DWORD,DWORD,DWORD);
-UINT16 WINAPI midiInClose16(HMIDIIN16);
-UINT WINAPI midiInClose(HMIDIIN);
-UINT16 WINAPI midiInPrepareHeader16(HMIDIIN16,MIDIHDR16*,UINT16);
-UINT WINAPI midiInPrepareHeader(HMIDIIN,MIDIHDR16*,UINT);
-UINT16 WINAPI midiInUnprepareHeader16(HMIDIIN16,MIDIHDR16*,UINT16);
-UINT WINAPI midiInUnprepareHeader(HMIDIIN,MIDIHDR16*,UINT);
-UINT16 WINAPI midiInAddBuffer16(HMIDIIN16,MIDIHDR16*,UINT16);
-UINT WINAPI midiInAddBuffer(HMIDIIN,MIDIHDR16*,UINT);
-UINT16 WINAPI midiInStart16(HMIDIIN16);
-UINT WINAPI midiInStart(HMIDIIN);
-UINT16 WINAPI midiInStop16(HMIDIIN16);
-UINT WINAPI midiInStop(HMIDIIN);
-UINT16 WINAPI midiInReset16(HMIDIIN16);
-UINT WINAPI midiInReset(HMIDIIN);
-UINT16 WINAPI midiInGetID16(HMIDIIN16,UINT16*);
-UINT WINAPI midiInGetID(HMIDIIN,UINT*);
-DWORD WINAPI midiInMessage16(HMIDIIN16,UINT16,DWORD,DWORD);
-DWORD WINAPI midiInMessage(HMIDIIN,UINT,DWORD,DWORD);
+UINT16		WINAPI	midiInGetNumDevs16(void);
+UINT		WINAPI	midiInGetNumDevs(void);
+UINT16		WINAPI	midiInGetDevCaps16(UINT16,LPMIDIINCAPS16,UINT16);
+UINT		WINAPI	midiInGetDevCapsA(UINT,LPMIDIINCAPSA,UINT);
+UINT		WINAPI	midiInGetDevCapsW(UINT,LPMIDIINCAPSW,UINT);
+#define 		midiInGetDevCaps WINELIB_NAME_AW(midiInGetDevCaps)
+UINT16		WINAPI	midiInGetErrorText16(UINT16,LPSTR,UINT16);
+UINT		WINAPI	midiInGetErrorTextA(UINT,LPSTR,UINT);
+UINT		WINAPI	midiInGetErrorTextW(UINT,LPWSTR,UINT);
+#define 		midiInGetErrorText WINELIB_NAME_AW(midiInGetErrorText)
+UINT16		WINAPI	midiInOpen16(HMIDIIN16*,UINT16,DWORD,DWORD,DWORD);
+UINT		WINAPI	midiInOpen(HMIDIIN*,UINT,DWORD,DWORD,DWORD);
+UINT16		WINAPI	midiInClose16(HMIDIIN16);
+UINT		WINAPI	midiInClose(HMIDIIN);
+UINT16		WINAPI	midiInPrepareHeader16(HMIDIIN16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiInPrepareHeader(HMIDIIN,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiInUnprepareHeader16(HMIDIIN16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiInUnprepareHeader(HMIDIIN,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiInAddBuffer16(HMIDIIN16,MIDIHDR16*,UINT16);
+UINT		WINAPI	midiInAddBuffer(HMIDIIN,MIDIHDR16*,UINT);
+UINT16		WINAPI	midiInStart16(HMIDIIN16);
+UINT		WINAPI	midiInStart(HMIDIIN);
+UINT16		WINAPI	midiInStop16(HMIDIIN16);
+UINT		WINAPI	midiInStop(HMIDIIN);
+UINT16		WINAPI	midiInReset16(HMIDIIN16);
+UINT		WINAPI	midiInReset(HMIDIIN);
+UINT16		WINAPI	midiInGetID16(HMIDIIN16,UINT16*);
+UINT		WINAPI	midiInGetID(HMIDIIN,UINT*);
+DWORD		WINAPI	midiInMessage16(HMIDIIN16,UINT16,DWORD,DWORD);
+DWORD		WINAPI	midiInMessage(HMIDIIN,UINT,DWORD,DWORD);
 
-MMRESULT16 WINAPI midiStreamClose16(HMIDISTRM16 hms);
-MMRESULT WINAPI midiStreamClose(HMIDISTRM hms);
-MMRESULT WINAPI midiStreamOpen(HMIDISTRM* phms, LPUINT uDeviceID, DWORD cMidi,
-				   DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); 
-MMRESULT16 WINAPI midiStreamOpen16(HMIDISTRM16* phms, LPUINT16 devid, DWORD cMidi,
-				   DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); 
-MMRESULT16 WINAPI midiStreamOut16(HMIDISTRM16 hms, LPMIDIHDR16 lpMidiHdr, UINT16 cbMidiHdr); 
-MMRESULT WINAPI midiStreamOut(HMIDISTRM hms, LPMIDIHDR16 lpMidiHdr, UINT cbMidiHdr);
-MMRESULT16 WINAPI midiStreamPause16(HMIDISTRM16 hms);
-MMRESULT WINAPI midiStreamPause(HMIDISTRM hms);
-MMRESULT16 WINAPI midiStreamPosition16(HMIDISTRM16 hms, LPMMTIME16 lpmmt, UINT16 cbmmt);
-MMRESULT WINAPI midiStreamPosition(HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt);
-MMRESULT16 WINAPI midiStreamProperty16(HMIDISTRM16 hms, LPBYTE lpPropData, DWORD dwProperty);
-MMRESULT WINAPI midiStreamProperty(HMIDISTRM hms, LPBYTE lpPropData, DWORD dwProperty);
-MMRESULT16 WINAPI midiStreamRestart16(HMIDISTRM16 hms);
-MMRESULT WINAPI midiStreamRestart(HMIDISTRM hms);
-MMRESULT16 WINAPI midiStreamStop16(HMIDISTRM16 hms);
-MMRESULT WINAPI midiStreamStop(HMIDISTRM hms);
+MMRESULT16	WINAPI	midiStreamClose16(HMIDISTRM16 hms);
+MMRESULT	WINAPI	midiStreamClose(HMIDISTRM hms);
+MMRESULT	WINAPI	midiStreamOpen(HMIDISTRM* phms, LPUINT uDeviceID, DWORD cMidi,
+				       DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); 
+MMRESULT16	WINAPI	midiStreamOpen16(HMIDISTRM16* phms, LPUINT16 devid, DWORD cMidi,
+					 DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen); 
+MMRESULT16	WINAPI	midiStreamOut16(HMIDISTRM16 hms, LPMIDIHDR16 lpMidiHdr, UINT16 cbMidiHdr); 
+MMRESULT	WINAPI	midiStreamOut(HMIDISTRM hms, LPMIDIHDR16 lpMidiHdr, UINT cbMidiHdr);
+MMRESULT16	WINAPI	midiStreamPause16(HMIDISTRM16 hms);
+MMRESULT	WINAPI	midiStreamPause(HMIDISTRM hms);
+MMRESULT16	WINAPI	midiStreamPosition16(HMIDISTRM16 hms, LPMMTIME16 lpmmt, UINT16 cbmmt);
+MMRESULT	WINAPI	midiStreamPosition(HMIDISTRM hms, LPMMTIME lpmmt, UINT cbmmt);
+MMRESULT16	WINAPI	midiStreamProperty16(HMIDISTRM16 hms, LPBYTE lpPropData, DWORD dwProperty);
+MMRESULT	WINAPI	midiStreamProperty(HMIDISTRM hms, LPBYTE lpPropData, DWORD dwProperty);
+MMRESULT16	WINAPI	midiStreamRestart16(HMIDISTRM16 hms);
+MMRESULT	WINAPI	midiStreamRestart(HMIDISTRM hms);
+MMRESULT16	WINAPI	midiStreamStop16(HMIDISTRM16 hms);
+MMRESULT	WINAPI	midiStreamStop(HMIDISTRM hms);
 
 #define AUX_MAPPER     (-1)
 
@@ -743,20 +743,20 @@
 #define AUXCAPS_VOLUME          0x0001  /* supports volume control */
 #define AUXCAPS_LRVOLUME        0x0002  /* separate left-right volume control */
 
-UINT16 WINAPI auxGetNumDevs16(void);
-UINT WINAPI auxGetNumDevs(void);
-UINT16 WINAPI auxGetDevCaps16 (UINT16,LPAUXCAPS16,UINT16);
-UINT WINAPI auxGetDevCapsA(UINT,LPAUXCAPSA,UINT);
-UINT WINAPI auxGetDevCapsW(UINT,LPAUXCAPSW,UINT);
-#define auxGetDevCaps WINELIB_NAME_AW(auxGetDevCaps)
-UINT16 WINAPI auxSetVolume16(UINT16,DWORD);
-UINT WINAPI auxSetVolume(UINT,DWORD);
+UINT16		WINAPI	auxGetNumDevs16(void);
+UINT		WINAPI	auxGetNumDevs(void);
+UINT16		WINAPI	auxGetDevCaps16 (UINT16,LPAUXCAPS16,UINT16);
+UINT		WINAPI	auxGetDevCapsA(UINT,LPAUXCAPSA,UINT);
+UINT		WINAPI	auxGetDevCapsW(UINT,LPAUXCAPSW,UINT);
+#define 		auxGetDevCaps WINELIB_NAME_AW(auxGetDevCaps)
+UINT16		WINAPI	auxSetVolume16(UINT16,DWORD);
+UINT		WINAPI	auxSetVolume(UINT,DWORD);
 
-UINT16 WINAPI auxGetVolume16(UINT16,LPDWORD);
-UINT WINAPI auxGetVolume(UINT,LPDWORD);
+UINT16		WINAPI	auxGetVolume16(UINT16,LPDWORD);
+UINT		WINAPI	auxGetVolume(UINT,LPDWORD);
 
-DWORD WINAPI auxOutMessage16(UINT16,UINT16,DWORD,DWORD);
-DWORD WINAPI auxOutMessage(UINT,UINT,DWORD,DWORD);
+DWORD		WINAPI	auxOutMessage16(UINT16,UINT16,DWORD,DWORD);
+DWORD		WINAPI	auxOutMessage(UINT,UINT,DWORD,DWORD);
 
 #define TIMERR_NOERROR        (0)                  /* no error */
 #define TIMERR_NOCANDO        (TIMERR_BASE+1)      /* request not completed */
@@ -765,11 +765,11 @@
 typedef void (CALLBACK *LPTIMECALLBACK16)(UINT16 uTimerID, UINT16 uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 typedef void (CALLBACK *LPTIMECALLBACK)(UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2);
 
-#define TIME_ONESHOT		0x0000	/* program timer for single event */
-#define TIME_PERIODIC		0x0001	/* program for continuous periodic event */
-#define TIME_CALLBACK_FUNCTION	0x0000	/* callback is function */
-#define TIME_CALLBACK_EVENT_SET	0x0010	/* callback is event - use SetEvent */
-#define TIME_CALLBACK_EVENT_PULSE 0x0020/* callback is event - use PulseEvent */
+#define TIME_ONESHOT			0x0000	/* program timer for single event */
+#define TIME_PERIODIC			0x0001	/* program for continuous periodic event */
+#define TIME_CALLBACK_FUNCTION		0x0000	/* callback is function */
+#define TIME_CALLBACK_EVENT_SET		0x0010	/* callback is event - use SetEvent */
+#define TIME_CALLBACK_EVENT_PULSE 	0x0020	/* callback is event - use PulseEvent */
 
 typedef struct {
     UINT16	wPeriodMin;	/* minimum period supported  */
@@ -782,19 +782,19 @@
 } TIMECAPS, *LPTIMECAPS;
 
 
-MMRESULT16 WINAPI timeGetSystemTime16(LPMMTIME16,UINT16);
-MMRESULT WINAPI timeGetSystemTime(LPMMTIME,UINT);
-DWORD WINAPI timeGetTime(void);	/* same for win32/win16 */
-MMRESULT16 WINAPI timeSetEvent16(UINT16,UINT16,LPTIMECALLBACK16,DWORD,UINT16);
-MMRESULT WINAPI timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT);
-MMRESULT16 WINAPI timeKillEvent16(UINT16);
-MMRESULT WINAPI timeKillEvent(UINT);
-MMRESULT16 WINAPI timeGetDevCaps16(LPTIMECAPS16,UINT16);
-MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS,UINT);
-MMRESULT16 WINAPI timeBeginPeriod16(UINT16);
-MMRESULT WINAPI timeBeginPeriod(UINT);
-MMRESULT16 WINAPI timeEndPeriod16(UINT16);
-MMRESULT WINAPI timeEndPeriod(UINT);
+MMRESULT16	WINAPI	timeGetSystemTime16(LPMMTIME16,UINT16);
+MMRESULT	WINAPI	timeGetSystemTime(LPMMTIME,UINT);
+DWORD		WINAPI	timeGetTime(void);	/* same for win32/win16 */
+MMRESULT16	WINAPI	timeSetEvent16(UINT16,UINT16,LPTIMECALLBACK16,DWORD,UINT16);
+MMRESULT	WINAPI	timeSetEvent(UINT,UINT,LPTIMECALLBACK,DWORD,UINT);
+MMRESULT16	WINAPI	timeKillEvent16(UINT16);
+MMRESULT	WINAPI	timeKillEvent(UINT);
+MMRESULT16	WINAPI	timeGetDevCaps16(LPTIMECAPS16,UINT16);
+MMRESULT	WINAPI	timeGetDevCaps(LPTIMECAPS,UINT);
+MMRESULT16	WINAPI	timeBeginPeriod16(UINT16);
+MMRESULT	WINAPI	timeBeginPeriod(UINT);
+MMRESULT16	WINAPI	timeEndPeriod16(UINT16);
+MMRESULT	WINAPI	timeEndPeriod(UINT);
 
 #define JOYERR_NOERROR        (0)                  /* no error */
 #define JOYERR_PARMS          (JOYERR_BASE+5)      /* bad parameters */
@@ -802,17 +802,17 @@
 #define JOYERR_UNPLUGGED      (JOYERR_BASE+7)      /* joystick is unplugged */
 
 /* JOYINFO, JOYINFOEX, MM_JOY* */
-#define JOY_BUTTON1         0x0001
-#define JOY_BUTTON2         0x0002
-#define JOY_BUTTON3         0x0004
-#define JOY_BUTTON4         0x0008
-#define JOY_BUTTON1CHG      0x0100
-#define JOY_BUTTON2CHG      0x0200
-#define JOY_BUTTON3CHG      0x0400
-#define JOY_BUTTON4CHG      0x0800
+#define JOY_BUTTON1         	0x0001
+#define JOY_BUTTON2         	0x0002
+#define JOY_BUTTON3         	0x0004
+#define JOY_BUTTON4         	0x0008
+#define JOY_BUTTON1CHG      	0x0100
+#define JOY_BUTTON2CHG      	0x0200
+#define JOY_BUTTON3CHG      	0x0400
+#define JOY_BUTTON4CHG      	0x0800
 
-#define JOYSTICKID1         0
-#define JOYSTICKID2         1
+#define JOYSTICKID1         	0
+#define JOYSTICKID2         	1
 
 /* JOYCAPS.wCaps */
 #define JOYCAPS_HASZ		0x0001
@@ -861,17 +861,17 @@
 typedef struct {
     WORD wMid;                  /* manufacturer ID */
     WORD wPid;                  /* product ID */
-    char szPname[MAXPNAMELEN];  /* product name (NULL terminated string) */
-    UINT16 wXmin;                 /* minimum x position value */
-    UINT16 wXmax;                 /* maximum x position value */
-    UINT16 wYmin;                 /* minimum y position value */
-    UINT16 wYmax;                 /* maximum y position value */
-    UINT16 wZmin;                 /* minimum z position value */
-    UINT16 wZmax;                 /* maximum z position value */
-    UINT16 wNumButtons;           /* number of buttons */
-    UINT16 wPeriodMin;            /* minimum message period when captured */
-    UINT16 wPeriodMax;            /* maximum message period when captured */
-    /* win95,nt4 additions: */
+    char szPname[MAXPNAMELEN];	/* product name (NULL terminated string) */
+    UINT16 wXmin;               /* minimum x position value */
+    UINT16 wXmax;               /* maximum x position value */
+    UINT16 wYmin;               /* minimum y position value */
+    UINT16 wYmax;               /* maximum y position value */
+    UINT16 wZmin;               /* minimum z position value */
+    UINT16 wZmax;               /* maximum z position value */
+    UINT16 wNumButtons;         /* number of buttons */
+    UINT16 wPeriodMin;          /* minimum message period when captured */
+    UINT16 wPeriodMax;          /* maximum message period when captured */
+                                /* win95,nt4 additions: */
     UINT16 wRmin;		/* minimum r position value */
     UINT16 wRmax;		/* maximum r position value */
     UINT16 wUmin;		/* minimum u (5th axis) position value */
@@ -973,31 +973,31 @@
 } JOYINFOEX,*LPJOYINFOEX;
 
 
-MMRESULT16 WINAPI joyGetDevCaps16 (UINT16,LPJOYCAPS16 ,UINT16);
-MMRESULT WINAPI joyGetDevCapsA(UINT,LPJOYCAPSA,UINT);
-MMRESULT WINAPI joyGetDevCapsW(UINT,LPJOYCAPSW,UINT);
+MMRESULT16	WINAPI	joyGetDevCaps16 (UINT16,LPJOYCAPS16 ,UINT16);
+MMRESULT	WINAPI	joyGetDevCapsA(UINT,LPJOYCAPSA,UINT);
+MMRESULT	WINAPI	joyGetDevCapsW(UINT,LPJOYCAPSW,UINT);
 #define joyGetDevCaps WINELIB_NAME_AW(joyGetDevCaps)
-UINT16 WINAPI joyGetNumDevs16(void);
-UINT WINAPI joyGetNumDevs(void);
-MMRESULT16 WINAPI joyGetPos16(UINT16,LPJOYINFO16);
-MMRESULT WINAPI joyGetPos(UINT,LPJOYINFO);
-MMRESULT WINAPI joyGetPosEx(UINT,LPJOYINFOEX);
-MMRESULT16 WINAPI joyGetThreshold16(UINT16,UINT16*);
-MMRESULT WINAPI joyGetThreshold(UINT,UINT*);
-MMRESULT16 WINAPI joyReleaseCapture16(UINT16);
-MMRESULT WINAPI joyReleaseCapture(UINT);
-MMRESULT16 WINAPI joySetCapture16(HWND16,UINT16,UINT16,BOOL16);
-MMRESULT WINAPI joySetCapture(HWND,UINT,UINT,BOOL);
-MMRESULT16 WINAPI joySetThreshold16(UINT16,UINT16);
-MMRESULT WINAPI joySetThreshold(UINT,UINT);
+UINT16		WINAPI	joyGetNumDevs16(void);
+UINT		WINAPI	joyGetNumDevs(void);
+MMRESULT16	WINAPI	joyGetPos16(UINT16,LPJOYINFO16);
+MMRESULT	WINAPI	joyGetPos(UINT,LPJOYINFO);
+MMRESULT	WINAPI	joyGetPosEx(UINT,LPJOYINFOEX);
+MMRESULT16	WINAPI	joyGetThreshold16(UINT16,UINT16*);
+MMRESULT	WINAPI	joyGetThreshold(UINT,UINT*);
+MMRESULT16	WINAPI	joyReleaseCapture16(UINT16);
+MMRESULT	WINAPI	joyReleaseCapture(UINT);
+MMRESULT16	WINAPI	joySetCapture16(HWND16,UINT16,UINT16,BOOL16);
+MMRESULT	WINAPI	joySetCapture(HWND,UINT,UINT,BOOL);
+MMRESULT16	WINAPI	joySetThreshold16(UINT16,UINT16);
+MMRESULT	WINAPI	joySetThreshold(UINT,UINT);
 
 typedef struct {
-	WORD		wMid;		/* manufacturer id */
-	WORD		wPid;		/* product id */
+	WORD		wMid;			/* manufacturer id */
+	WORD		wPid;			/* product id */
 	MMVERSION16	vDriverVersion;		/* version of the driver */
 	CHAR		szPname[MAXPNAMELEN];	/* product name */
-	DWORD		fdwSupport;	/* misc. support bits */
-	DWORD		cDestinations;	/* count of destinations */
+	DWORD		fdwSupport;		/* misc. support bits */
+	DWORD		cDestinations;		/* count of destinations */
 } MIXERCAPS16,*LPMIXERCAPS16;
 
 typedef struct {
@@ -1021,8 +1021,8 @@
 DECL_WINELIB_TYPE_AW(MIXERCAPS)
 DECL_WINELIB_TYPE_AW(LPMIXERCAPS)
 
-#define MIXER_SHORT_NAME_CHARS	16
-#define MIXER_LONG_NAME_CHARS	64
+#define MIXER_SHORT_NAME_CHARS		16
+#define MIXER_LONG_NAME_CHARS		64
 
 /*  MIXERLINE.fdwLine */
 #define	MIXERLINE_LINEF_ACTIVE		0x00000001
@@ -1138,9 +1138,9 @@
 DECL_WINELIB_TYPE_AW(LPMIXERLINE)
 
 /*  MIXERCONTROL.fdwControl */
-#define	MIXERCONTROL_CONTROLF_UNIFORM	0x00000001L
-#define	MIXERCONTROL_CONTROLF_MULTIPLE	0x00000002L
-#define	MIXERCONTROL_CONTROLF_DISABLED	0x80000000L
+#define	MIXERCONTROL_CONTROLF_UNIFORM		0x00000001L
+#define	MIXERCONTROL_CONTROLF_MULTIPLE		0x00000002L
+#define	MIXERCONTROL_CONTROLF_DISABLED		0x80000000L
 
 /*  MIXERCONTROL_CONTROLTYPE_xxx building block defines */
 #define	MIXERCONTROL_CT_CLASS_MASK		0xF0000000L
@@ -1410,34 +1410,34 @@
 #define	MIXER_SETCONTROLDETAILSF_CUSTOM		0x00000001L
 #define	MIXER_SETCONTROLDETAILSF_QUERYMASK	0x0000000FL
 
-UINT16 WINAPI mixerGetNumDevs16(void);
-UINT WINAPI mixerGetNumDevs(void);
-UINT16 WINAPI mixerOpen16(LPHMIXER16,UINT16,DWORD,DWORD,DWORD);
-UINT WINAPI mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD);
-UINT16 WINAPI mixerClose16(HMIXER16);
-UINT WINAPI mixerClose(HMIXER);
-UINT16 WINAPI mixerMessage16(HMIXER16,UINT16,DWORD,DWORD);
-UINT WINAPI mixerMessage(HMIXER,UINT,DWORD,DWORD);
-UINT16 WINAPI mixerGetDevCaps16(UINT16,LPMIXERCAPS16,UINT16);
-UINT WINAPI mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT);
-UINT WINAPI mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT);
-#define mixerGetDevCaps WINELIB_NAME_AW(mixerGetDevCaps)
-UINT16 WINAPI mixerGetLineInfo16(HMIXEROBJ16,LPMIXERLINE16,DWORD);
-UINT WINAPI mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD);
-UINT WINAPI mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD);
-#define mixerGetLineInfo WINELIB_NAME_AW(mixerGetLineInfo)
-UINT16 WINAPI mixerGetID16(HMIXEROBJ16,LPUINT16,DWORD);
-UINT WINAPI mixerGetID(HMIXEROBJ,LPUINT,DWORD);
-UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16,LPMIXERLINECONTROLS16,DWORD);
-UINT WINAPI mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD);
-UINT WINAPI mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD);
-#define mixerGetLineControl WINELIB_NAME_AW(mixerGetLineControl)
-UINT16 WINAPI mixerGetControlDetails16(HMIXEROBJ16,LPMIXERCONTROLDETAILS16,DWORD);
-UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
-UINT WINAPI mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
-#define mixerGetControlDetails WINELIB_NAME_AW(mixerGetControlDetails)
-UINT16 WINAPI mixerSetControlDetails16(HMIXEROBJ16,LPMIXERCONTROLDETAILS16,DWORD);
-UINT WINAPI mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+UINT16		WINAPI	mixerGetNumDevs16(void);
+UINT		WINAPI	mixerGetNumDevs(void);
+UINT16		WINAPI	mixerOpen16(LPHMIXER16,UINT16,DWORD,DWORD,DWORD);
+UINT		WINAPI	mixerOpen(LPHMIXER,UINT,DWORD,DWORD,DWORD);
+UINT16		WINAPI	mixerClose16(HMIXER16);
+UINT		WINAPI	mixerClose(HMIXER);
+UINT16		WINAPI	mixerMessage16(HMIXER16,UINT16,DWORD,DWORD);
+UINT		WINAPI	mixerMessage(HMIXER,UINT,DWORD,DWORD);
+UINT16		WINAPI	mixerGetDevCaps16(UINT16,LPMIXERCAPS16,UINT16);
+UINT		WINAPI	mixerGetDevCapsA(UINT,LPMIXERCAPSA,UINT);
+UINT		WINAPI	mixerGetDevCapsW(UINT,LPMIXERCAPSW,UINT);
+#define 		mixerGetDevCaps WINELIB_NAME_AW(mixerGetDevCaps)
+UINT16		WINAPI	mixerGetLineInfo16(HMIXEROBJ16,LPMIXERLINE16,DWORD);
+UINT		WINAPI	mixerGetLineInfoA(HMIXEROBJ,LPMIXERLINEA,DWORD);
+UINT		WINAPI	mixerGetLineInfoW(HMIXEROBJ,LPMIXERLINEW,DWORD);
+#define 		mixerGetLineInfo WINELIB_NAME_AW(mixerGetLineInfo)
+UINT16		WINAPI	mixerGetID16(HMIXEROBJ16,LPUINT16,DWORD);
+UINT		WINAPI	mixerGetID(HMIXEROBJ,LPUINT,DWORD);
+UINT16		WINAPI	mixerGetLineControls16(HMIXEROBJ16,LPMIXERLINECONTROLS16,DWORD);
+UINT		WINAPI	mixerGetLineControlsA(HMIXEROBJ,LPMIXERLINECONTROLSA,DWORD);
+UINT		WINAPI	mixerGetLineControlsW(HMIXEROBJ,LPMIXERLINECONTROLSW,DWORD);
+#define 		mixerGetLineControl WINELIB_NAME_AW(mixerGetLineControl)
+UINT16		WINAPI	mixerGetControlDetails16(HMIXEROBJ16,LPMIXERCONTROLDETAILS16,DWORD);
+UINT		WINAPI	mixerGetControlDetailsA(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+UINT		WINAPI	mixerGetControlDetailsW(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
+#define 		mixerGetControlDetails WINELIB_NAME_AW(mixerGetControlDetails)
+UINT16		WINAPI	mixerSetControlDetails16(HMIXEROBJ16,LPMIXERCONTROLDETAILS16,DWORD);
+UINT		WINAPI	mixerSetControlDetails(HMIXEROBJ,LPMIXERCONTROLDETAILS,DWORD);
 
 #define MMIOERR_BASE            256
 #define MMIOERR_FILENOTFOUND    (MMIOERR_BASE + 1)  /* file not found */
@@ -1457,7 +1457,7 @@
 typedef LONG (CALLBACK *LPMMIOPROC16)(LPSTR lpmmioinfo, UINT16 uMessage,
                                       LPARAM lParam1, LPARAM lParam2);
 typedef LONG (CALLBACK *LPMMIOPROC)(LPSTR lpmmioinfo, UINT uMessage,
-                                      LPARAM lParam1, LPARAM lParam2);
+				    LPARAM lParam1, LPARAM lParam2);
 
 typedef struct {
         DWORD		dwFlags;	/* general status flags */
@@ -1575,86 +1575,86 @@
                 ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) |    \
                 ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
 
-LPMMIOPROC16 WINAPI mmioInstallIOProc16(FOURCC,LPMMIOPROC16,DWORD);
-LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD);
-LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD);
-#define      mmioInstallIOProc WINELIB_NAME_AW(mmioInstallIOProc)
+LPMMIOPROC16	WINAPI 	mmioInstallIOProc16(FOURCC,LPMMIOPROC16,DWORD);
+LPMMIOPROC 	WINAPI 	mmioInstallIOProcA(FOURCC,LPMMIOPROC,DWORD);
+LPMMIOPROC 	WINAPI 	mmioInstallIOProcW(FOURCC,LPMMIOPROC,DWORD);
+#define      		mmioInstallIOProc WINELIB_NAME_AW(mmioInstallIOProc)
 
-FOURCC WINAPI	mmioStringToFOURCC16(LPCSTR,UINT16);
-FOURCC WINAPI	mmioStringToFOURCCA(LPCSTR,UINT);
-FOURCC WINAPI	mmioStringToFOURCCW(LPCWSTR,UINT);
-#define mmioStringToFOURCC WINELIB_NAME_AW(mmioStringToFOURCC)
-HMMIO16	WINAPI	mmioOpen16 (LPSTR ,MMIOINFO16*,DWORD);
-HMMIO	WINAPI	mmioOpenA(LPSTR ,MMIOINFO*,DWORD);
-HMMIO	WINAPI	mmioOpenW(LPWSTR,MMIOINFO*,DWORD);
-#define		mmioOpen WINELIB_NAME_AW(mmioOpen)
+FOURCC 		WINAPI	mmioStringToFOURCC16(LPCSTR,UINT16);
+FOURCC 		WINAPI	mmioStringToFOURCCA(LPCSTR,UINT);
+FOURCC 		WINAPI	mmioStringToFOURCCW(LPCWSTR,UINT);
+#define 		mmioStringToFOURCC WINELIB_NAME_AW(mmioStringToFOURCC)
+HMMIO16		WINAPI	mmioOpen16 (LPSTR ,MMIOINFO16*,DWORD);
+HMMIO		WINAPI	mmioOpenA(LPSTR ,MMIOINFO*,DWORD);
+HMMIO		WINAPI	mmioOpenW(LPWSTR,MMIOINFO*,DWORD);
+#define			mmioOpen WINELIB_NAME_AW(mmioOpen)
 
-UINT16 WINAPI	mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName,
-     MMIOINFO16 * lpmmioinfo, DWORD dwRenameFlags);
-UINT WINAPI	mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName,
-     MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
-UINT WINAPI	mmioRenameW(LPCWSTR szFileName, LPCWSTR szNewFileName,
-     MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
-#define 	mmioRename WINELIB_NAME_AW(mmioRename)
+UINT16 		WINAPI	mmioRename16(LPCSTR szFileName, LPCSTR szNewFileName,
+				     MMIOINFO16 * lpmmioinfo, DWORD dwRenameFlags);
+UINT 		WINAPI	mmioRenameA(LPCSTR szFileName, LPCSTR szNewFileName,
+				    MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
+UINT 		WINAPI	mmioRenameW(LPCWSTR szFileName, LPCWSTR szNewFileName,
+				    MMIOINFO * lpmmioinfo, DWORD dwRenameFlags);
+#define 		mmioRename WINELIB_NAME_AW(mmioRename)
 
-MMRESULT16 WINAPI mmioClose16(HMMIO16,UINT16);
-MMRESULT WINAPI mmioClose(HMMIO,UINT);
-LONG WINAPI	mmioRead16(HMMIO16,HPSTR,LONG);
-LONG WINAPI	mmioRead(HMMIO,HPSTR,LONG);
-LONG WINAPI	mmioWrite16(HMMIO16,HPCSTR,LONG);
-LONG WINAPI	mmioWrite(HMMIO,HPCSTR,LONG);
-LONG WINAPI	mmioSeek16(HMMIO16,LONG,INT16);
-LONG WINAPI	mmioSeek(HMMIO,LONG,INT);
-MMRESULT16 WINAPI	mmioGetInfo16(HMMIO16,MMIOINFO16*,UINT16);
-MMRESULT WINAPI	mmioGetInfo(HMMIO,MMIOINFO*,UINT);
-MMRESULT16 WINAPI	mmioSetInfo16(HMMIO16,const MMIOINFO16*,UINT16);
-MMRESULT WINAPI	mmioSetInfo(HMMIO,const MMIOINFO*,UINT);
-UINT16 WINAPI	mmioSetBuffer16(HMMIO16,LPSTR,LONG,UINT16);
-UINT WINAPI	mmioSetBuffer(HMMIO,LPSTR,LONG,UINT);
-UINT16 WINAPI	mmioFlush16(HMMIO16,UINT16);
-UINT WINAPI	mmioFlush(HMMIO,UINT);
-UINT16 WINAPI	mmioAdvance16(HMMIO16,MMIOINFO16*,UINT16);
-UINT WINAPI	mmioAdvance(HMMIO,MMIOINFO*,UINT);
-LONG WINAPI mmioSendMessage(HMMIO16,UINT16,LPARAM,LPARAM);
-UINT16 WINAPI mmioDescend(HMMIO16,MMCKINFO*,const MMCKINFO*,UINT16);
+MMRESULT16 	WINAPI	mmioClose16(HMMIO16,UINT16);
+MMRESULT 	WINAPI	mmioClose(HMMIO,UINT);
+LONG 		WINAPI	mmioRead16(HMMIO16,HPSTR,LONG);
+LONG 		WINAPI	mmioRead(HMMIO,HPSTR,LONG);
+LONG 		WINAPI	mmioWrite16(HMMIO16,HPCSTR,LONG);
+LONG 		WINAPI	mmioWrite(HMMIO,HPCSTR,LONG);
+LONG 		WINAPI	mmioSeek16(HMMIO16,LONG,INT16);
+LONG 		WINAPI	mmioSeek(HMMIO,LONG,INT);
+MMRESULT16	WINAPI	mmioGetInfo16(HMMIO16,MMIOINFO16*,UINT16);
+MMRESULT 	WINAPI	mmioGetInfo(HMMIO,MMIOINFO*,UINT);
+MMRESULT16 	WINAPI	mmioSetInfo16(HMMIO16,const MMIOINFO16*,UINT16);
+MMRESULT 	WINAPI	mmioSetInfo(HMMIO,const MMIOINFO*,UINT);
+UINT16 		WINAPI	mmioSetBuffer16(HMMIO16,LPSTR,LONG,UINT16);
+UINT 		WINAPI	mmioSetBuffer(HMMIO,LPSTR,LONG,UINT);
+UINT16 		WINAPI	mmioFlush16(HMMIO16,UINT16);
+UINT 		WINAPI	mmioFlush(HMMIO,UINT);
+UINT16 		WINAPI	mmioAdvance16(HMMIO16,MMIOINFO16*,UINT16);
+UINT 		WINAPI	mmioAdvance(HMMIO,MMIOINFO*,UINT);
+LONG 		WINAPI	mmioSendMessage(HMMIO16,UINT16,LPARAM,LPARAM);
+UINT16		WINAPI	mmioDescend(HMMIO16,MMCKINFO*,const MMCKINFO*,UINT16);
 
-UINT16 WINAPI	mmioAscend16(HMMIO16,MMCKINFO*,UINT16);
-UINT WINAPI	mmioAscend(HMMIO,MMCKINFO*,UINT);
-UINT16 WINAPI 	mmioCreateChunk16(HMMIO16,MMCKINFO*,UINT16);
-UINT WINAPI 	mmioCreateChunk(HMMIO,MMCKINFO*,UINT);
+UINT16		WINAPI	mmioAscend16(HMMIO16,MMCKINFO*,UINT16);
+UINT		WINAPI	mmioAscend(HMMIO,MMCKINFO*,UINT);
+UINT16		WINAPI 	mmioCreateChunk16(HMMIO16,MMCKINFO*,UINT16);
+UINT		WINAPI	mmioCreateChunk(HMMIO,MMCKINFO*,UINT);
 
 typedef UINT16 (CALLBACK *YIELDPROC)(UINT16,DWORD);
 
-DWORD WINAPI mciSendCommand16(UINT16,UINT16,DWORD,DWORD);
-DWORD WINAPI mciSendCommandA(UINT,UINT,DWORD,DWORD);
-DWORD WINAPI mciSendCommandW(UINT,UINT,DWORD,DWORD);
-#define mciSendCommand WINELIB_NAME_AW(mciSendCommand)
+DWORD		WINAPI	mciSendCommand16(UINT16,UINT16,DWORD,DWORD);
+DWORD		WINAPI	mciSendCommandA(UINT,UINT,DWORD,DWORD);
+DWORD		WINAPI	mciSendCommandW(UINT,UINT,DWORD,DWORD);
+#define 		mciSendCommand WINELIB_NAME_AW(mciSendCommand)
 
-DWORD WINAPI mciSendString16(LPCSTR,LPSTR,UINT16,HWND16);
-DWORD WINAPI mciSendStringA(LPCSTR,LPSTR,UINT,HWND);
-DWORD WINAPI mciSendStringW(LPCWSTR,LPSTR,UINT,HWND);
-#define mciSendString WINELIB_NAME_AW(mciSendString)
+DWORD		WINAPI	mciSendString16(LPCSTR,LPSTR,UINT16,HWND16);
+DWORD		WINAPI	mciSendStringA(LPCSTR,LPSTR,UINT,HWND);
+DWORD		WINAPI	mciSendStringW(LPCWSTR,LPSTR,UINT,HWND);
+#define 		mciSendString WINELIB_NAME_AW(mciSendString)
 
-UINT16 WINAPI mciGetDeviceID16(LPCSTR);
-UINT WINAPI mciGetDeviceIDA(LPCSTR);
-UINT WINAPI mciGetDeviceIDW(LPCWSTR);
-#define mciGetDeviceID WINELIB_NAME_AW(mciGetDeviceID)
+UINT16		WINAPI	mciGetDeviceID16(LPCSTR);
+UINT		WINAPI	mciGetDeviceIDA(LPCSTR);
+UINT		WINAPI	mciGetDeviceIDW(LPCWSTR);
+#define 		mciGetDeviceID WINELIB_NAME_AW(mciGetDeviceID)
 
-UINT16 WINAPI mciGetDeviceIDFromElementID16(DWORD,LPCSTR);
+UINT16		WINAPI	mciGetDeviceIDFromElementID16(DWORD,LPCSTR);
 
-BOOL16 WINAPI mciGetErrorString16 (DWORD,LPSTR,UINT16);
-BOOL WINAPI mciGetErrorStringA(DWORD,LPSTR,UINT);
-BOOL WINAPI mciGetErrorStringW(DWORD,LPWSTR,UINT);
-#define mciGetErrorString WINELIB_NAME_AW(mciGetErrorString)
+BOOL16		WINAPI	mciGetErrorString16 (DWORD,LPSTR,UINT16);
+BOOL		WINAPI	mciGetErrorStringA(DWORD,LPSTR,UINT);
+BOOL		WINAPI	mciGetErrorStringW(DWORD,LPWSTR,UINT);
+#define 		mciGetErrorString WINELIB_NAME_AW(mciGetErrorString)
 
-BOOL16 WINAPI mciSetYieldProc16(UINT16,YIELDPROC,DWORD);
-BOOL WINAPI mciSetYieldProc(UINT,YIELDPROC,DWORD);
+BOOL16		WINAPI	mciSetYieldProc16(UINT16,YIELDPROC,DWORD);
+BOOL		WINAPI	mciSetYieldProc(UINT,YIELDPROC,DWORD);
 
-HTASK16 WINAPI mciGetCreatorTask16(UINT16);
-HTASK WINAPI mciGetCreatorTask(UINT);
+HTASK16		WINAPI	mciGetCreatorTask16(UINT16);
+HTASK		WINAPI	mciGetCreatorTask(UINT);
 
-YIELDPROC WINAPI mciGetYieldProc16(UINT16,DWORD*);
-YIELDPROC WINAPI mciGetYieldProc(UINT,DWORD*);
+YIELDPROC	WINAPI	mciGetYieldProc16(UINT16,DWORD*);
+YIELDPROC	WINAPI	mciGetYieldProc(UINT,DWORD*);
 
 #define MCIERR_INVALID_DEVICE_ID        (MCIERR_BASE + 1)
 #define MCIERR_UNRECOGNIZED_KEYWORD     (MCIERR_BASE + 3)
@@ -1736,10 +1736,10 @@
 
 #define MCIERR_CUSTOM_DRIVER_BASE       (MCIERR_BASE + 256)
 
-#define MCI_OPEN_DRIVER					0x0801
-#define MCI_CLOSE_DRIVER				0x0802
-#define MCI_OPEN						0x0803
-#define MCI_CLOSE						0x0804
+#define MCI_OPEN_DRIVER			0x0801
+#define MCI_CLOSE_DRIVER		0x0802
+#define MCI_OPEN			0x0803
+#define MCI_CLOSE			0x0804
 #define MCI_ESCAPE                      0x0805
 #define MCI_PLAY                        0x0806
 #define MCI_SEEK                        0x0807
@@ -2639,16 +2639,16 @@
 
 #define MODM_GETNUMDEVS		1
 #define MODM_GETDEVCAPS		2
-#define MODM_OPEN			3
-#define MODM_CLOSE			4
+#define MODM_OPEN		3
+#define MODM_CLOSE		4
 #define MODM_PREPARE		5
 #define MODM_UNPREPARE		6
-#define MODM_DATA			7
+#define MODM_DATA		7
 #define MODM_LONGDATA		8
-#define MODM_RESET          9
+#define MODM_RESET          	9
 #define MODM_GETVOLUME		10
 #define MODM_SETVOLUME		11
-#define MODM_CACHEPATCHES		12      
+#define MODM_CACHEPATCHES	12      
 #define MODM_CACHEDRUMPATCHES	13     
 
 #define MIDM_GETNUMDEVS  53
@@ -2803,52 +2803,52 @@
 	UINT	wType;			/* driver type (filled in by the driver) */
 } MCI_OPEN_DRIVER_PARMSW, *LPMCI_OPEN_DRIVER_PARMSW;
 
-DWORD  WINAPI mciGetDriverData16(UINT16 uDeviceID);
-DWORD  WINAPI mciGetDriverData(UINT uDeviceID);
+DWORD 		WINAPI	mciGetDriverData16(UINT16 uDeviceID);
+DWORD 		WINAPI	mciGetDriverData(UINT uDeviceID);
 
-BOOL16 WINAPI mciSetDriverData16(UINT16 uDeviceID, DWORD dwData);
-BOOL WINAPI mciSetDriverData(UINT uDeviceID, DWORD dwData);
+BOOL16		WINAPI	mciSetDriverData16(UINT16 uDeviceID, DWORD dwData);
+BOOL		WINAPI	mciSetDriverData(UINT uDeviceID, DWORD dwData);
 
-UINT16 WINAPI mciDriverYield16(UINT16 uDeviceID);
-UINT WINAPI mciDriverYield(UINT uDeviceID);
+UINT16		WINAPI	mciDriverYield16(UINT16 uDeviceID);
+UINT		WINAPI	mciDriverYield(UINT uDeviceID);
 
-BOOL16 WINAPI mciDriverNotify16(HWND16 hwndCallback, UINT16 uDeviceID,
-                              UINT16 uStatus);
-BOOL WINAPI mciDriverNotify(HWND hwndCallback, UINT uDeviceID,
-				UINT uStatus);
+BOOL16		WINAPI	mciDriverNotify16(HWND16 hwndCallback, UINT16 uDeviceID,
+					  UINT16 uStatus);
+BOOL		WINAPI	mciDriverNotify(HWND hwndCallback, UINT uDeviceID,
+					UINT uStatus);
 
-UINT16 WINAPI mciLoadCommandResource16(HINSTANCE16 hInstance,
-                                     LPCSTR lpResName, UINT16 uType);
-UINT WINAPI mciLoadCommandResource(HINSTANCE hInstance,
-				       LPCWSTR lpResName, UINT uType);
+UINT16		WINAPI	mciLoadCommandResource16(HINSTANCE16 hInstance,
+						 LPCSTR lpResName, UINT16 uType);
+UINT		WINAPI	mciLoadCommandResource(HINSTANCE hInstance,
+					       LPCWSTR lpResName, UINT uType);
 
-BOOL16 WINAPI mciFreeCommandResource16(UINT16 uTable);
-BOOL WINAPI mciFreeCommandResource(UINT uTable);
+BOOL16		WINAPI	mciFreeCommandResource16(UINT16 uTable);
+BOOL		WINAPI	mciFreeCommandResource(UINT uTable);
 
 #define DCB_NULL		0x0000
 #define DCB_WINDOW		0x0001			/* dwCallback is a HWND */
 #define DCB_TASK		0x0002			/* dwCallback is a HTASK */
-#define DCB_FUNCTION	0x0003			/* dwCallback is a FARPROC */
-#define DCB_FUNC32	0x0007			/* (ugly hack) 32-bit FARPROC */
-#define DCB_TYPEMASK	0x0007
-#define DCB_NOSWITCH	0x0008			/* don't switch stacks for callback */
+#define DCB_FUNCTION		0x0003			/* dwCallback is a FARPROC */
+#define DCB_FUNC32		0x0007			/* (ugly hack) 32-bit FARPROC */
+#define DCB_TYPEMASK		0x0007
+#define DCB_NOSWITCH		0x0008			/* don't switch stacks for callback */
 
-BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
-                             WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
-DWORD WINAPI auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
+BOOL16		WINAPI	DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
+					 WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
 
 #pragma pack(4)
-DWORD WINAPI mixMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
-DWORD WINAPI midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
-DWORD WINAPI modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
-DWORD WINAPI widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
-DWORD WINAPI wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
-					DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	mixMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
+DWORD		WINAPI	wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, 
+				   DWORD dwParam1, DWORD dwParam2);
 #pragma pack(4)
 
 #ifdef __cplusplus
diff --git a/include/multimedia.h b/include/multimedia.h
index 3a2d3b5..cf969e6 100644
--- a/include/multimedia.h
+++ b/include/multimedia.h
@@ -49,38 +49,59 @@
 	DWORD			dwPrivate;
 };
 
+extern struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
+
+#define MCI_GetDrv(wDevID) 		(&mciDrv[MCI_DevIDToIndex(wDevID)])
+#define MCI_GetOpenDrv(wDevID)	(&(MCI_GetDrv(wDevID)->mop))
+
 /* function prototypes */
 extern BOOL MULTIMEDIA_Init(void);
 
-extern int    		MCI_DevIDToIndex(UINT16 wDevID);
-extern UINT16 		MCI_FirstDevID(void);
-extern UINT16 		MCI_NextDevID(UINT16 wDevID);
-extern BOOL 		MCI_DevIDValid(UINT16 wDevID);
+extern int    			MCI_DevIDToIndex(UINT16 wDevID);
+extern UINT16 			MCI_FirstDevID(void);
+extern UINT16 			MCI_NextDevID(UINT16 wDevID);
+extern BOOL 			MCI_DevIDValid(UINT16 wDevID);
 
-extern int		MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam);
-extern int		MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam);
+extern int			MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam);
+extern int			MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam);
 
-typedef LONG		(*MCIPROC16)(DWORD, HDRVR16,  WORD, DWORD, DWORD);
-typedef LONG		(*MCIPROC)(DWORD, HDRVR16, DWORD, DWORD, DWORD);
+extern DWORD 			MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms);
+extern DWORD 			MCI_Close(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms);
+extern DWORD 			MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSA lpParms);
 
-extern MCIPROC	MCI_GetProc(UINT16 uDevType);
-extern WORD		   MCI_GetDevType(LPCSTR str);
-extern DWORD		MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr);
-extern const char* MCI_CommandToString(UINT16 wMsg);
+typedef LONG			(*MCIPROC16)(DWORD, HDRVR16,  WORD, DWORD, DWORD);
+typedef LONG			(*MCIPROC)(DWORD, HDRVR16, DWORD, DWORD, DWORD);
 
+extern WORD		   	MCI_GetDevType(LPCSTR str);
+extern DWORD			MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr);
+extern const char* 		MCI_CommandToString(UINT16 wMsg);
 
-extern DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
-extern DWORD MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2, UINT size);
+extern int			mciInstalledCount;
+extern int			mciInstalledListLen;
+extern LPSTR			lpmciInstallNames;
 
-LONG MCIWAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-			  DWORD dwParam1, DWORD dwParam2);
-LONG MCIMIDI_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-			  DWORD dwParam1, DWORD dwParam2);
-LONG MCICDAUDIO_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-			     DWORD dwParam1, DWORD dwParam2);
-LONG MCIANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-			  DWORD dwParam1, DWORD dwParam2);
-LONG MCIAVI_DriverProc32(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
-			  DWORD dwParam1, DWORD dwParam2);
+typedef struct {
+    WORD	uDevType;
+    char*	lpstrName;
+    MCIPROC	lpfnProc;
+} MCI_WineDesc;
+
+extern	MCI_WineDesc		MCI_InternalDescriptors[];
+
+extern LRESULT			MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2, BOOL bIs32);
+
+extern DWORD 			MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2);
+extern DWORD 			MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2, UINT size);
+
+LONG 				MCIWAVE_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
+						   DWORD dwParam1, DWORD dwParam2);
+LONG 				MCIMIDI_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
+						   DWORD dwParam1, DWORD dwParam2);
+LONG				MCICDAUDIO_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
+						      DWORD dwParam1, DWORD dwParam2);
+LONG				MCIANIM_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
+						   DWORD dwParam1, DWORD dwParam2);
+LONG				MCIAVI_DriverProc(DWORD dwDevID, HDRVR16 hDriv, DWORD wMsg, 
+						  DWORD dwParam1, DWORD dwParam2);
 
 #endif /* __WINE_MULTIMEDIA_H */
diff --git a/multimedia/Makefile.in b/multimedia/Makefile.in
index d0f6527..7b5792c 100644
--- a/multimedia/Makefile.in
+++ b/multimedia/Makefile.in
@@ -11,6 +11,7 @@
 	dsound.c \
 	init.c \
 	joystick.c \
+	mci.c \
 	mcianim.c \
 	mciavi.c \
 	mcicda.c \
diff --git a/multimedia/mci.c b/multimedia/mci.c
new file mode 100644
index 0000000..b78de0bd
--- /dev/null
+++ b/multimedia/mci.c
@@ -0,0 +1,1331 @@
+/* -*- tab-width: 8; c-basic-offset: 4 -*- */
+
+/*
+ * MCI internal functions
+ *
+ * Copyright 1998/1999 Eric Pouech
+ */
+
+#include <string.h>
+
+#include "winbase.h"
+#include "winuser.h"
+#include "heap.h"
+#include "driver.h"
+#include "mmsystem.h"
+#include "multimedia.h"
+#include "selectors.h"
+#include "debug.h"
+#include "digitalv.h"
+
+struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
+
+int	mciInstalledCount;
+int	mciInstalledListLen;
+LPSTR	lpmciInstallNames = NULL;
+
+/* The wDevID's returned by wine were originally in the range 
+ * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
+ * Unfortunately, ms-windows uses wDevID of zero to indicate
+ * errors.  Now, multimedia drivers must pass the wDevID through
+ * MCI_DevIDToIndex to get an index in that range.  An
+ * arbitrary value, MCI_MAGIC is added to the wDevID seen
+ * by the windows programs.
+ */
+
+#define MCI_MAGIC 0x0F00
+
+MCI_WineDesc	MCI_InternalDescriptors[] = {
+    {MCI_DEVTYPE_CD_AUDIO,		"CDAUDIO", 	MCICDAUDIO_DriverProc},
+    {MCI_DEVTYPE_WAVEFORM_AUDIO,	"WAVEAUDIO",	MCIWAVE_DriverProc},
+    {MCI_DEVTYPE_SEQUENCER,		"SEQUENCER", 	MCIMIDI_DriverProc},
+    {MCI_DEVTYPE_ANIMATION,		"ANIMATION1", 	MCIANIM_DriverProc},
+    {MCI_DEVTYPE_DIGITAL_VIDEO,		"AVIVIDEO", 	MCIAVI_DriverProc},
+    {0xFFFF,				NULL,		NULL}	/* sentinel */
+};
+
+/**************************************************************************
+ * 				MCI_GetDevTypeString		[internal]
+ */
+static	LPCSTR		MCI_GetDevTypeString(WORD uDevType)
+{
+    LPCSTR	str = "??? MCI ???";
+    int		i;
+
+    for (i = 0; MCI_InternalDescriptors[i].uDevType != 0xFFFF; i++) {
+	if (MCI_InternalDescriptors[i].uDevType != 0 && MCI_InternalDescriptors[i].uDevType == uDevType) {
+	    str = MCI_InternalDescriptors[i].lpstrName;
+	    break;
+	}
+    }
+    /*    TRACE(mci, "devType=%u => %s\n", uDevType, str);*/
+    return str;
+}
+
+/**************************************************************************
+ * 				MCI_GetProc			[internal]
+ */
+static	MCIPROC		MCI_GetProc(UINT16 uDevType)
+{
+    MCIPROC	proc = 0;
+    int		i;
+
+    for (i = 0; MCI_InternalDescriptors[i].uDevType != 0xFFFF; i++) {
+	if (MCI_InternalDescriptors[i].uDevType != 0 && 
+	    MCI_InternalDescriptors[i].uDevType == uDevType) {
+	    proc = MCI_InternalDescriptors[i].lpfnProc;
+	    break;
+	}
+    }
+    return proc;
+}
+
+/**************************************************************************
+ * 				MCI_GetDevType			[internal]
+ */
+WORD		MCI_GetDevType(LPCSTR str)
+{
+    WORD 	uDevType = 0;
+    int		i;
+
+    for (i = 0; MCI_InternalDescriptors[i].uDevType != 0xFFFF; i++) {
+	if (MCI_InternalDescriptors[i].uDevType != 0 && 
+	    strcmp(str, MCI_InternalDescriptors[i].lpstrName) == 0) {
+	    uDevType = MCI_InternalDescriptors[i].uDevType;
+	    break;
+	}
+    }
+    return uDevType;
+}
+
+/**************************************************************************
+ * 				MCI_DevIDToIndex		[internal]
+ */
+int MCI_DevIDToIndex(UINT16 wDevID) 
+{
+    return wDevID - MCI_MAGIC;
+}
+
+/**************************************************************************
+ * 				MCI_FirstDevId			[internal]
+ */
+UINT16 MCI_FirstDevID(void)
+{
+    return MCI_MAGIC;
+}
+
+/**************************************************************************
+ * 				MCI_NextDevId			[internal]
+ */
+UINT16 MCI_NextDevID(UINT16 wDevID) 
+{
+    return wDevID + 1;
+}
+
+/**************************************************************************
+ * 				MCI_DevIDValid			[internal]
+ */
+BOOL MCI_DevIDValid(UINT16 wDevID) 
+{
+    return wDevID >= MCI_MAGIC && wDevID < (MCI_MAGIC + MAXMCIDRIVERS);
+}
+
+/**************************************************************************
+ * 			MCI_CommandToString			[internal]
+ */
+const char* MCI_CommandToString(UINT16 wMsg)
+{
+    static char buffer[100];
+    
+#define CASE(s) case (s): return #s
+    
+    switch (wMsg) {
+	CASE(MCI_BREAK);
+	CASE(MCI_CLOSE);
+	CASE(MCI_CLOSE_DRIVER);
+	CASE(MCI_COPY);
+	CASE(MCI_CUE);
+	CASE(MCI_CUT);
+	CASE(MCI_DELETE);
+	CASE(MCI_ESCAPE);
+	CASE(MCI_FREEZE);
+	CASE(MCI_PAUSE);
+	CASE(MCI_PLAY);
+	CASE(MCI_GETDEVCAPS);
+	CASE(MCI_INFO);
+	CASE(MCI_LOAD);
+	CASE(MCI_OPEN);
+	CASE(MCI_OPEN_DRIVER);
+	CASE(MCI_PASTE);
+	CASE(MCI_PUT);
+	CASE(MCI_REALIZE);
+	CASE(MCI_RECORD);
+	CASE(MCI_RESUME);
+	CASE(MCI_SAVE);
+	CASE(MCI_SEEK);
+	CASE(MCI_SET);
+	CASE(MCI_SPIN);
+	CASE(MCI_STATUS);
+	CASE(MCI_STEP);
+	CASE(MCI_STOP);
+	CASE(MCI_SYSINFO);
+	CASE(MCI_UNFREEZE);
+	CASE(MCI_UPDATE);
+	CASE(MCI_WHERE);
+	CASE(MCI_WINDOW);
+    default:
+	sprintf(buffer, "MCI_<<%04X>>", wMsg);
+	return buffer;
+    }
+#undef CASE
+}
+
+/**************************************************************************
+ * 			MCI_MapMsg16To32A			[internal]
+ */
+int	MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
+{
+    if (*lParam == 0)
+	return 0;
+    /* FIXME: to add also (with seg/linear modifications to do):
+     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
+     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
+     */
+    switch (wMsg) {
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:		
+    case MCI_CLOSE_DRIVER:	
+	/* case MCI_CONFIGURE:*/
+    case MCI_COPY:
+    case MCI_CUE:
+    case MCI_CUT:
+    case MCI_DELETE:
+    case MCI_FREEZE:
+    case MCI_GETDEVCAPS:
+	/* case MCI_INDEX: */
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_PASTE:
+    case MCI_PAUSE:		
+    case MCI_PLAY:		
+    case MCI_PUT:
+    case MCI_REALIZE:
+    case MCI_RECORD:		
+    case MCI_RESUME:		
+    case MCI_SEEK:		
+    case MCI_SET:
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+    case MCI_STATUS:		/* FIXME: is wrong for digital video */
+    case MCI_STEP:
+    case MCI_STOP:		
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+    case MCI_UPDATE:
+    case MCI_WHERE:
+	*lParam = (DWORD)PTR_SEG_TO_LIN(*lParam);
+	return 0;
+    case MCI_WINDOW:
+	/* in fact, I would also need the dwFlags... to see 
+	 * which members of lParam are effectively used 
+	 */
+	*lParam = (DWORD)PTR_SEG_TO_LIN(*lParam);
+	FIXME(mci, "Current mapping may be wrong\n");
+	break;
+    case MCI_BREAK:
+	{
+            LPMCI_BREAK_PARMS		mbp32 = HeapAlloc(SystemHeap, 0, sizeof(MCI_BREAK_PARMS));
+	    LPMCI_BREAK_PARMS16		mbp16 = PTR_SEG_TO_LIN(*lParam);
+
+	    if (mbp32) {
+		mbp32->dwCallback = mbp16->dwCallback;
+		mbp32->nVirtKey = mbp16->nVirtKey;
+		mbp32->hwndBreak = mbp16->hwndBreak;
+	    } else {
+		return -2;
+	    }
+	    *lParam = (DWORD)mbp32;
+	}
+	return 1;
+    case MCI_ESCAPE:
+	{
+            LPMCI_VD_ESCAPE_PARMSA	mvep32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_VD_ESCAPE_PARMSA));
+	    LPMCI_VD_ESCAPE_PARMS16	mvep16  = PTR_SEG_TO_LIN(*lParam);
+
+	    if (mvep32a) {
+		mvep32a->dwCallback       = mvep16->dwCallback;
+		mvep32a->lpstrCommand     = PTR_SEG_TO_LIN(mvep16->lpstrCommand);
+	    } else {
+		return -2;
+	    }
+	    *lParam = (DWORD)mvep32a;
+	}
+	return 1;
+    case MCI_INFO:
+	{
+            LPMCI_INFO_PARMSA	mip32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_INFO_PARMSA));
+	    LPMCI_INFO_PARMS16	mip16  = PTR_SEG_TO_LIN(*lParam);
+
+	    /* FIXME this is wrong if device is of type 
+	     * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
+	     */
+	    if (mip32a) {
+		mip32a->dwCallback  = mip16->dwCallback;
+		mip32a->lpstrReturn = PTR_SEG_TO_LIN(mip16->lpstrReturn);
+		mip32a->dwRetSize   = mip16->dwRetSize;
+	    } else {
+		return -2;
+	    }
+	    *lParam = (DWORD)mip32a;
+	}
+	return 1;
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:	
+	{
+            LPMCI_OPEN_PARMSA	mop32a = HeapAlloc(SystemHeap, 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSA) + 2 * sizeof(DWORD));
+	    LPMCI_OPEN_PARMS16	mop16  = PTR_SEG_TO_LIN(*lParam);
+
+	    if (mop32a) {
+		*(LPMCI_OPEN_PARMS16*)(mop32a) = mop16;
+		mop32a = (LPMCI_OPEN_PARMSA)((char*)mop32a + sizeof(LPMCI_OPEN_PARMS16));
+		mop32a->dwCallback       = mop16->dwCallback;
+		mop32a->wDeviceID        = mop16->wDeviceID;
+		mop32a->lpstrDeviceType  = PTR_SEG_TO_LIN(mop16->lpstrDeviceType);
+		mop32a->lpstrElementName = PTR_SEG_TO_LIN(mop16->lpstrElementName);
+		mop32a->lpstrAlias       = PTR_SEG_TO_LIN(mop16->lpstrAlias);
+		/* copy extended information if any...
+		 * FIXME: this may seg fault if initial structure does not contain them and
+		 * the reads after msip16 fail under LDT limits...
+		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and 
+		 * should not take care of extended parameters, and should be used by MCI_Open
+		 * to fetch uDevType. When, this is known, the mapping for sending the 
+		 * MCI_OPEN_DRIVER shall be done depending on uDevType.
+		 */
+		memcpy(mop32a + 1, mop16 + 1, 2 * sizeof(DWORD));
+	    } else {
+		return -2;
+	    }
+	    *lParam = (DWORD)mop32a;
+	}
+	return 1;
+    case MCI_SYSINFO:
+	{
+            LPMCI_SYSINFO_PARMSA	msip32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_SYSINFO_PARMSA));
+	    LPMCI_SYSINFO_PARMS16	msip16  = PTR_SEG_TO_LIN(*lParam);
+
+	    if (msip32a) {
+		msip32a->dwCallback       = msip16->dwCallback;
+		msip32a->lpstrReturn      = PTR_SEG_TO_LIN(msip16->lpstrReturn);
+		msip32a->dwRetSize        = msip16->dwRetSize;
+		msip32a->dwNumber         = msip16->dwNumber;
+		msip32a->wDeviceType      = msip16->wDeviceType;
+	    } else {
+		return -2;
+	    }
+	    *lParam = (DWORD)msip32a;
+	}
+	return 1;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME(mci, "This is a hack\n");
+	return 0;
+
+    default:
+	WARN(mci, "Don't know how to map msg=%s\n", MCI_CommandToString(wMsg));
+    }
+    return -1;
+}
+
+/**************************************************************************
+ * 			MCI_UnMapMsg16To32A			[internal]
+ */
+int	MCI_UnMapMsg16To32A(WORD uDevType, WORD wMsg, DWORD lParam)
+{
+    switch (wMsg) {
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:	
+	/* case MCI_CONFIGURE:*/
+    case MCI_COPY:
+    case MCI_CUE:
+    case MCI_CUT:
+    case MCI_DELETE:
+    case MCI_FREEZE:
+    case MCI_GETDEVCAPS:
+	/* case MCI_INDEX: */
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_PASTE:
+    case MCI_PAUSE:		
+    case MCI_PLAY:		
+    case MCI_PUT:
+    case MCI_REALIZE:
+    case MCI_RECORD:		
+    case MCI_RESUME:		
+    case MCI_SEEK:		
+    case MCI_SET:
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+    case MCI_STATUS:		
+    case MCI_STEP:
+    case MCI_STOP:		
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+    case MCI_UPDATE:
+    case MCI_WHERE:
+	return 0;
+
+    case MCI_WINDOW:
+	/* FIXME ?? see Map function */
+	return 0;
+
+    case MCI_BREAK:
+    case MCI_ESCAPE:
+    case MCI_INFO:
+    case MCI_SYSINFO:
+	HeapFree(SystemHeap, 0, (LPVOID)lParam);
+	return 0;
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:	
+	if (lParam) {
+            LPMCI_OPEN_PARMSA	mop32a = (LPMCI_OPEN_PARMSA)lParam;
+	    LPMCI_OPEN_PARMS16	mop16  = *(LPMCI_OPEN_PARMS16*)((char*)mop32a - sizeof(LPMCI_OPEN_PARMS16*));
+	    
+	    mop16->wDeviceID = mop32a->wDeviceID;
+	    if (!HeapFree(SystemHeap, 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16))))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	}
+	return 0;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME(mci, "This is a hack\n");
+	return 0;
+    default:
+	FIXME(mci, "Map/Unmap internal error on msg=%s\n", MCI_CommandToString(wMsg));
+    }
+    return -1;
+}
+
+/**************************************************************************
+ * 			MCI_MsgMapper32To16_Create		[internal]
+ *
+ * Helper for MCI_MapMsg32ATo16. 
+ * Maps the 32 bit pointer (*ptr), of size bytes, to an allocated 16 bit segmented pointer.
+ * if keep is TRUE, keeps track of in 32 bit ptr in allocated 16 bit area.
+ *  1 : ok, some memory allocated
+ * -2 : ko, memory problem
+ */
+static	int	MCI_MsgMapper32To16_Create(void** ptr, int size, BOOLEAN keep)
+{
+    void*	lp = SEGPTR_ALLOC(sizeof(void**) + size);
+
+    if (!lp) {
+	return -2;
+    }
+    if (keep) {
+	*(void**)lp = *ptr;
+	memcpy((char*)lp + sizeof(void**), *ptr, size);
+	*ptr = (char*)SEGPTR_GET(lp) + sizeof(void**);
+    } else {
+	memcpy((char*)lp, *ptr, size);
+	*ptr = (void*)SEGPTR_GET(lp);
+    }
+    return 1;
+   
+}
+
+/**************************************************************************
+ * 			MCI_MsgMapper32To16_Destroy		[internal]
+ *
+ * Helper for MCI_UnMapMsg32ATo16. 
+ */
+static	int	MCI_MsgMapper32To16_Destroy(void* ptr, int size, BOOLEAN kept)
+{
+    if (ptr) {
+	void*	msg16 = PTR_SEG_TO_LIN(ptr);
+	void*	alloc;
+
+	if (kept) {
+	    alloc = (char*)msg16 - sizeof(void**);
+	    memcpy(*(void**)alloc, msg16, size);
+	} else {
+	    alloc = msg16;
+	}
+
+	if (!SEGPTR_FREE(alloc)) {
+	    FIXME(mci, "bad free\n");
+	} 
+    }	
+    return 0;
+}
+
+/**************************************************************************
+ * 			MCI_MapMsg32ATo16			[internal]
+ *
+ * Map a 32-A bit MCI message to a 16 bit MCI message.
+ *  1 : ok, some memory allocated, need to call MCI_UnMapMsg32ATo16
+ *  0 : ok, no memory allocated
+ * -1 : ko, unknown message
+ * -2 : ko, memory problem
+ */
+int	MCI_MapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD* lParam)
+{
+    int		size;
+    BOOLEAN     keep = FALSE;
+
+    if (*lParam == 0)
+	return 0;
+    /* FIXME: to add also (with seg/linear modifications to do):
+     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
+     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO
+     */
+    switch (wMsg) {
+	/* case MCI_BREAK: */
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:
+    case MCI_CLOSE_DRIVER:	
+	size = sizeof(MCI_GENERIC_PARMS);	
+	break;
+	/* case MCI_CONFIGURE:*/
+	/* case MCI_COPY: */
+    case MCI_CUE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_CUE_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_CUE_PARMS);	break;*/	FIXME(mci, "NIY vcr\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+	/* case MCI_CUT:*/
+    case MCI_DELETE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_DELETE_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_DELETE_PARMS);	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+	/* case MCI_ESCAPE: */
+    case MCI_FREEZE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_FREEZE_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_OVERLAY:	/*size = sizeof(MCI_OVLY_FREEZE_PARMS);	FIXME(mci, "NIY rect\n");	return -2;*/
+	                                FIXME(mci, "NIY ovly\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_GETDEVCAPS:
+	keep = TRUE;
+	size = sizeof(MCI_GETDEVCAPS_PARMS);
+	break;
+	/* case MCI_INDEX: */
+    case MCI_INFO:
+	{
+            LPMCI_INFO_PARMSA	mip32a = (LPMCI_INFO_PARMSA)(*lParam);
+	    char*		ptr;
+	    LPMCI_INFO_PARMS16	mip16;
+	    
+	    switch (uDevType) {
+	    case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_INFO_PARMS16);	break;
+	    default:				size = sizeof(MCI_INFO_PARMS16);	break;
+	    }
+	    ptr = SEGPTR_ALLOC(sizeof(LPMCI_INFO_PARMSA) + size);
+
+	    if (ptr) {
+		*(LPMCI_INFO_PARMSA*)ptr = mip32a;
+		mip16 = (LPMCI_INFO_PARMS16)(ptr + sizeof(LPMCI_INFO_PARMSA));
+		mip16->dwCallback  = mip32a->dwCallback;
+		mip16->lpstrReturn = (LPSTR)SEGPTR_GET(SEGPTR_ALLOC(mip32a->dwRetSize));
+		mip16->dwRetSize   = mip32a->dwRetSize;
+		if (uDevType == MCI_DEVTYPE_DIGITAL_VIDEO) {
+		    ((LPMCI_DGV_INFO_PARMS16)mip16)->dwItem = ((LPMCI_DGV_INFO_PARMSA)mip32a)->dwItem;
+		}
+	    } else {
+		return -2;
+	    }
+	    *lParam = (LPARAM)SEGPTR_GET(ptr) + sizeof(LPMCI_INFO_PARMSA);
+	}
+	return 1;
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:	
+	{
+            LPMCI_OPEN_PARMSA	mop32a = (LPMCI_OPEN_PARMSA)(*lParam);
+	    char*		ptr    = SEGPTR_ALLOC(sizeof(LPMCI_OPEN_PARMSA) + sizeof(MCI_OPEN_PARMS16) + 2 * sizeof(DWORD));
+	    LPMCI_OPEN_PARMS16	mop16;
+
+
+	    if (ptr) {
+		*(LPMCI_OPEN_PARMSA*)(ptr) = mop32a;
+		mop16 = (LPMCI_OPEN_PARMS16)(ptr + sizeof(LPMCI_OPEN_PARMSA));
+		mop16->dwCallback       = mop32a->dwCallback;
+		mop16->wDeviceID        = mop32a->wDeviceID;
+		mop16->lpstrDeviceType  = SEGPTR_STRDUP(mop32a->lpstrDeviceType);
+		mop16->lpstrElementName = SEGPTR_STRDUP(mop32a->lpstrElementName);
+		mop16->lpstrAlias       = SEGPTR_STRDUP(mop32a->lpstrAlias);
+		/* copy extended information if any...
+		 * FIXME: this may seg fault if initial structure does not contain them and
+		 * the reads after msip16 fail under LDT limits...
+		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and 
+		 * should not take care of extended parameters, and should be used by MCI_Open
+		 * to fetch uDevType. When, this is known, the mapping for sending the 
+		 * MCI_OPEN_DRIVER shall be done depending on uDevType.
+		 */
+		memcpy(mop16 + 1, mop32a + 1, 2 * sizeof(DWORD));
+	    } else {
+		return -2;
+	    }
+	    *lParam = (LPARAM)SEGPTR_GET(ptr) + sizeof(LPMCI_OPEN_PARMSA);
+	}
+	return 1;
+	/* case MCI_PASTE:*/
+    case MCI_PAUSE:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_PLAY:
+	switch (uDevType) {
+	case MCI_DEVTYPE_OVERLAY:	/*size = sizeof(MCI_OVLY_PLAY_PARMS);	break;*/FIXME(mci, "NIY ovly\n");	return -2;
+	default:			size = sizeof(MCI_PLAY_PARMS);		break;
+	}
+	break;
+    case MCI_PUT:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_PUT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_OVERLAY:	/*size = sizeof(MCI_OVLY_PUT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;*/
+	                                FIXME(mci, "NIY ovly\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_REALIZE:
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_RECORD:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECORD_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_RECORD_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	default:			size = sizeof(MCI_RECORD_PARMS);	break;
+	}
+	break;
+    case MCI_RESUME:		
+	size = sizeof(MCI_GENERIC_PARMS);
+	break;
+    case MCI_SEEK:
+	switch (uDevType) {
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SEEK_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	default:			size = sizeof(MCI_SEEK_PARMS);		break;
+	}
+	break;
+    case MCI_SET:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_SET_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_SET_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	case MCI_DEVTYPE_SEQUENCER:	size = sizeof(MCI_SEQ_SET_PARMS);	break;
+	case MCI_DEVTYPE_WAVEFORM_AUDIO:size = sizeof(MCI_WAVE_SET_PARMS);	FIXME(mci, "NIY UINT\n");	return -2;
+	default:			size = sizeof(MCI_SET_PARMS);		break;
+	}
+	break;	
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+	size = sizeof(MCI_SET_PARMS);		
+	break;
+    case MCI_STATUS:
+	keep = TRUE;
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_STATUS_PARMS16);	FIXME(mci, "NIY lpstrDevice\n");return -2;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STATUS_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	default:			size = sizeof(MCI_STATUS_PARMS);	break;
+	}
+	break;
+    case MCI_STEP:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_STEP_PARMS);	break;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STEP_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	case MCI_DEVTYPE_VIDEODISC:	size = sizeof(MCI_VD_STEP_PARMS);	break;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;	
+    case MCI_STOP:		
+	size = sizeof(MCI_SET_PARMS);		
+	break;
+    case MCI_SYSINFO:
+	{
+            LPMCI_SYSINFO_PARMSA	msip32a = (LPMCI_SYSINFO_PARMSA)(*lParam);
+	    char*		      	ptr     = SEGPTR_ALLOC(sizeof(LPMCI_SYSINFO_PARMSA) + sizeof(MCI_SYSINFO_PARMS16));
+	    LPMCI_SYSINFO_PARMS16	msip16;
+
+	    if (ptr) {
+		*(LPMCI_SYSINFO_PARMSA*)(ptr) = msip32a;
+		msip16 = (LPMCI_SYSINFO_PARMS16)(ptr + sizeof(LPMCI_SYSINFO_PARMSA));
+
+		msip16->dwCallback       = msip32a->dwCallback;
+		msip16->lpstrReturn      = (LPSTR)SEGPTR_GET(SEGPTR_ALLOC(msip32a->dwRetSize));
+		msip16->dwRetSize        = msip32a->dwRetSize;
+		msip16->dwNumber         = msip32a->dwNumber;
+		msip16->wDeviceType      = msip32a->wDeviceType;
+	    } else {
+		return -2;
+	    }
+	    *lParam = (LPARAM)SEGPTR_GET(ptr) + sizeof(LPMCI_SYSINFO_PARMSA);
+	}
+	return 1;
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_UPDATE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_UPDATE_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_WHERE:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_RECT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	case MCI_DEVTYPE_OVERLAY:	size = sizeof(MCI_OVLY_RECT_PARMS);	FIXME(mci, "NIY rect\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case MCI_WINDOW:
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_WINDOW_PARMS16);	FIXME(mci, "NIY lpstrText\n");	return -2;
+	case MCI_DEVTYPE_OVERLAY:	/*size = sizeof(MCI_OVLY_WINDOW_PARMS);	FIXME(mci, "NIY lpstrText\n");	return -2;*/
+	                                FIXME(mci, "NIY ovly\n");	return -2;
+	default:			size = sizeof(MCI_GENERIC_PARMS);	break;
+	}
+	break;
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME(mci, "This is a hack\n");
+	return 0;
+
+    default:
+	WARN(mci, "Don't know how to map msg=%s\n", MCI_CommandToString(wMsg));
+	return -1;
+    }
+    return MCI_MsgMapper32To16_Create((void**)lParam, size, keep);
+}
+
+/**************************************************************************
+ * 			MCI_UnMapMsg32ATo16			[internal]
+ */
+int	MCI_UnMapMsg32ATo16(WORD uDevType, WORD wMsg, DWORD lParam)
+{
+    int		size = 0;
+    BOOLEAN     kept = FALSE;	/* there is no need to compute size when kept is FALSE */
+
+    switch (wMsg) {
+	/* case MCI_CAPTURE */
+    case MCI_CLOSE:	
+    case MCI_CLOSE_DRIVER:	
+	break;
+	/* case MCI_CONFIGURE:*/
+	/* case MCI_COPY: */
+    case MCI_CUE:	
+	break;
+	/* case MCI_CUT: */
+    case MCI_DELETE:
+	break;
+	/* case MCI_ESCAPE: */
+    case MCI_FREEZE:
+	break;
+    case MCI_GETDEVCAPS:
+	kept = TRUE;
+	size = sizeof(MCI_GETDEVCAPS_PARMS);
+	break;
+	/* case MCI_INDEX: */
+    case MCI_INFO:
+	{
+            LPMCI_INFO_PARMS16	mip16  = (LPMCI_INFO_PARMS16)PTR_SEG_TO_LIN(lParam);
+	    LPMCI_INFO_PARMSA	mip32a = *(LPMCI_INFO_PARMSA*)((char*)mip16 - sizeof(LPMCI_INFO_PARMSA));
+
+	    memcpy(mip32a->lpstrReturn, PTR_SEG_TO_LIN(mip16->lpstrReturn), mip32a->dwRetSize);
+
+	    if (!SEGPTR_FREE(PTR_SEG_TO_LIN(mip16->lpstrReturn)))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	    if (!SEGPTR_FREE((char*)mip16 - sizeof(LPMCI_INFO_PARMSA)))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	}
+	return 0;
+	/* case MCI_MARK: */
+	/* case MCI_MONITOR: */
+    case MCI_OPEN:
+    case MCI_OPEN_DRIVER:	
+	if (lParam) {
+            LPMCI_OPEN_PARMS16	mop16  = (LPMCI_OPEN_PARMS16)PTR_SEG_TO_LIN(lParam);
+	    LPMCI_OPEN_PARMSA	mop32a = *(LPMCI_OPEN_PARMSA*)((char*)mop16 - sizeof(LPMCI_OPEN_PARMSA));
+	    
+	    mop32a->wDeviceID = mop16->wDeviceID;
+	    if (!SEGPTR_FREE(mop16->lpstrDeviceType))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	    if (!SEGPTR_FREE(mop16->lpstrElementName))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	    if (!SEGPTR_FREE(mop16->lpstrAlias))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+
+	    if (!SEGPTR_FREE((LPVOID)((char*)mop16 - sizeof(LPMCI_OPEN_PARMSA))))
+		FIXME(mci, "bad free line=%d\n", __LINE__);
+	}
+	return 0;
+	/* case MCI_PASTE:*/
+    case MCI_PAUSE:
+	break;
+    case MCI_PLAY:		
+	break;
+    case MCI_PUT:
+	break;
+    case MCI_REALIZE:
+	break;
+    case MCI_RECORD:
+	break;
+    case MCI_RESUME:
+	break;
+    case MCI_SEEK:
+	break;
+    case MCI_SET:
+	break;
+	/* case MCI_SETTIMECODE:*/
+	/* case MCI_SIGNAL:*/
+    case MCI_SPIN:
+	break;
+    case MCI_STATUS:
+	kept = TRUE;
+	switch (uDevType) {
+	case MCI_DEVTYPE_DIGITAL_VIDEO:	size = sizeof(MCI_DGV_STATUS_PARMS16);	FIXME(mci, "NIY lpstrDevice\n");return -2;
+	case MCI_DEVTYPE_VCR:		/*size = sizeof(MCI_VCR_STATUS_PARMS);	break;*/FIXME(mci, "NIY vcr\n");	return -2;
+	default:			size = sizeof(MCI_STATUS_PARMS);	break;
+	}
+	break;
+    case MCI_STEP:
+	break;
+    case MCI_STOP:
+	break;
+    case MCI_SYSINFO:
+	if (lParam) {
+            LPMCI_SYSINFO_PARMS16	msip16  = (LPMCI_SYSINFO_PARMS16)PTR_SEG_TO_LIN(lParam);
+	    LPMCI_SYSINFO_PARMSA	msip32a = *(LPMCI_SYSINFO_PARMSA*)((char*)msip16 - sizeof(LPMCI_SYSINFO_PARMSA));
+
+	    if (msip16) {
+		msip16->dwCallback       = msip32a->dwCallback;
+		memcpy(msip32a->lpstrReturn, PTR_SEG_TO_LIN(msip16->lpstrReturn), msip32a->dwRetSize);
+		if (!SEGPTR_FREE(msip16->lpstrReturn))
+		    FIXME(mci, "bad free line=%d\n", __LINE__);
+
+		if (!SEGPTR_FREE((LPVOID)(lParam - sizeof(LPMCI_SYSINFO_PARMSA))))
+		    FIXME(mci, "bad free line=%d\n", __LINE__);
+	    } else {
+		return -2;
+	    }
+	}
+	return 1;
+	/* case MCI_UNDO: */
+    case MCI_UNFREEZE:
+	break;
+    case MCI_UPDATE:
+	break;
+    case MCI_WHERE:
+	break;
+    case MCI_WINDOW:
+	/* FIXME: see map function */
+	break;
+
+    case DRV_LOAD:
+    case DRV_ENABLE:
+    case DRV_OPEN:
+    case DRV_CLOSE:
+    case DRV_DISABLE:
+    case DRV_FREE:
+    case DRV_CONFIGURE:
+    case DRV_QUERYCONFIGURE:
+    case DRV_INSTALL:
+    case DRV_REMOVE:
+    case DRV_EXITSESSION:
+    case DRV_EXITAPPLICATION:
+    case DRV_POWER:
+	FIXME(mci, "This is a hack\n");
+	return 0;
+    default:
+	FIXME(mci, "Map/Unmap internal error on msg=%s\n", MCI_CommandToString(wMsg));
+	return -1;
+    }
+    return MCI_MsgMapper32To16_Destroy((void*)lParam, size, kept);
+}
+
+/**************************************************************************
+ * 			MCI_SendCommand				[internal]
+ */
+DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
+{
+    DWORD		dwRet = MCIERR_DEVICE_NOT_INSTALLED;
+    
+    if (!MCI_DevIDValid(wDevID)) {
+	dwRet = MCIERR_INVALID_DEVICE_ID;
+    } else {
+	MCIPROC		proc = MCI_GetProc(MCI_GetDrv(wDevID)->modp.wType);
+	
+	if (proc) {
+	    dwRet = (*proc)(MCI_GetDrv(wDevID)->modp.wDeviceID, 
+			    MCI_GetDrv(wDevID)->hDrv, 
+			    wMsg, dwParam1, dwParam2);
+	} else if (MCI_GetDrv(wDevID)->hDrv) {
+	    switch (DRIVER_GetType(MCI_GetDrv(wDevID)->hDrv)) {
+	    case WINE_DI_TYPE_16:
+		{
+		    int			res;
+		    
+		    switch (res = MCI_MapMsg32ATo16(MCI_GetDrv(wDevID)->modp.wType, wMsg, &dwParam2)) {
+		    case -1:
+			TRACE(mci, "Not handled yet (%s)\n", MCI_CommandToString(wMsg));
+			dwRet = MCIERR_DRIVER_INTERNAL;
+			break;
+		    case -2:
+			TRACE(mci, "Problem mapping msg=%s from 16 to 32a\n", MCI_CommandToString(wMsg));
+			dwRet = MCIERR_OUT_OF_MEMORY;
+			break;
+		    case 0:
+		    case 1:
+			dwRet = SendDriverMessage16(MCI_GetDrv(wDevID)->hDrv, wMsg, dwParam1, dwParam2);
+			if (res)
+			    MCI_UnMapMsg32ATo16(MCI_GetDrv(wDevID)->modp.wType, wMsg, dwParam2);
+			break;
+		    }
+		}
+		break;
+	    case WINE_DI_TYPE_32:
+		dwRet = SendDriverMessage(MCI_GetDrv(wDevID)->hDrv, wMsg, dwParam1, dwParam2);
+		break;
+	    default:
+		WARN(mci, "Unknown driver type=%u\n", DRIVER_GetType(MCI_GetDrv(wDevID)->hDrv));
+		dwRet = MCIERR_DRIVER_INTERNAL;
+	    }
+	} else {
+	    WARN(mci, "unknown device type=%04X !\n", MCI_GetDrv(wDevID)->modp.wType);
+	}
+    }
+    return dwRet;
+}
+
+/**************************************************************************
+ * 			MCI_Open				[internal]
+ */
+DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
+{
+    char		strDevTyp[128];
+    UINT16		uDevType = 0;
+    UINT16		wDevID = MCI_FirstDevID();
+    DWORD 		dwRet;
+    
+    TRACE(mci, "(%08lX, %p)\n", dwParam, lpParms);
+    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
+    
+    if ((dwParam & ~(MCI_OPEN_SHAREABLE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_NOTIFY|MCI_WAIT)) != 0) {
+	FIXME(mci, "unsupported yet dwFlags=%08lX\n", 
+	      (dwParam & ~(MCI_OPEN_SHAREABLE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_NOTIFY|MCI_WAIT)));
+    }
+
+    while (MCI_GetDrv(wDevID)->modp.wType != 0) {
+	wDevID = MCI_NextDevID(wDevID);
+	if (!MCI_DevIDValid(wDevID)) {
+	    TRACE(mci, "MAXMCIDRIVERS reached !\n");
+	    return MCIERR_OUT_OF_MEMORY;
+	}
+    }
+
+    TRACE(mci, "wDevID=%04X \n", wDevID);
+    memcpy(MCI_GetOpenDrv(wDevID), lpParms, sizeof(*lpParms));
+    
+    strDevTyp[0] = 0;
+
+    if (dwParam & MCI_OPEN_ELEMENT) {
+	char*	t;
+	
+	TRACE(mci, "lpstrElementName='%s'\n", lpParms->lpstrElementName);
+	t = strrchr(lpParms->lpstrElementName, '.');
+	if (t) {
+	    GetProfileStringA("mci extensions", t+1, "*", strDevTyp, sizeof(strDevTyp));
+	    if (strcmp(strDevTyp, "*") == 0) {
+		TRACE(mci,"No [mci extensions] entry for %s found.\n", t);
+		return MCIERR_EXTENSION_NOT_FOUND;
+	    }
+	    TRACE(mci, "Extension %s is mapped to type %s\n", t, strDevTyp);
+	} else if (GetDriveTypeA(lpParms->lpstrElementName) == DRIVE_CDROM) {
+	    /* FIXME: this will not work if several CDROM drives are installed on the machine */
+	    strcpy(strDevTyp, "CDAUDIO");
+	} else {
+	    return MCIERR_EXTENSION_NOT_FOUND;
+	}
+    }
+    
+    if (dwParam & MCI_OPEN_ALIAS) {
+	TRACE(mci, "Alias='%s' !\n", lpParms->lpstrAlias);
+	/* FIXME is there any memory leak here ? */
+	MCI_GetOpenDrv(wDevID)->lpstrAlias = strdup(lpParms->lpstrAlias);
+	/* mplayer does allocate alias to CDAUDIO */
+    }
+    if (dwParam & MCI_OPEN_TYPE) {
+	if (dwParam & MCI_OPEN_TYPE_ID) {
+#if 0
+	    TRACE(mci, "Dev=%08lx!\n", (DWORD)lpParms->lpstrDeviceType);
+	    uDevType = LOWORD((DWORD)lpParms->lpstrDeviceType);
+	    MCI_GetOpenDrv(wDevID)->lpstrDeviceType = lpParms->lpstrDeviceType;
+#endif
+	    if (LOWORD((DWORD)lpParms->lpstrDeviceType) != MCI_DEVTYPE_CD_AUDIO) {
+		FIXME(mci, "MCI_OPEN_TYPE_ID is no longer properly supported\n");
+	    }
+	} else {
+	    if (lpParms->lpstrDeviceType == NULL) 
+		return MCIERR_NULL_PARAMETER_BLOCK;
+	    TRACE(mci, "Dev='%s' !\n", lpParms->lpstrDeviceType);
+	    /* FIXME is there any memory leak here ? */
+	    MCI_GetOpenDrv(wDevID)->lpstrDeviceType = strdup(lpParms->lpstrDeviceType);
+	    strcpy(strDevTyp, lpParms->lpstrDeviceType);
+	}
+    }
+
+    if (uDevType == 0 && strDevTyp[0] != 0) {
+	CharUpperA(strDevTyp);
+	/* try Wine internal MCI drivers */
+	uDevType = MCI_GetDevType(strDevTyp);
+	if (uDevType == 0) { /* Nope, load external */
+	    HDRVR			hDrv;
+	    MCI_OPEN_DRIVER_PARMSA	modp;
+	    
+	    modp.wDeviceID = wDevID;
+	    modp.lpstrParams = NULL;
+
+	    /* FIXME: this is a hack... some MCI drivers, while being open, call
+	     * mciSetData, which lookup for non empty slots in MCI table list
+	     * Unfortunatly, open slots are known when wType == 0...
+	     * so use a dummy type, just to keep on going. May be wType == 0 is 
+	     * not the best solution to indicate empty slot in MCI drivers table
+	     */
+	    MCI_GetDrv(wDevID)->modp.wType = MCI_DEVTYPE_CD_AUDIO;
+	    hDrv = OpenDriverA(strDevTyp, "mci", (LPARAM)&modp);
+
+	    if (!hDrv) {
+		FIXME(mci, "Couldn't load driver for type %s.\n", strDevTyp);
+		return MCIERR_DEVICE_NOT_INSTALLED;
+	    }			
+	    uDevType = modp.wType;
+	    MCI_GetDrv(wDevID)->hDrv = hDrv;
+
+	    TRACE(mci, "Loaded driver %u (%s), type is %d\n", hDrv, strDevTyp, uDevType);
+	}
+    } else {
+	MCI_GetDrv(wDevID)->hDrv = 0;
+    }
+
+    MCI_GetDrv(wDevID)->modp.wType = uDevType;
+    MCI_GetDrv(wDevID)->modp.wDeviceID = 0;  /* FIXME? for multiple devices */
+
+    lpParms->wDeviceID = wDevID;
+
+    TRACE(mci, "mcidev=%d, uDevType=%04X wDeviceID=%04X !\n", 
+	  wDevID, uDevType, lpParms->wDeviceID);
+
+    dwRet = MCI_SendCommand(wDevID, MCI_OPEN_DRIVER, dwParam, (DWORD)lpParms);
+
+    if (dwRet == 0) {
+	/* only handled devices fall through */
+	TRACE(mci, "wDevID = %04X wDeviceID = %d dwRet = %ld\n", wDevID, lpParms->wDeviceID, dwRet);
+    } else {
+	TRACE(mci, "failed to open driver (MCI_OPEN_DRIVER msg) [%08lx], closing\n", dwRet);
+	MCI_GetDrv(wDevID)->modp.wType = 0;
+    }
+    if (dwParam & MCI_NOTIFY)
+	mciDriverNotify16(lpParms->dwCallback, wDevID, dwRet == 0 ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE);
+    
+    return dwRet;
+}
+
+/**************************************************************************
+ * 			MCI_Close				[internal]
+ */
+DWORD MCI_Close(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
+{
+    DWORD	dwRet;
+    
+    TRACE(mci, "(%04x, %08lX, %p)\n", wDevID, dwParam, lpParms);
+
+    if (wDevID == MCI_ALL_DEVICE_ID) {
+	FIXME(mci, "unhandled MCI_ALL_DEVICE_ID\n");
+	return MCIERR_CANNOT_USE_ALL;
+    }
+
+    dwRet = MCI_SendCommand(wDevID, MCI_CLOSE_DRIVER, dwParam, (DWORD)lpParms);
+    if (MCI_GetDrv(wDevID)->hDrv) {
+#if 0
+	CloseDriver(MCI_GetDrv(wDevID)->hDrv, 0, 0);
+#endif
+    }
+    MCI_GetDrv(wDevID)->modp.wType = 0;
+    
+    if (dwParam & MCI_NOTIFY)
+	mciDriverNotify16(lpParms->dwCallback, wDevID,
+			  (dwRet == 0) ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE);
+    
+    return dwRet;
+}
+
+/**************************************************************************
+ * 			MCI_WriteString				[internal]
+ */
+DWORD	MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr)
+{
+    DWORD	ret;
+
+    if (dstSize <= strlen(lpSrcStr)) {
+	lstrcpynA(lpDstStr, lpSrcStr, dstSize - 1);
+	ret = MCIERR_PARAM_OVERFLOW;
+    } else {
+	strcpy(lpDstStr, lpSrcStr);
+	ret = 0;
+    }
+    return ret;
+}
+
+/**************************************************************************
+ * 			MCI_Sysinfo				[internal]
+ */
+DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSA lpParms)
+{
+    DWORD	ret = MCIERR_INVALID_DEVICE_ID;
+    
+    if (lpParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;
+    
+    TRACE(mci, "(%08x, %08lX, %08lX[num=%ld, wDevTyp=%u])\n", 
+	  uDevID, dwFlags, (DWORD)lpParms, lpParms->dwNumber, lpParms->wDeviceType);
+    
+    switch (dwFlags & ~MCI_SYSINFO_OPEN) {
+    case MCI_SYSINFO_QUANTITY:
+	{
+	    DWORD	cnt = 0;
+	    WORD	i;
+	    
+	    if (lpParms->wDeviceType < MCI_DEVTYPE_FIRST || lpParms->wDeviceType > MCI_DEVTYPE_LAST) {
+		if (dwFlags & MCI_SYSINFO_OPEN) {
+		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of open MCI drivers\n");
+		    for (i = 0; i < MAXMCIDRIVERS; i++) {
+			if (mciDrv[i].modp.wType != 0) cnt++;
+		    }
+		} else {
+		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");
+		    cnt = mciInstalledCount;
+		}
+	    } else {
+		if (dwFlags & MCI_SYSINFO_OPEN) {
+		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of open MCI drivers of type %u\n", lpParms->wDeviceType);
+		    for (i = 0; i < MAXMCIDRIVERS; i++) {
+			if (mciDrv[i].modp.wType == lpParms->wDeviceType) cnt++;
+		    }
+		} else {
+		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of installed MCI drivers of type %u\n", lpParms->wDeviceType);
+		    FIXME(mci, "Don't know how to get # of MCI devices of a given type\n");
+		    cnt = 1;
+		}
+	    }
+	    *(DWORD*)lpParms->lpstrReturn = cnt;
+	}
+	TRACE(mci, "(%ld) => '%ld'\n", lpParms->dwNumber, *(DWORD*)lpParms->lpstrReturn);
+	ret = 0;
+	break;
+    case MCI_SYSINFO_INSTALLNAME:
+	TRACE(mci, "MCI_SYSINFO_INSTALLNAME \n");
+	if (MCI_DevIDValid(uDevID)) {
+	    LPCSTR	str = MCI_GetDevTypeString(MCI_GetDrv(uDevID)->modp.wType);
+	    ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, str);
+	} else {
+	    *lpParms->lpstrReturn = 0;
+	    ret = MCIERR_INVALID_DEVICE_ID;
+	}
+	TRACE(mci, "(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
+	break;
+    case MCI_SYSINFO_NAME:
+	TRACE(mci, "MCI_SYSINFO_NAME\n");
+	if (dwFlags & MCI_SYSINFO_OPEN) {
+	    FIXME(mci, "Don't handle MCI_SYSINFO_NAME|MCI_SYSINFO_OPEN (yet)\n");
+	    ret = MCIERR_UNRECOGNIZED_COMMAND;
+	} else if (lpParms->dwNumber > mciInstalledCount) {
+	    ret = MCIERR_OUTOFRANGE;
+	} else {
+	    DWORD	count = lpParms->dwNumber;
+	    LPSTR	ptr = lpmciInstallNames;
+
+	    while (--count > 0) ptr += strlen(ptr) + 1;
+	    ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, ptr);
+	}
+	TRACE(mci, "(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
+	break;
+    default:
+	TRACE(mci, "Unsupported flag value=%08lx\n", dwFlags);
+	ret = MCIERR_UNRECOGNIZED_COMMAND;
+    }
+    return ret;
+}
+
+struct SCA {
+    UINT 	wDevID;
+    UINT 	wMsg;
+    DWORD 	dwParam1;
+    DWORD 	dwParam2;
+    BOOL	allocatedCopy;
+};
+
+DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2);
+
+/**************************************************************************
+ * 				MCI_SCAStarter			[internal]
+ */
+static DWORD WINAPI MCI_SCAStarter(LPVOID arg)
+{
+    struct SCA*	sca = (struct SCA*)arg;
+    DWORD		ret;
+
+    TRACE(mci, "In thread before async command (%08x,%s,%08lx,%08lx)\n",
+	  sca->wDevID, MCI_CommandToString(sca->wMsg), sca->dwParam1, sca->dwParam2);
+    ret = mciSendCommandA(sca->wDevID, sca->wMsg, sca->dwParam1 | MCI_WAIT, sca->dwParam2);
+    TRACE(mci, "In thread after async command (%08x,%s,%08lx,%08lx)\n",
+	  sca->wDevID, MCI_CommandToString(sca->wMsg), sca->dwParam1, sca->dwParam2);
+    if (sca->allocatedCopy)
+	HeapFree(GetProcessHeap(), 0, (LPVOID)sca->dwParam2);
+    HeapFree(GetProcessHeap(), 0, sca);
+    ExitThread(ret);
+    WARN(mci, "Should not happen ? what's wrong \n");
+    /* should not go after this point */
+    return ret;
+}
+
+/**************************************************************************
+ * 				MCI_SendCommandAsync		[internal]
+ */
+DWORD MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2, UINT size)
+{
+    struct SCA*	sca = HeapAlloc(GetProcessHeap(), 0, sizeof(struct SCA));
+
+    if (sca == 0)
+	return MCIERR_OUT_OF_MEMORY;
+
+    sca->wDevID   = wDevID;
+    sca->wMsg     = wMsg;
+    sca->dwParam1 = dwParam1;
+    
+    if (size) {
+	sca->dwParam2 = (DWORD)HeapAlloc(GetProcessHeap(), 0, size);
+	if (sca->dwParam2 == 0) {
+	    HeapFree(GetProcessHeap(), 0, sca);
+	    return MCIERR_OUT_OF_MEMORY;
+	}
+	sca->allocatedCopy = TRUE;
+	/* copy structure passed by program in dwParam2 to be sure 
+	 * we can still use it whatever the program does 
+	 */
+	memcpy((LPVOID)sca->dwParam2, (LPVOID)dwParam2, size);
+    } else {
+	sca->dwParam2 = dwParam2;
+	sca->allocatedCopy = FALSE;
+    }
+
+    if (CreateThread(NULL, 0, MCI_SCAStarter, sca, 0, NULL) == 0) {
+	WARN(mci, "Couldn't allocate thread for async command handling, sending synchonously\n");
+	return MCI_SCAStarter(&sca);
+    }
+    return 0;
+}
+
+/**************************************************************************
+ * 				MCI_CleanUp			[internal]
+ *
+ * Some MCI commands need to be cleaned-up (when not called from 
+ * mciSendString), because MCI drivers return extra information for string
+ * transformation. This function gets read of them.
+ */
+LRESULT		MCI_CleanUp(LRESULT dwRet, UINT wMsg, DWORD dwParam2, BOOL bIs32)
+{
+    switch (wMsg) {
+    case MCI_GETDEVCAPS:
+	switch (dwRet & 0xFFFF0000ul) {
+	case 0:
+	    break;
+	case MCI_RESOURCE_RETURNED:
+	case MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER:
+	case MCI_COLONIZED3_RETURN:
+	case MCI_COLONIZED4_RETURN:
+	case MCI_INTEGER_RETURNED:
+	    {
+		LPMCI_GETDEVCAPS_PARMS	lmgp = (LPMCI_GETDEVCAPS_PARMS)(bIs32 ? (void*)dwParam2 : PTR_SEG_TO_LIN(dwParam2));
+
+		dwRet = LOWORD(dwRet);
+		TRACE(mci, "Changing %08lx to %08lx\n", lmgp->dwReturn, (DWORD)LOWORD(lmgp->dwReturn));
+
+		lmgp->dwReturn = LOWORD(lmgp->dwReturn);
+	    } 
+	    break;
+	default:
+	    FIXME(mci, "Unsupported value for hiword (%04x) returned by DriverProc\n", HIWORD(dwRet));
+	}
+	break;
+    case MCI_STATUS:
+	switch (dwRet & 0xFFFF0000ul) {
+	case 0:
+	    break;
+	case MCI_RESOURCE_RETURNED:
+	case MCI_RESOURCE_RETURNED|MCI_RESOURCE_DRIVER:
+	case MCI_COLONIZED3_RETURN:
+	case MCI_COLONIZED4_RETURN:
+	case MCI_INTEGER_RETURNED:
+	    {
+		LPMCI_STATUS_PARMS	lsp = (LPMCI_STATUS_PARMS)(bIs32 ? (void*)dwParam2 : PTR_SEG_TO_LIN(dwParam2));
+
+		dwRet = LOWORD(dwRet);
+		TRACE(mci, "Changing %08lx to %08lx\n", lsp->dwReturn,(DWORD) LOWORD(lsp->dwReturn));
+		lsp->dwReturn = LOWORD(lsp->dwReturn);
+	    }
+	    break;
+	default:
+	    FIXME(mci, "Unsupported value for hiword (%04x) returned by DriverProc\n", HIWORD(dwRet));
+	}
+	break;
+    default:
+	break;
+    }
+    return dwRet;
+}
+
diff --git a/multimedia/mcistring.c b/multimedia/mcistring.c
index 4d6c1b7..9a6fad3 100644
--- a/multimedia/mcistring.c
+++ b/multimedia/mcistring.c
@@ -27,13 +27,6 @@
 #include "debug.h"
 #include "xmalloc.h"
 
-/* FIXME the following definitions must be moved to mmsystem.c */
-extern struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
-
-#define MCI_GetDrv(wDevID) 	(&mciDrv[MCI_DevIDToIndex(wDevID)])
-#define MCI_GetOpenDrv(wDevID) 	(&(MCI_GetDrv(wDevID)->mop))
-/* end of FIXME */
-
 /* The reason why I just don't lowercase the keywords array in 
  * mciSendString is left as an exercise to the reader.
  */
@@ -52,14 +45,14 @@
 do {								\
     TRACE(mci, "->returns '%s'\n", s);				\
     if (lpstrReturnString) {					\
-	lstrcpynA(lpstrReturnString, s, uReturnLength);	\
+	lstrcpynA(lpstrReturnString, s, uReturnLength);		\
 	TRACE(mci, "-->'%s'\n", lpstrReturnString);		\
     }								\
 } while(0)
 
 /* print a DWORD in the specified timeformat */
 static void
-_MCISTR_printtf(char *buf,UINT16 uDevType,DWORD timef,DWORD val) 
+_MCISTR_printtf(char *buf, UINT16 uDevType, DWORD timef, DWORD val) 
 {
     *buf = '\0';
     switch (timef) {
@@ -106,8 +99,8 @@
 #define _MCISTR_devtype	9
 
 static void
-_MCISTR_convreturn(int type,DWORD dwReturn,LPSTR lpstrReturnString,
-		   WORD uReturnLength,WORD uDevTyp,int timef) 
+_MCISTR_convreturn(int type, DWORD dwReturn, LPSTR lpstrReturnString,
+		   WORD uReturnLength, WORD uDevTyp, int timef) 
 {
     switch (type) {
     case _MCISTR_vdmtype:
@@ -2159,7 +2152,7 @@
 }
 
 /**************************************************************************
- * 				mciSendString32A	[MMSYSTEM.702][WINMM.51]
+ * 				mciSendStringA		[MMSYSTEM.702][WINMM.51]
  */
 DWORD WINAPI mciSendStringA(LPCSTR lpstrCommand, LPSTR lpstrReturnString, 
 			      UINT uReturnLength, HWND hwndCallback)
@@ -2168,7 +2161,7 @@
 }
 
 /**************************************************************************
- * 				mciSendString32W	[WINMM.52]
+ * 				mciSendStringW			[WINMM.52]
  */
 DWORD WINAPI mciSendStringW(LPCWSTR lpwstrCommand, LPSTR lpstrReturnString, 
 			      UINT uReturnLength, HWND hwndCallback)
diff --git a/multimedia/mmsystem.c b/multimedia/mmsystem.c
index e1ccc4e..d76723f 100644
--- a/multimedia/mmsystem.c
+++ b/multimedia/mmsystem.c
@@ -25,7 +25,6 @@
 #include "windef.h"
 #include "wine/winbase16.h"
 #include "heap.h"
-#include "ldt.h"
 #include "user.h"
 #include "driver.h"
 #include "multimedia.h"
@@ -35,122 +34,11 @@
 #include "debugstr.h"
 #include "debug.h"
 
-int	mciInstalledCount;
-int	mciInstalledListLen;
-LPSTR	lpmciInstallNames = NULL;
-
-struct WINE_MCIDRIVER mciDrv[MAXMCIDRIVERS];
-
 UINT16 WINAPI midiGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
 static UINT16 waveGetErrorText(UINT16 uError, LPSTR lpText, UINT16 uSize);
-LONG   WINAPI DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
+LONG   WINAPI DrvDefDriverProc(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, 
 			       DWORD dwParam1, DWORD dwParam2);
 
-#define MCI_GetDrv(wDevID) 	(&mciDrv[MCI_DevIDToIndex(wDevID)])
-#define MCI_GetOpenDrv(wDevID)	(&(MCI_GetDrv(wDevID)->mop))
-
-/* The wDevID's returned by wine were originally in the range 
- * 0 - (MAXMCIDRIVERS - 1) and used directly as array indices.
- * Unfortunately, ms-windows uses wDevID of zero to indicate
- * errors.  Now, multimedia drivers must pass the wDevID through
- * MCI_DevIDToIndex to get an index in that range.  An
- * arbitrary value, MCI_MAGIC is added to the wDevID seen
- * by the windows programs.
- */
-
-#define MCI_MAGIC 0x0F00
-
-/**************************************************************************
- * 				MCI_GetProc32			[internal]
- */
-MCIPROC	MCI_GetProc(UINT16 uDevType)
-{
-    MCIPROC	proc = 0;
-
-    switch (uDevType) {
-    case MCI_DEVTYPE_CD_AUDIO:		proc = MCICDAUDIO_DriverProc;	break;
-    case MCI_DEVTYPE_WAVEFORM_AUDIO:	proc = MCIWAVE_DriverProc;	break;
-    case MCI_DEVTYPE_SEQUENCER:		proc = MCIMIDI_DriverProc;	break;
-    case MCI_DEVTYPE_ANIMATION: 	proc = MCIANIM_DriverProc;	break;
-    case MCI_DEVTYPE_DIGITAL_VIDEO:	proc = MCIAVI_DriverProc32;	break;
-    default:	TRACE(mci, "Unknown device type %u\n", uDevType);
-    }
-    return proc;
-}
-
-/**************************************************************************
- * 				MCI_GetDevType			[internal]
- */
-WORD		MCI_GetDevType(LPCSTR str)
-{
-    WORD 	uDevTyp = 0;
-
-    if (lstrcmpiA(str, "CDAUDIO") == 0) {
-	uDevTyp = MCI_DEVTYPE_CD_AUDIO;
-    } else if (lstrcmpiA(str, "WAVEAUDIO") == 0) {
-	uDevTyp = MCI_DEVTYPE_WAVEFORM_AUDIO;
-    } else if (lstrcmpiA(str, "SEQUENCER") == 0)	{
-	uDevTyp = MCI_DEVTYPE_SEQUENCER;
-    } else if (lstrcmpiA(str, "ANIMATION1") == 0) {
-	uDevTyp = MCI_DEVTYPE_ANIMATION;
-    } else if (lstrcmpiA(str, "AVIVIDEO") == 0) {
-	uDevTyp = MCI_DEVTYPE_DIGITAL_VIDEO;
-    }
-    TRACE(mci, "str = %s => %u\n", str, uDevTyp);
-    return uDevTyp;
-}
-
-/**************************************************************************
- * 				MCI_GetDevTypeString		[internal]
- */
-static	LPCSTR		MCI_GetDevTypeString(WORD uDevTyp)
-{
-    LPCSTR	str = "??? MCI ???";
-
-    switch (uDevTyp) {
-    case MCI_DEVTYPE_CD_AUDIO:		str = "CDAUDIO";	break;
-    case MCI_DEVTYPE_WAVEFORM_AUDIO:	str = "WAVEAUDIO";	break;
-    case MCI_DEVTYPE_SEQUENCER:		str = "SEQUENCER";	break;
-    case MCI_DEVTYPE_ANIMATION:		str = "ANIMATION1";	break;
-    case MCI_DEVTYPE_DIGITAL_VIDEO:	str = "AVIVIDEO";	break;
-    default:	FIXME(mci, "Incohenrent MCI definitions\n");
-    }
-    TRACE(mci, "devType=%u => %s\n", uDevTyp, str);
-    return str;
-}
-
-/**************************************************************************
- * 				MCI_DevIDToIndex	[internal]
- */
-int MCI_DevIDToIndex(UINT16 wDevID) 
-{
-    return wDevID - MCI_MAGIC;
-}
-
-/**************************************************************************
- * 				MCI_FirstDevId	[internal]
- */
-UINT16 MCI_FirstDevID(void)
-{
-    return MCI_MAGIC;
-}
-
-/**************************************************************************
- * 				MCI_NextDevId	[internal]
- */
-UINT16 MCI_NextDevID(UINT16 wDevID) 
-{
-    return wDevID + 1;
-}
-
-/**************************************************************************
- * 				MCI_DevIDValid	[internal]
- */
-BOOL MCI_DevIDValid(UINT16 wDevID) 
-{
-    return wDevID >= MCI_MAGIC && wDevID < (MCI_MAGIC + MAXMCIDRIVERS);
-}
-
 /**************************************************************************
  * 				MMSYSTEM_WEP		[MMSYSTEM.1]
  */
@@ -186,7 +74,7 @@
 static int		PlaySound_Playing = FALSE;
 
 static LPCSTR		PlaySound_pszSound = NULL;
-static HMODULE	PlaySound_hmod = 0;
+static HMODULE		PlaySound_hmod = 0;
 static DWORD		PlaySound_fdwSound = 0;
 static int		PlaySound_Loop = FALSE;
 static int		PlaySound_SearchMode = 0; /* 1 - sndPlaySound search order
@@ -369,9 +257,9 @@
 	PlaySound_Playing = TRUE;
 	
 	if ((PlaySound_fdwSound & SND_RESOURCE) == SND_RESOURCE) {
-	    HRSRC   hRES;
-	    HGLOBAL hGLOB;
-	    void      *ptr;
+	    HRSRC	hRES;
+	    HGLOBAL	hGLOB;
+	    void*	ptr;
 
 	    if ((hRES = FindResourceA(PlaySound_hmod, PlaySound_pszSound, "WAVE")) == 0) {
 		PlaySound_Result = FALSE;
@@ -486,18 +374,18 @@
 }
 
 /**************************************************************************
- * 				sndPlaySound		[MMSYSTEM.2][WINMM135]
+ * 				sndPlaySoundA		[MMSYSTEM.2][WINMM135]
  */
-BOOL16 WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT16 uFlags)
+BOOL16 WINAPI sndPlaySoundA(LPCSTR lpszSoundName, UINT16 uFlags)
 {
     PlaySound_SearchMode = 1;
     return PlaySoundA(lpszSoundName, 0, uFlags);
 }
 
 /**************************************************************************
- * 				sndPlaySound		[WINMM.136]
+ * 				sndPlaySoundW		[WINMM.136]
  */
-BOOL16 WINAPI sndPlaySound32W(LPCWSTR lpszSoundName, UINT16 uFlags)
+BOOL16 WINAPI sndPlaySoundW(LPCWSTR lpszSoundName, UINT16 uFlags)
 {
     PlaySound_SearchMode = 1;
     return PlaySoundW(lpszSoundName, 0, uFlags);
@@ -524,17 +412,17 @@
 /**************************************************************************
  * 				DriverProc	[MMSYSTEM.6]
  */
-LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDriv, WORD wMsg, 
-                          DWORD dwParam1, DWORD dwParam2)
+LRESULT WINAPI DriverProc16(DWORD dwDevID, HDRVR16 hDrv, WORD wMsg, 
+			    DWORD dwParam1, DWORD dwParam2)
 {
-    return DrvDefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2);
+    return DrvDefDriverProc(dwDevID, hDrv, wMsg, dwParam1, dwParam2);
 }
 
 /**************************************************************************
  * 				DriverCallback	[MMSYSTEM.31]
  */
 BOOL16 WINAPI DriverCallback16(DWORD dwCallBack, UINT16 uFlags, HANDLE16 hDev, 
-                             WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
+			       WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2)
 {
     TRACE(mmsys, "(%08lX, %04X, %04X, %04X, %08lX, %08lX, %08lX); !\n",
 	  dwCallBack, uFlags, hDev, wMsg, dwUser, dwParam1, dwParam2);
@@ -609,7 +497,7 @@
 /**************************************************************************
  * 				mixerGetDevCapsW		[WINMM.102]
  */
-UINT WINAPI mixerGetDevCapsW(UINT devid, LPMIXERCAPSW mixcaps,UINT size) 
+UINT WINAPI mixerGetDevCapsW(UINT devid, LPMIXERCAPSW mixcaps, UINT size) 
 {
     MIXERCAPS16	mic16;
     UINT	ret = mixerGetDevCaps16(devid, &mic16, sizeof(mic16));
@@ -626,7 +514,7 @@
 /**************************************************************************
  * 				mixerGetDevCaps		[WINMM.101]
  */
-UINT WINAPI mixerGetDevCapsA(UINT devid, LPMIXERCAPSA mixcaps,UINT size) 
+UINT WINAPI mixerGetDevCapsA(UINT devid, LPMIXERCAPSA mixcaps, UINT size) 
 {
     MIXERCAPS16	mic16;
     UINT	ret = mixerGetDevCaps16(devid, &mic16, sizeof(mic16));
@@ -643,7 +531,7 @@
 /**************************************************************************
  * 				mixerGetDevCaps	
  */
-UINT16 WINAPI mixerGetDevCaps16(UINT16 devid, LPMIXERCAPS16 mixcaps,UINT16 size) 
+UINT16 WINAPI mixerGetDevCaps16(UINT16 devid, LPMIXERCAPS16 mixcaps, UINT16 size) 
 {
     FIXME(mmsys,"should this be a fixme?\n");
     return mixMessage(devid, MXDM_GETDEVCAPS, 0L, (DWORD)mixcaps, (DWORD)size);
@@ -652,7 +540,7 @@
 /**************************************************************************
  * 				mixerOpen		[WINMM.110]
  */
-UINT WINAPI mixerOpen(LPHMIXER lphmix,UINT uDeviceID, DWORD dwCallback,
+UINT WINAPI mixerOpen(LPHMIXER lphmix, UINT uDeviceID, DWORD dwCallback,
 			  DWORD dwInstance, DWORD fdwOpen) 
 {
     HMIXER16	hmix16;
@@ -668,7 +556,7 @@
 /**************************************************************************
  * 				mixerOpen
  */
-UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix,UINT16 uDeviceID, DWORD dwCallback,
+UINT16 WINAPI mixerOpen16(LPHMIXER16 lphmix, UINT16 uDeviceID, DWORD dwCallback,
 			  DWORD dwInstance, DWORD fdwOpen) 
 {
     HMIXER16		hmix;
@@ -731,7 +619,7 @@
 /**************************************************************************
  * 				mixerGetID
  */
-UINT16 WINAPI mixerGetID16(HMIXEROBJ16 hmix,LPUINT16 lpid,DWORD fdwID) 
+UINT16 WINAPI mixerGetID16(HMIXEROBJ16 hmix, LPUINT16 lpid, DWORD fdwID) 
 {
     FIXME(mmsys,"(%04x): semi-stub\n",hmix);
     if (lpid)
@@ -742,69 +630,82 @@
 /**************************************************************************
  * 				mixerGetControlDetailsA	[WINMM.99]
  */
-UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmix,LPMIXERCONTROLDETAILS lpmcd,DWORD fdwDetails) 
+UINT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpmcd,fdwDetails);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmcd, fdwDetails);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetControlDetailsW	[WINMM.100]
  */
-UINT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmix,LPMIXERCONTROLDETAILS lpmcd,DWORD fdwDetails) 
+UINT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmix, LPMIXERCONTROLDETAILS lpmcd, DWORD fdwDetails) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",	hmix,lpmcd,fdwDetails);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",	hmix, lpmcd, fdwDetails);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetControlDetails	[MMSYSTEM.808]
  */
-UINT16 WINAPI mixerGetControlDetails16(HMIXEROBJ16 hmix,LPMIXERCONTROLDETAILS16 lpmcd,DWORD fdwDetails) 
+UINT16 WINAPI mixerGetControlDetails16(HMIXEROBJ16 hmix, LPMIXERCONTROLDETAILS16 lpmcd, DWORD fdwDetails) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpmcd,fdwDetails);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmcd, fdwDetails);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetLineControlsA	[WINMM.104]
  */
-UINT WINAPI mixerGetLineControlsA(HMIXEROBJ hmix,LPMIXERLINECONTROLSA lpmlc,DWORD fdwControls) 
+UINT WINAPI mixerGetLineControlsA(HMIXEROBJ hmix, LPMIXERLINECONTROLSA lpmlc, DWORD fdwControls) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpmlc,fdwControls);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmlc, fdwControls);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetLineControlsW	[WINMM.105]
  */
-UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix,LPMIXERLINECONTROLSW lpmlc,DWORD fdwControls) 
+UINT WINAPI mixerGetLineControlsW(HMIXEROBJ hmix, LPMIXERLINECONTROLSW lpmlc, DWORD fdwControls) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpmlc,fdwControls);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmlc, fdwControls);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetLineControls	[MMSYSTEM.807]
  */
-UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16 hmix,LPMIXERLINECONTROLS16 lpmlc,DWORD fdwControls) 
+UINT16 WINAPI mixerGetLineControls16(HMIXEROBJ16 hmix, LPMIXERLINECONTROLS16 lpmlc, DWORD fdwControls) 
 {
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpmlc,fdwControls);
+    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n", hmix, lpmlc, fdwControls);
     return MMSYSERR_NOTENABLED;
 }
 
 /**************************************************************************
  * 				mixerGetLineInfoA	[WINMM.106]
  */
-UINT WINAPI mixerGetLineInfoA(HMIXEROBJ hmix,LPMIXERLINEA lpml,DWORD fdwInfo) 
+UINT WINAPI mixerGetLineInfoA(HMIXEROBJ hmix, LPMIXERLINEA lpml, DWORD fdwInfo) 
 {
     MIXERLINE16		ml16;
     UINT		ret;
     
+    TRACE(mmsys, "(%04x,%p,%08lx)\n", hmix, lpml, fdwInfo);
+
+    if (lpml == NULL || lpml->cbStruct != sizeof(*lpml)) 
+	return MMSYSERR_INVALPARAM;
+
+    ml16.cbStruct = sizeof(ml16);
     ml16.dwDestination = lpml->dwDestination;
-    FIXME(mmsys,"(%04x,%p,%08lx): stub!\n",hmix,lpml,fdwInfo);
-    ret = mixerGetLineInfo16(hmix,&ml16,fdwInfo);
-    lpml->cbStruct = sizeof(*lpml);
+    ml16.dwSource = lpml->dwSource; 
+    ml16.dwLineID = lpml->dwLineID; 
+    ml16.dwUser = lpml->dwUser; 
+    ml16.dwComponentType = lpml->dwComponentType; 
+    ml16.cChannels = lpml->cChannels; 
+    ml16.cConnections = lpml->cConnections; 
+    ml16.cControls = lpml->cControls; 
+
+    ret = mixerGetLineInfo16(hmix, &ml16, fdwInfo);
+
     lpml->dwSource = ml16.dwSource;
     lpml->dwLineID = ml16.dwLineID;
     lpml->fdwLine = ml16.fdwLine;
@@ -873,7 +774,7 @@
  */
 UINT16 WINAPI mixerGetLineInfo16(HMIXEROBJ16 hmix, LPMIXERLINE16 lpml, DWORD fdwInfo) 
 {
-    UINT16 devid =  _get_mixerID_from_handle(hmix, fdwInfo);
+    UINT16 devid = _get_mixerID_from_handle(hmix, fdwInfo);
     
     FIXME(mmsys, "(%04x, %p[line %08lx], %08lx)\n",
 	  hmix, lpml, lpml->dwDestination, fdwInfo);
@@ -901,7 +802,7 @@
 /**************************************************************************
  * 				mixerMessage		[WINMM.109]
  */
-UINT WINAPI mixerMessage(HMIXER hmix,UINT uMsg, DWORD dwParam1, DWORD dwParam2) 
+UINT WINAPI mixerMessage(HMIXER hmix, UINT uMsg, DWORD dwParam1, DWORD dwParam2) 
 {
     LPMIXEROPENDESC	lpmod;
     UINT16		uDeviceID;
@@ -919,7 +820,7 @@
 /**************************************************************************
  * 				mixerMessage		[MMSYSTEM.804]
  */
-UINT16 WINAPI mixerMessage16(HMIXER16 hmix,UINT16 uMsg, DWORD dwParam1, DWORD dwParam2) 
+UINT16 WINAPI mixerMessage16(HMIXER16 hmix, UINT16 uMsg, DWORD dwParam1, DWORD dwParam2) 
 {
     LPMIXEROPENDESC	lpmod;
     UINT16		uDeviceID;
@@ -955,7 +856,7 @@
 /**************************************************************************
  * 				auxGetDevCaps		[WINMM.20]
  */
-UINT WINAPI auxGetDevCapsW(UINT uDeviceID, LPAUXCAPSW lpCaps,UINT uSize)
+UINT WINAPI auxGetDevCapsW(UINT uDeviceID, LPAUXCAPSW lpCaps, UINT uSize)
 {
     AUXCAPS16	ac16;
     UINT	ret = auxGetDevCaps16(uDeviceID, &ac16, sizeof(ac16));
@@ -972,7 +873,7 @@
 /**************************************************************************
  * 				auxGetDevCaps		[WINMM.21]
  */
-UINT WINAPI auxGetDevCapsA(UINT uDeviceID, LPAUXCAPSA lpCaps,UINT uSize)
+UINT WINAPI auxGetDevCapsA(UINT uDeviceID, LPAUXCAPSA lpCaps, UINT uSize)
 {
     AUXCAPS16	ac16;
     UINT	ret = auxGetDevCaps16(uDeviceID, &ac16, sizeof(ac16));
@@ -1000,7 +901,7 @@
 /**************************************************************************
  * 				auxGetVolume		[WINM.23]
  */
-UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
+UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD* lpdwVolume)
 {
     return auxGetVolume16(uDeviceID, lpdwVolume);
 }
@@ -1008,7 +909,7 @@
 /**************************************************************************
  * 				auxGetVolume		[MMSYSTEM.352]
  */
-UINT16 WINAPI auxGetVolume16(UINT16 uDeviceID, DWORD * lpdwVolume)
+UINT16 WINAPI auxGetVolume16(UINT16 uDeviceID, DWORD* lpdwVolume)
 {
     TRACE(mmsys, "(%04X, %p) !\n", uDeviceID, lpdwVolume);
 
@@ -1036,7 +937,7 @@
 /**************************************************************************
  * 				auxOutMessage		[MMSYSTEM.354]
  */
-DWORD WINAPI auxOutMessage(UINT uDeviceID,UINT uMessage, DWORD dw1, DWORD dw2)
+DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2)
 {
     switch (uMessage) {
     case AUXDM_GETNUMDEVS:
@@ -1081,20 +982,20 @@
 /**************************************************************************
  * 				mciGetErrorStringW		[WINMM.46]
  */
-BOOL WINAPI mciGetErrorStringW(DWORD wError, LPWSTR lpstrBuffer,UINT uLength)
+BOOL WINAPI mciGetErrorStringW(DWORD wError, LPWSTR lpstrBuffer, UINT uLength)
 {
     LPSTR	bufstr = HeapAlloc(GetProcessHeap(), 0,uLength);
-    BOOL	ret = mciGetErrorStringA(wError,bufstr,uLength);
+    BOOL	ret = mciGetErrorStringA(wError, bufstr, uLength);
     
-    lstrcpyAtoW(lpstrBuffer,bufstr);
-    HeapFree(GetProcessHeap(), 0,bufstr);
+    lstrcpyAtoW(lpstrBuffer, bufstr);
+    HeapFree(GetProcessHeap(), 0, bufstr);
     return ret;
 }
 
 /**************************************************************************
  * 				mciGetErrorStringA		[WINMM.45]
  */
-BOOL WINAPI mciGetErrorStringA(DWORD wError, LPSTR lpstrBuffer,UINT uLength)
+BOOL WINAPI mciGetErrorStringA(DWORD wError, LPSTR lpstrBuffer, UINT uLength)
 {
     return mciGetErrorString16(wError, lpstrBuffer,uLength);
 }
@@ -1102,7 +1003,7 @@
 /**************************************************************************
  * 				mciGetErrorString		[MMSYSTEM.706]
  */
-BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer,UINT16 uLength)
+BOOL16 WINAPI mciGetErrorString16(DWORD wError, LPSTR lpstrBuffer, UINT16 uLength)
 {
     LPSTR	msgptr;
 
@@ -1398,7 +1299,7 @@
 }
 
 /**************************************************************************
- *			mciDriverNotify32			[WINMM.36]
+ *			mciDriverNotify				[WINMM.36]
  */
 BOOL WINAPI mciDriverNotify(HWND hWndCallBack, UINT wDevID, UINT wStatus)
 {
@@ -1416,50 +1317,52 @@
 /**************************************************************************
  * 			mciGetDriverData			[MMSYSTEM.708]
  */
-DWORD WINAPI mciGetDriverData16(HDRVR16 hdrv) 
+DWORD WINAPI mciGetDriverData16(HDRVR16 hDrv) 
 {
-    return mciGetDriverData(hdrv);
+    return mciGetDriverData(hDrv);
 }
 
 /**************************************************************************
  * 			mciGetDriverData			[WINMM.44]
  */
-DWORD WINAPI mciGetDriverData(HDRVR hdrv) 
+DWORD WINAPI mciGetDriverData(HDRVR hDrv) 
 {
-    TRACE(mmsys,"(%04x)\n", hdrv);
-    if (!MCI_DevIDValid(hdrv) || MCI_GetDrv(hdrv)->modp.wType == 0) {
+    TRACE(mmsys,"(%04x)\n", hDrv);
+    if (!MCI_DevIDValid(hDrv) || MCI_GetDrv(hDrv)->modp.wType == 0) {
+	WARN(mmsys, "Bad hDrv\n");
 	return 0L;
     }
     
-    return MCI_GetDrv(hdrv)->dwPrivate;
+    return MCI_GetDrv(hDrv)->dwPrivate;
 }
 
 /**************************************************************************
  * 			mciSetDriverData			[MMSYSTEM.707]
  */
-BOOL16 WINAPI mciSetDriverData16(HDRVR16 hdrv, DWORD data) 
+BOOL16 WINAPI mciSetDriverData16(HDRVR16 hDrv, DWORD data) 
 {
-    return mciSetDriverData(hdrv, data);
+    return mciSetDriverData(hDrv, data);
 }
 
 /**************************************************************************
  * 			mciSetDriverData			[WINMM.53]
  */
-BOOL WINAPI mciSetDriverData(HDRVR hdrv, DWORD data) 
+BOOL WINAPI mciSetDriverData(HDRVR hDrv, DWORD data) 
 {
-    TRACE(mmsys,"(%04x,%08lx)\n", hdrv, data);
-    if (!MCI_DevIDValid(hdrv) || MCI_GetDrv(hdrv)->modp.wType == 0) {
+    TRACE(mmsys,"(%04x,%08lx)\n", hDrv, data);
+    if (!MCI_DevIDValid(hDrv) || MCI_GetDrv(hDrv)->modp.wType == 0) {
+	WARN(mmsys, "Bad hDrv\n");
 	return FALSE;
     }
     
-    MCI_GetDrv(hdrv)->dwPrivate = data;
+    MCI_GetDrv(hDrv)->dwPrivate = data;
     return TRUE;
 }
 
 /**************************************************************************
  *                    	mciLoadCommandResource			[MMSYSTEM.705]
  */
-UINT16 WINAPI mciLoadCommandResource16(HANDLE16 hinst, LPCSTR resname,UINT16 type)
+UINT16 WINAPI mciLoadCommandResource16(HANDLE16 hinst, LPCSTR resname, UINT16 type)
 {
     char            buf[200];
     OFSTRUCT        ofs;
@@ -1483,7 +1386,7 @@
     strcat(buf,".mci");
     if (OpenFile(buf, &ofs,OF_EXIST) != HFILE_ERROR) {
 	xhinst = LoadLibrary16(buf);
-	if (xhinst >32)
+	if (xhinst > 32)
 	    hinst = xhinst;
     } /* else use passed hinst */
     segstr = SEGPTR_STRDUP(resname);
@@ -1523,674 +1426,51 @@
  *                    	mciFreeCommandResource			[WINMM.39]
  */
 BOOL WINAPI mciFreeCommandResource(UINT uTable)
- {
+{
     FIXME(mci, "(%08x) stub\n", uTable);
     return 0;
- }
+}
 
 /**************************************************************************
  *                    	mciLoadCommandResource  		[WINMM.48]
  */
-UINT WINAPI mciLoadCommandResource(HANDLE hinst, LPCWSTR resname,UINT type)
+UINT WINAPI mciLoadCommandResource(HANDLE hinst, LPCWSTR resname, UINT type)
 {
-    FIXME(mmsys,"(%04x,%s,%d): stub!\n", hinst, debugstr_w(resname), type);
+    FIXME(mci, "(%04x,%s,%d): stub!\n", hinst, debugstr_w(resname), type);
     return 0;
 }
 
-const char* MCI_CommandToString(UINT16 wMsg)
-{
-    static char buffer[100];
-    
-#define CASE(s) case (s): return #s
-    
-    switch (wMsg) {
-	CASE(MCI_OPEN);
-	CASE(MCI_CLOSE);
-	CASE(MCI_ESCAPE);
-	CASE(MCI_PLAY);
-	CASE(MCI_SEEK);
-	CASE(MCI_STOP);
-	CASE(MCI_PAUSE);
-	CASE(MCI_INFO);
-	CASE(MCI_GETDEVCAPS);
-	CASE(MCI_SPIN);
-	CASE(MCI_SET);
-	CASE(MCI_STEP);
-	CASE(MCI_RECORD);
-	CASE(MCI_SYSINFO);
-	CASE(MCI_BREAK);
-	CASE(MCI_SAVE);
-	CASE(MCI_STATUS);
-	CASE(MCI_CUE);
-	CASE(MCI_REALIZE);
-	CASE(MCI_WINDOW);
-	CASE(MCI_PUT);
-	CASE(MCI_WHERE);
-	CASE(MCI_FREEZE);
-	CASE(MCI_UNFREEZE);
-	CASE(MCI_LOAD);
-	CASE(MCI_CUT);
-	CASE(MCI_COPY);
-	CASE(MCI_PASTE);
-	CASE(MCI_UPDATE);
-	CASE(MCI_RESUME);
-	CASE(MCI_DELETE);
-    default:
-	sprintf(buffer, "MCI_<<%04X>>", wMsg);
-	return buffer;
-    }
-}
-
-/**************************************************************************
- * 			MCI_SendCommand32			[internal]
- */
-DWORD MCI_SendCommand(UINT wDevID, UINT16 wMsg, DWORD dwParam1, DWORD dwParam2)
-{
-    DWORD		dwRet = MCIERR_DEVICE_NOT_INSTALLED;
-    
-    if (!MCI_DevIDValid(wDevID)) {
-	dwRet = MCIERR_INVALID_DEVICE_ID;
-    } else {
-	MCIPROC		proc = MCI_GetProc(MCI_GetDrv(wDevID)->modp.wType);
-	
-	if (proc) {
-	    dwRet = (*proc)(MCI_GetDrv(wDevID)->modp.wDeviceID, 
-			    MCI_GetDrv(wDevID)->hDrv, 
-			    wMsg, dwParam1, dwParam2);
-	} else if (MCI_GetDrv(wDevID)->driverProc) {
-	    FIXME(mmsys, "is that correct ?\n");
-	    dwRet = Callbacks->CallDriverProc(MCI_GetDrv(wDevID)->driverProc,
-					      MCI_GetDrv(wDevID)->modp.wDeviceID,
-					      MCI_GetDrv(wDevID)->hDrv, 
-					      wMsg, dwParam1, dwParam2);
-	} else {
-	    WARN(mmsys, "unknown device type=%04X !\n", MCI_GetDrv(wDevID)->modp.wType);
-	}
-    }
-    return dwRet;
-}
-
-/**************************************************************************
- * 			MCI_Open				[internal]
- */
-static DWORD MCI_Open(DWORD dwParam, LPMCI_OPEN_PARMSA lpParms)
-{
-    char		str[128];
-    UINT16		uDevTyp = 0;
-    UINT16		wDevID = MCI_FirstDevID();
-    DWORD 		dwRet;
-    
-    TRACE(mmsys, "(%08lX, %p)\n", dwParam, lpParms);
-    if (lpParms == NULL) return MCIERR_NULL_PARAMETER_BLOCK;
-    
-    if ((dwParam & ~(MCI_OPEN_SHAREABLE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_NOTIFY|MCI_WAIT)) != 0) {
-	FIXME(mmsys, "unsupported yet dwFlags=%08lX\n", 
-	      (dwParam & ~(MCI_OPEN_SHAREABLE|MCI_OPEN_ELEMENT|MCI_OPEN_ALIAS|MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_NOTIFY|MCI_WAIT)));
-    }
-
-    while (MCI_GetDrv(wDevID)->modp.wType != 0) {
-	wDevID = MCI_NextDevID(wDevID);
-	if (!MCI_DevIDValid(wDevID)) {
-	    TRACE(mmsys, "MAXMCIDRIVERS reached !\n");
-	    return MCIERR_OUT_OF_MEMORY;
-	}
-    }
-
-    TRACE(mmsys, "wDevID=%04X \n", wDevID);
-    memcpy(MCI_GetOpenDrv(wDevID), lpParms, sizeof(*lpParms));
-    
-    if (dwParam & MCI_OPEN_ELEMENT) {
-	char	*s,*t;
-	
-	TRACE(mmsys,"lpstrElementName='%s'\n", lpParms->lpstrElementName);
-	s = lpParms->lpstrElementName;
-	t = strrchr(s, '.');
-	if (t) {
-	    GetProfileStringA("mci extensions", t+1, "*", str, sizeof(str));
-	    CharUpperA(str);
-	    uDevTyp = MCI_GetDevType(str);
-	    if (uDevTyp == 0) {
-		if (strcmp(str,"*") == 0) {
-		TRACE(mmsys,"No [mci extensions] entry for %s found.\n", t);
-		return MCIERR_EXTENSION_NOT_FOUND;
-		}
-#if testing32
-		/* FIXME has to be re-written, seems to be experimental 16 bit code anyway */
-		else  {
-		    HDRVR16 hdrv = OpenDriver32(str, "mci", NULL);
-		    if (hdrv) {
-			HMODULE16	hmod;
-			
-			hmod = GetDriverModuleHandle(hdrv);
-			MCI_GetDrv(wDevID)->hDrv = hdrv;
-			MCI_GetDrv(wDevID)->driverProc = GetProcAddress(hmod,oouch SEGPTR_GET(SEGPTR_STRDUP("DRIVERPROC")));
-			uDevTyp = MCI_DEVTYPE_OTHER;
-		    } else {
-			FIXME(mmsys, "[mci extensions] entry %s for %s not supported.\n", str, t);
-			return MCIERR_DEVICE_NOT_INSTALLED;
-		    }
-		}
-#endif
-	    }
-	} else if (GetDriveTypeA(s) == DRIVE_CDROM) {
-	    /* FIXME: this will not work if several CDROM drives are installed on the machine */
-	    uDevTyp = MCI_DEVTYPE_CD_AUDIO;
-	} else {
-	    return MCIERR_EXTENSION_NOT_FOUND;
-	}
-    }
-    
-    if (dwParam & MCI_OPEN_ALIAS) {
-	TRACE(mmsys, "Alias='%s' !\n", lpParms->lpstrAlias);
-	/* FIXME is there any memory leak here ? */
-	MCI_GetOpenDrv(wDevID)->lpstrAlias = strdup(lpParms->lpstrAlias);
-	/* mplayer does allocate alias to CDAUDIO */
-    }
-    if (dwParam & MCI_OPEN_TYPE) {
-	if (dwParam & MCI_OPEN_TYPE_ID) {
-	    TRACE(mmsys, "Dev=%08lx!\n", (DWORD)lpParms->lpstrDeviceType);
-	    uDevTyp = LOWORD((DWORD)lpParms->lpstrDeviceType);
-	    MCI_GetOpenDrv(wDevID)->lpstrDeviceType = lpParms->lpstrDeviceType;
-	} else {
-	    if (lpParms->lpstrDeviceType == NULL) 
-		return MCIERR_NULL_PARAMETER_BLOCK;
-	    TRACE(mmsys, "Dev='%s' !\n", lpParms->lpstrDeviceType);
-	    /* FIXME is there any memory leak here ? */
-	    MCI_GetOpenDrv(wDevID)->lpstrDeviceType = strdup(lpParms->lpstrDeviceType);
-	    strcpy(str, lpParms->lpstrDeviceType);
-	    CharUpperA(str);
-	    uDevTyp = MCI_GetDevType(str);
-	    if (uDevTyp == 0) {
-#if testing32
-		/* FIXME has to be re-written, seems to be experimental 16 bit code anyway */
-		HDRVR16 hdrv;
-		TRACE(mmsys,"trying to load driver...\n");
-		hdrv = OpenDriver32(str,"mci",NULL);
-		if (hdrv) {
-		    HMODULE16	hmod;
-		    
-		    hmod = GetDriverModuleHandle(hdrv);
-		    MCI_GetDrv(wDevID)->hDrv = hdrv;
-		    MCI_GetDrv(wDevID)->driverProc = GetProcAddress(hmod,oouch SEGPTR_GET(SEGPTR_STRDUP("DriverProc")));
-		    uDevTyp = MCI_DEVTYPE_OTHER;
-		} else
-#endif
-		    return MCIERR_DEVICE_NOT_INSTALLED;
-	    }
-	}
-    }
-    MCI_GetDrv(wDevID)->modp.wType = uDevTyp;
-    MCI_GetDrv(wDevID)->modp.wDeviceID = 0;  /* FIXME? for multiple devices */
-    MCI_GetDrv(wDevID)->dwPrivate = 0;
-    lpParms->wDeviceID = wDevID;
-    TRACE(mmsys, "mcidev=%d, uDevTyp=%04X wDeviceID=%04X !\n", 
-	  wDevID, uDevTyp, lpParms->wDeviceID);
-    dwRet = MCI_SendCommand(wDevID, MCI_OPEN_DRIVER, dwParam, (DWORD)lpParms);
-    
-    if (dwRet == 0) {
-	/* only handled devices fall through */
-	TRACE(mmsys, "wDevID = %04X wDeviceID = %d dwRet = %ld\n", wDevID, lpParms->wDeviceID, dwRet);
-    } else {
-	TRACE(mmsys, "failed to open driver (MCI_OPEN_DRIVER msg) [%08lx], closing\n", dwRet);
-	MCI_GetDrv(wDevID)->modp.wType = 0;
-    }
-    if (dwParam & MCI_NOTIFY)
-	mciDriverNotify16(lpParms->dwCallback, wDevID, dwRet == 0 ? MCI_NOTIFY_SUCCESSFUL : MCI_NOTIFY_FAILURE);
-    
-    return dwRet;
-}
-
-/**************************************************************************
- * 			MCI_Close				[internal]
- */
-static DWORD MCI_Close(UINT16 wDevID, DWORD dwParam, LPMCI_GENERIC_PARMS lpParms)
-{
-    DWORD	dwRet;
-    
-    TRACE(mmsys, "(%04x, %08lX, %p)\n", wDevID, dwParam, lpParms);
-
-    if (wDevID == MCI_ALL_DEVICE_ID) {
-	FIXME(mmsys, "unhandled MCI_ALL_DEVICE_ID\n");
-	return MCIERR_CANNOT_USE_ALL;
-    }
-
-    dwRet = MCI_SendCommand(wDevID, MCI_CLOSE_DRIVER, dwParam, (DWORD)lpParms);
-    MCI_GetDrv(wDevID)->modp.wType = 0;
-    
-    if (dwParam&MCI_NOTIFY)
-	mciDriverNotify16(lpParms->dwCallback, wDevID,
-			(dwRet==0?MCI_NOTIFY_SUCCESSFUL:MCI_NOTIFY_FAILURE));
-    
-    TRACE(mmsys, "returns %ld\n", dwRet);
-    return dwRet;
-}
-
-/**************************************************************************
- * 			MCI_WriteString				[internal]
- */
-DWORD	MCI_WriteString(LPSTR lpDstStr, DWORD dstSize, LPCSTR lpSrcStr)
-{
-    DWORD	ret;
-
-    if (dstSize <= strlen(lpSrcStr)) {
-	lstrcpynA(lpDstStr, lpSrcStr, dstSize - 1);
-	ret = MCIERR_PARAM_OVERFLOW;
-    } else {
-	strcpy(lpDstStr, lpSrcStr);
-	ret = 0;
-    }
-    return ret;
-}
-
-/**************************************************************************
- * 			MCI_Sysinfo				[internal]
- */
-static DWORD MCI_SysInfo(UINT uDevID, DWORD dwFlags, LPMCI_SYSINFO_PARMSA lpParms)
-{
-    DWORD	ret = MCIERR_INVALID_DEVICE_ID;
-
-    if (lpParms == NULL)	return MCIERR_NULL_PARAMETER_BLOCK;
-
-    TRACE(mci, "(%08x, %08lX, %08lX[num=%ld, wDevTyp=%u])\n", 
-	  uDevID, dwFlags, (DWORD)lpParms, lpParms->dwNumber, lpParms->wDeviceType);
-
-    switch (dwFlags & ~MCI_SYSINFO_OPEN) {
-    case MCI_SYSINFO_QUANTITY:
-	{
-	    DWORD	cnt = 0;
-	    WORD	i;
-
-	    if (lpParms->wDeviceType < MCI_DEVTYPE_FIRST || lpParms->wDeviceType > MCI_DEVTYPE_LAST) {
-		if (dwFlags & MCI_SYSINFO_OPEN) {
-		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of open MCI drivers\n");
-		    for (i = 0; i < MAXMCIDRIVERS; i++) {
-			if (mciDrv[i].modp.wType != 0) cnt++;
-		    }
-		} else {
-		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of installed MCI drivers\n");
-		    cnt = mciInstalledCount;
-		}
-	    } else {
-		if (dwFlags & MCI_SYSINFO_OPEN) {
-		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of open MCI drivers of type %u\n", lpParms->wDeviceType);
-		    for (i = 0; i < MAXMCIDRIVERS; i++) {
-			if (mciDrv[i].modp.wType == lpParms->wDeviceType) cnt++;
-		    }
-		} else {
-		    TRACE(mci, "MCI_SYSINFO_QUANTITY: # of installed MCI drivers of type %u\n", lpParms->wDeviceType);
-		    FIXME(mci, "Don't know how to get # of MCI devices of a given type\n");
-		    cnt = 1;
-		}
-	    }
-	    *(DWORD*)lpParms->lpstrReturn = cnt;
-	}
-	TRACE(mci, "(%ld) => '%ld'\n", lpParms->dwNumber, *(DWORD*)lpParms->lpstrReturn);
-	ret = 0;
-	break;
-    case MCI_SYSINFO_INSTALLNAME:
-	TRACE(mci, "MCI_SYSINFO_INSTALLNAME \n");
-	if (MCI_DevIDValid(uDevID)) {
-	    LPCSTR	str = MCI_GetDevTypeString(MCI_GetDrv(uDevID)->modp.wType);
-	    ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, str);
-	} else {
-	    *lpParms->lpstrReturn = 0;
-	    ret = MCIERR_INVALID_DEVICE_ID;
-	}
-	TRACE(mci, "(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
-	break;
-    case MCI_SYSINFO_NAME:
-	TRACE(mci, "MCI_SYSINFO_NAME\n");
-	if (dwFlags & MCI_SYSINFO_OPEN) {
-	    FIXME(mci, "Don't handle MCI_SYSINFO_NAME|MCI_SYSINFO_OPEN (yet)\n");
-	    ret = MCIERR_UNRECOGNIZED_COMMAND;
-	} else if (lpParms->dwNumber > mciInstalledCount) {
-	    ret = MCIERR_OUTOFRANGE;
-	} else {
-	    DWORD	count = lpParms->dwNumber;
-	    LPSTR	ptr = lpmciInstallNames;
-
-	    while (--count > 0) ptr += strlen(ptr) + 1;
-	    ret = MCI_WriteString(lpParms->lpstrReturn, lpParms->dwRetSize, ptr);
-	}
-	TRACE(mci, "(%ld) => '%s'\n", lpParms->dwNumber, lpParms->lpstrReturn);
-	break;
-    default:
-	TRACE(mci, "Unsupported flag value=%08lx\n", dwFlags);
-	ret = MCIERR_UNRECOGNIZED_COMMAND;
-    }
-    return ret;
-}
-
-struct SCA {
-    UINT 	wDevID;
-    UINT 	wMsg;
-    DWORD 	dwParam1;
-    DWORD 	dwParam2;
-    BOOL	allocatedCopy;
-};
-
-DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2);
-
-/**************************************************************************
- * 				MCI_SCAStarter32			[internal]
- */
-static DWORD WINAPI MCI_SCAStarter(LPVOID arg)
-{
-    struct SCA*	sca = (struct SCA*)arg;
-    DWORD		ret;
-
-    TRACE(mci, "In thread before async command (%08x,%s,%08lx,%08lx)\n",
-	  sca->wDevID, MCI_CommandToString(sca->wMsg), sca->dwParam1, sca->dwParam2);
-    ret = mciSendCommandA(sca->wDevID, sca->wMsg, sca->dwParam1 | MCI_WAIT, sca->dwParam2);
-    TRACE(mci, "In thread after async command (%08x,%s,%08lx,%08lx)\n",
-	  sca->wDevID, MCI_CommandToString(sca->wMsg), sca->dwParam1, sca->dwParam2);
-    if (sca->allocatedCopy)
-	HeapFree(GetProcessHeap(), 0, (LPVOID)sca->dwParam2);
-    HeapFree(GetProcessHeap(), 0, sca);
-    ExitThread(ret);
-    WARN(mci, "Should not happen ? what's wrong \n");
-    /* should not go after this point */
-    return ret;
-}
-
-/**************************************************************************
- * 				MCI_SendCommandAsync32		[internal]
- */
-DWORD MCI_SendCommandAsync(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2, UINT size)
-{
-    struct SCA*	sca = HeapAlloc(GetProcessHeap(), 0, sizeof(struct SCA));
-
-    if (sca == 0)
-	return MCIERR_OUT_OF_MEMORY;
-
-    sca->wDevID   = wDevID;
-    sca->wMsg     = wMsg;
-    sca->dwParam1 = dwParam1;
-    
-    if (size) {
-	sca->dwParam2 = (DWORD)HeapAlloc(GetProcessHeap(), 0, size);
-	if (sca->dwParam2 == 0) {
-	    HeapFree(GetProcessHeap(), 0, sca);
-	    return MCIERR_OUT_OF_MEMORY;
-	}
-	sca->allocatedCopy = TRUE;
-	/* copy structure passed by program in dwParam2 to be sure 
-	 * we can still use it whatever the program does 
-	 */
-	memcpy((LPVOID)sca->dwParam2, (LPVOID)dwParam2, size);
-    } else {
-	sca->dwParam2 = dwParam2;
-	sca->allocatedCopy = FALSE;
-    }
-
-    if (CreateThread(NULL, 0, MCI_SCAStarter, sca, 0, NULL) == 0) {
-	WARN(mci, "Couldn't allocate thread for async command handling, sending synchonously\n");
-	return MCI_SCAStarter(&sca);
-    }
-    return 0;
-}
-
-/**************************************************************************
- * 			MCI_MapMsg16To32A			[internal]
- */
-int	MCI_MapMsg16To32A(WORD uDevType, WORD wMsg, DWORD* lParam)
-{
-    if (*lParam == 0)
-	return 0;
-    /* FIXME: to add also (with seg/linear modifications to do):
-     * MCI_LIST, MCI_LOAD, MCI_QUALITY, MCI_RESERVE, MCI_RESTORE, MCI_SAVE
-     * MCI_SETAUDIO, MCI_SETTUNER, MCI_SETVIDEO, MCI_WINDOW
-     */
-    switch (wMsg) {
-	/* case MCI_CAPTURE */
-    case MCI_CLOSE:		
-    case MCI_CLOSE_DRIVER:	
-	/* case MCI_CONFIGURE:*/
-    case MCI_COPY:
-    case MCI_CUE:
-    case MCI_CUT:
-    case MCI_DELETE:
-    case MCI_FREEZE:
-    case MCI_GETDEVCAPS:
-	/* case MCI_INDEX: */
-	/* case MCI_MARK: */
-	/* case MCI_MONITOR: */
-    case MCI_PASTE:
-    case MCI_PAUSE:		
-    case MCI_PLAY:		
-    case MCI_PUT:
-    case MCI_REALIZE:
-    case MCI_RECORD:		
-    case MCI_RESUME:		
-    case MCI_SEEK:		
-    case MCI_SET:
-	/* case MCI_SETTIMECODE:*/
-	/* case MCI_SIGNAL:*/
-    case MCI_SPIN:
-    case MCI_STATUS:		/* FIXME: is wrong for digital video */
-    case MCI_STEP:
-    case MCI_STOP:		
-	/* case MCI_UNDO: */
-    case MCI_UNFREEZE:
-    case MCI_UPDATE:
-    case MCI_WHERE:
-	*lParam = (DWORD)PTR_SEG_TO_LIN(*lParam);
-	return 0;
-    case MCI_BREAK:
-	{
-            LPMCI_BREAK_PARMS		mbp32 = HeapAlloc(SystemHeap, 0, sizeof(MCI_BREAK_PARMS));
-	    LPMCI_BREAK_PARMS16		mbp16 = PTR_SEG_TO_LIN(*lParam);
-
-	    if (mbp32) {
-		mbp32->dwCallback = mbp16->dwCallback;
-		mbp32->nVirtKey = mbp16->nVirtKey;
-		mbp32->hwndBreak = mbp16->hwndBreak;
-	    } else {
-		return -2;
-	    }
-	    *lParam = (DWORD)mbp32;
-	}
-	return 1;
-    case MCI_ESCAPE:
-	{
-            LPMCI_VD_ESCAPE_PARMSA	mvep32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_VD_ESCAPE_PARMSA));
-	    LPMCI_VD_ESCAPE_PARMS16	mvep16  = PTR_SEG_TO_LIN(*lParam);
-
-	    if (mvep32a) {
-		mvep32a->dwCallback       = mvep16->dwCallback;
-		mvep32a->lpstrCommand     = PTR_SEG_TO_LIN(mvep16->lpstrCommand);
-	    } else {
-		return -2;
-	    }
-	    *lParam = (DWORD)mvep32a;
-	}
-	return 1;
-    case MCI_INFO:
-	{
-            LPMCI_INFO_PARMSA	mip32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_INFO_PARMSA));
-	    LPMCI_INFO_PARMS16	mip16  = PTR_SEG_TO_LIN(*lParam);
-
-	    /* FIXME this is wrong if device is of type 
-	     * MCI_DEVTYPE_DIGITAL_VIDEO, some members are not mapped
-	     */
-	    if (mip32a) {
-		mip32a->dwCallback  = mip16->dwCallback;
-		mip32a->lpstrReturn = PTR_SEG_TO_LIN(mip16->lpstrReturn);
-		mip32a->dwRetSize   = mip16->dwRetSize;
-	    } else {
-		return -2;
-	    }
-	    *lParam = (DWORD)mip32a;
-	}
-	return 1;
-    case MCI_OPEN:
-    case MCI_OPEN_DRIVER:	
-	{
-            LPMCI_OPEN_PARMSA	mop32a = HeapAlloc(SystemHeap, 0, sizeof(LPMCI_OPEN_PARMS16) + sizeof(MCI_OPEN_PARMSA) + 2 * sizeof(DWORD));
-	    LPMCI_OPEN_PARMS16	mop16  = PTR_SEG_TO_LIN(*lParam);
-
-	    if (mop32a) {
-		*(LPMCI_OPEN_PARMS16*)(mop32a) = mop16;
-		mop32a = (LPMCI_OPEN_PARMSA)((char*)mop32a + sizeof(LPMCI_OPEN_PARMS16));
-		mop32a->dwCallback       = mop16->dwCallback;
-		mop32a->wDeviceID        = mop16->wDeviceID;
-		mop32a->lpstrDeviceType  = PTR_SEG_TO_LIN(mop16->lpstrDeviceType);
-		mop32a->lpstrElementName = PTR_SEG_TO_LIN(mop16->lpstrElementName);
-		mop32a->lpstrAlias       = PTR_SEG_TO_LIN(mop16->lpstrAlias);
-		/* copy extended information if any...
-		 * FIXME: this may seg fault if initial structure does not contain them and
-		 * the reads after msip16 fail under LDT limits...
-		 * NOTE: this should be split in two. First pass, while calling MCI_OPEN, and 
-		 * should not take care of extended parameters, and should be used by MCI_Open
-		 * to fetch uDevTyp. When, this is known, the mapping for sending the 
-		 * MCI_OPEN_DRIVER shall be done depending on uDevTyp.
-		 */
-		((DWORD*)(mop32a + 1))[0] = ((DWORD*)(mop16 + 1))[0];
-		((DWORD*)(mop32a + 1))[1] = ((DWORD*)(mop16 + 1))[1];
-	    } else {
-		return -2;
-	    }
-	    *lParam = (DWORD)mop32a;
-	}
-	return 1;
-    case MCI_SYSINFO:
-	{
-            LPMCI_SYSINFO_PARMSA	msip32a = HeapAlloc(SystemHeap, 0, sizeof(MCI_SYSINFO_PARMSA));
-	    LPMCI_SYSINFO_PARMS16	msip16  = PTR_SEG_TO_LIN(*lParam);
-
-	    if (msip32a) {
-		msip32a->dwCallback       = msip16->dwCallback;
-		msip32a->lpstrReturn      = PTR_SEG_TO_LIN(msip16->lpstrReturn);
-		msip32a->dwRetSize        = msip16->dwRetSize;
-		msip32a->dwNumber         = msip16->dwNumber;
-		msip32a->wDeviceType      = msip16->wDeviceType;
-	    } else {
-		return -2;
-	    }
-	    *lParam = (DWORD)msip32a;
-	}
-	return 1;
-    case DRV_LOAD:
-    case DRV_ENABLE:
-    case DRV_OPEN:
-    case DRV_CLOSE:
-    case DRV_DISABLE:
-    case DRV_FREE:
-    case DRV_CONFIGURE:
-    case DRV_QUERYCONFIGURE:
-    case DRV_INSTALL:
-    case DRV_REMOVE:
-    case DRV_EXITSESSION:
-    case DRV_EXITAPPLICATION:
-    case DRV_POWER:
-	FIXME(mci, "This is a hack\n");
-	return 0;
-
-    default:
-	WARN(mci, "Don't know how to map msg=%s\n", MCI_CommandToString(wMsg));
-    }
-    return -1;
-}
-
-/**************************************************************************
- * 			MCI_UnMapMsg16To32A			[internal]
- */
-int	MCI_UnMapMsg16To32A(WORD uDevTyp, WORD wMsg, DWORD lParam)
-{
-    switch (wMsg) {
-	/* case MCI_CAPTURE */
-    case MCI_CLOSE:
-    case MCI_CLOSE_DRIVER:	
-	/* case MCI_CONFIGURE:*/
-    case MCI_COPY:
-    case MCI_CUE:
-    case MCI_CUT:
-    case MCI_DELETE:
-    case MCI_FREEZE:
-    case MCI_GETDEVCAPS:
-	/* case MCI_INDEX: */
-	/* case MCI_MARK: */
-	/* case MCI_MONITOR: */
-    case MCI_PASTE:
-    case MCI_PAUSE:		
-    case MCI_PLAY:		
-    case MCI_PUT:
-    case MCI_REALIZE:
-    case MCI_RECORD:		
-    case MCI_RESUME:		
-    case MCI_SEEK:		
-    case MCI_SET:
-	/* case MCI_SETTIMECODE:*/
-	/* case MCI_SIGNAL:*/
-    case MCI_SPIN:
-    case MCI_STATUS:		
-    case MCI_STEP:
-    case MCI_STOP:		
-	/* case MCI_UNDO: */
-    case MCI_UNFREEZE:
-    case MCI_UPDATE:
-    case MCI_WHERE:
-	return 0;
-
-    case MCI_BREAK:
-    case MCI_ESCAPE:
-    case MCI_INFO:
-    case MCI_SYSINFO:
-	HeapFree(SystemHeap, 0, (LPVOID)lParam);
-	return 0;
-    case MCI_OPEN:
-    case MCI_OPEN_DRIVER:	
-	if (lParam) {
-            LPMCI_OPEN_PARMSA	mop32a = (MCI_OPEN_PARMSA*)lParam;
-	    LPMCI_OPEN_PARMS16	mop16  = *(LPMCI_OPEN_PARMS16*)((char*)mop32a - sizeof(LPMCI_OPEN_PARMS16*));
-	    
-	    mop16->wDeviceID = mop32a->wDeviceID;
-	    HeapFree(SystemHeap, 0, (LPVOID)(lParam - sizeof(LPMCI_OPEN_PARMS16)));
-	}
-	return 0;
-    case DRV_LOAD:
-    case DRV_ENABLE:
-    case DRV_OPEN:
-    case DRV_CLOSE:
-    case DRV_DISABLE:
-    case DRV_FREE:
-    case DRV_CONFIGURE:
-    case DRV_QUERYCONFIGURE:
-    case DRV_INSTALL:
-    case DRV_REMOVE:
-    case DRV_EXITSESSION:
-    case DRV_EXITAPPLICATION:
-    case DRV_POWER:
-	FIXME(mci, "This is a hack\n");
-	return 0;
-    default:
-	FIXME(mci, "Map/Unmap internal error on msg=%s\n", MCI_CommandToString(wMsg));
-    }
-    return -1;
-}
-
 /**************************************************************************
  * 				mciSendCommandA			[WINMM.49]
  */
 DWORD WINAPI mciSendCommandA(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2)
 {
+    DWORD	dwRet;
+
     TRACE(mci, "(%08x,%s,%08lx,%08lx)\n", wDevID, MCI_CommandToString(wMsg), dwParam1, dwParam2);
 
     switch (wMsg) {
     case MCI_OPEN:
-	return MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
+	dwRet = MCI_Open(dwParam1, (LPMCI_OPEN_PARMSA)dwParam2);
+	break;
     case MCI_CLOSE:
-	return MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+	dwRet = MCI_Close(wDevID, dwParam1, (LPMCI_GENERIC_PARMS)dwParam2);
+	break;
     case MCI_SYSINFO:
-	return MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
+	dwRet = MCI_SysInfo(wDevID, dwParam1, (LPMCI_SYSINFO_PARMSA)dwParam2);
+	break;
     default:
 	if (wDevID == MCI_ALL_DEVICE_ID) {
 	    FIXME(mci, "unhandled MCI_ALL_DEVICE_ID\n");
-	    return MCIERR_CANNOT_USE_ALL;
+	    dwRet = MCIERR_CANNOT_USE_ALL;
+	} else {
+	    dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2);
 	}
-	
-	return MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2);
+	break;
     }
+    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, TRUE);
+    TRACE(mci, "=> %08ld\n", dwRet);
+    return dwRet;
 }
 
 /**************************************************************************
@@ -2244,22 +1524,37 @@
 	    dwRet = MCIERR_INVALID_DEVICE_ID;
 	} else {
 	    int			res;
-	    
-	    switch (res = MCI_MapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, &dwParam2)) {
-	    case -1:
-		TRACE(mci, "Not handled yet (%s)\n", MCI_CommandToString(wMsg));
+		    
+	    switch (DRIVER_GetType(MCI_GetDrv(wDevID)->hDrv)) {
+	    case WINE_DI_TYPE_16:		
+		dwRet = SendDriverMessage16(MCI_GetDrv(wDevID)->hDrv, wMsg, dwParam1, dwParam2);
 		break;
-	    case -2:
-		TRACE(mci, "Problem mapping msg=%s from 16 to 32a\n", MCI_CommandToString(wMsg));
-	    case 0:
-	    case 1:
-		dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2);
-		if (res)
-		    MCI_UnMapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, dwParam2);
+	    case WINE_DI_TYPE_32:
+		switch (res = MCI_MapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, &dwParam2)) {
+		case -1:
+		    TRACE(mci, "Not handled yet (%s)\n", MCI_CommandToString(wMsg));
+		    dwRet = MCIERR_DRIVER_INTERNAL;
+		    break;
+		case -2:
+		    TRACE(mci, "Problem mapping msg=%s from 16 to 32a\n", MCI_CommandToString(wMsg));
+		    dwRet = MCIERR_OUT_OF_MEMORY;
+		    break;
+		case 0:
+		case 1:
+		    dwRet = MCI_SendCommand(wDevID, wMsg, dwParam1, dwParam2);
+		    if (res)
+			MCI_UnMapMsg16To32A(MCI_GetDrv(wDevID)->modp.wType, wMsg, dwParam2);
+		    break;
+		}
 		break;
+	    default:
+		WARN(mmsys, "Unknown driver type=%u\n", DRIVER_GetType(MCI_GetDrv(wDevID)->hDrv));
+		dwRet = MCIERR_DRIVER_INTERNAL;
 	    }
 	}
     }
+    dwRet = MCI_CleanUp(dwRet, wMsg, dwParam2, FALSE);
+    TRACE(mmsys, "=> %ld\n", dwRet);
     return dwRet;
 }
     
@@ -2564,8 +1859,8 @@
 /**************************************************************************
  * 				midiOutOpen    		[WINM.84]
  */
-UINT WINAPI midiOutOpen(HMIDIOUT * lphMidiOut, UINT uDeviceID,
-                            DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT WINAPI midiOutOpen(HMIDIOUT* lphMidiOut, UINT uDeviceID,
+			DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
     HMIDIOUT16	hmo16;
     UINT	ret;
@@ -2579,7 +1874,7 @@
 /**************************************************************************
  * 				midiOutOpen    		[MMSYSTEM.204]
  */
-UINT16 WINAPI midiOutOpen16(HMIDIOUT16 * lphMidiOut, UINT16 uDeviceID,
+UINT16 WINAPI midiOutOpen16(HMIDIOUT16* lphMidiOut, UINT16 uDeviceID,
                             DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
     HMIDI16			hMidiOut;
@@ -2643,7 +1938,7 @@
  * 				midiOutPrepareHeader	[WINMM.85]
  */
 UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut,
-                                     MIDIHDR16 * lpMidiOutHdr, UINT uSize)
+				 MIDIHDR16* lpMidiOutHdr, UINT uSize)
 {
     LPMIDIOPENDESC	lpDesc;
 
@@ -2660,7 +1955,7 @@
  * 				midiOutPrepareHeader	[MMSYSTEM.206]
  */
 UINT16 WINAPI midiOutPrepareHeader16(HMIDIOUT16 hMidiOut,
-                                     MIDIHDR16 * lpMidiOutHdr, UINT16 uSize)
+                                     MIDIHDR16* lpMidiOutHdr, UINT16 uSize)
 {
     LPMIDIOPENDESC	lpDesc;
 
@@ -2677,7 +1972,7 @@
  * 				midiOutUnprepareHeader	[WINMM.89]
  */
 UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut,
-                                       MIDIHDR16 * lpMidiOutHdr, UINT uSize)
+				   MIDIHDR16* lpMidiOutHdr, UINT uSize)
 {
     return midiOutUnprepareHeader16(hMidiOut, lpMidiOutHdr,uSize);
 }
@@ -2686,7 +1981,7 @@
  * 				midiOutUnprepareHeader	[MMSYSTEM.207]
  */
 UINT16 WINAPI midiOutUnprepareHeader16(HMIDIOUT16 hMidiOut,
-				       MIDIHDR16 * lpMidiOutHdr, UINT16 uSize)
+				       MIDIHDR16* lpMidiOutHdr, UINT16 uSize)
 {
     LPMIDIOPENDESC	lpDesc;
 
@@ -2724,7 +2019,7 @@
  * 				midiOutLongMsg		[WINMM.82]
  */
 UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut,
-                               MIDIHDR16 * lpMidiOutHdr, UINT uSize)
+			   MIDIHDR16* lpMidiOutHdr, UINT uSize)
 {
     return midiOutLongMsg16(hMidiOut, lpMidiOutHdr,uSize);
 }
@@ -2733,7 +2028,7 @@
  * 				midiOutLongMsg		[MMSYSTEM.209]
  */
 UINT16 WINAPI midiOutLongMsg16(HMIDIOUT16 hMidiOut,
-                               MIDIHDR16 * lpMidiOutHdr, UINT16 uSize)
+                               MIDIHDR16* lpMidiOutHdr, UINT16 uSize)
 {
     LPMIDIOPENDESC	lpDesc;
 
@@ -2770,7 +2065,7 @@
 /**************************************************************************
  * 				midiOutGetVolume	[WINM.81]
  */
-UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD * lpdwVolume)
+UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD* lpdwVolume)
 {
     return midiOutGetVolume16(uDeviceID, lpdwVolume);
 }
@@ -2778,7 +2073,7 @@
 /**************************************************************************
  * 				midiOutGetVolume	[MMSYSTEM.211]
  */
-UINT16 WINAPI midiOutGetVolume16(UINT16 uDeviceID, DWORD * lpdwVolume)
+UINT16 WINAPI midiOutGetVolume16(UINT16 uDeviceID, DWORD* lpdwVolume)
 {
     TRACE(mmsys, "(%04X, %p);\n", uDeviceID, lpdwVolume);
     return modMessage(uDeviceID, MODM_GETVOLUME, 0L, (DWORD)lpdwVolume, 0L);
@@ -2805,7 +2100,7 @@
  * 				midiOutCachePatches		[WINMM.73]
  */
 UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut, UINT uBank,
-                                    WORD * lpwPatchArray, UINT uFlags)
+				WORD* lpwPatchArray, UINT uFlags)
 {
     return midiOutCachePatches16(hMidiOut,uBank, lpwPatchArray,uFlags);
 }
@@ -2814,7 +2109,7 @@
  * 				midiOutCachePatches		[MMSYSTEM.213]
  */
 UINT16 WINAPI midiOutCachePatches16(HMIDIOUT16 hMidiOut, UINT16 uBank,
-                                    WORD * lpwPatchArray, UINT16 uFlags)
+                                    WORD* lpwPatchArray, UINT16 uFlags)
 {
     /* not really necessary to support this */
     FIXME(mmsys, "not supported yet\n");
@@ -2825,7 +2120,7 @@
  * 				midiOutCacheDrumPatches	[WINMM.72]
  */
 UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT hMidiOut, UINT uPatch,
-                                        WORD * lpwKeyArray, UINT uFlags)
+				    WORD* lpwKeyArray, UINT uFlags)
 {
     return midiOutCacheDrumPatches16(hMidiOut,uPatch, lpwKeyArray,uFlags);
 }
@@ -2834,7 +2129,7 @@
  * 				midiOutCacheDrumPatches	[MMSYSTEM.214]
  */
 UINT16 WINAPI midiOutCacheDrumPatches16(HMIDIOUT16 hMidiOut, UINT16 uPatch,
-                                        WORD * lpwKeyArray, UINT16 uFlags)
+                                        WORD* lpwKeyArray, UINT16 uFlags)
 {
     FIXME(mmsys, "not supported yet\n");
     return MMSYSERR_NOTSUPPORTED;
@@ -2843,7 +2138,7 @@
 /**************************************************************************
  * 				midiOutGetID		[WINMM.79]
  */
-UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT * lpuDeviceID)
+UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT* lpuDeviceID)
 {
     UINT16	xid;
     UINT	ret;
@@ -2856,7 +2151,7 @@
 /**************************************************************************
  * 				midiOutGetID		[MMSYSTEM.215]
  */
-UINT16 WINAPI midiOutGetID16(HMIDIOUT16 hMidiOut, UINT16 * lpuDeviceID)
+UINT16 WINAPI midiOutGetID16(HMIDIOUT16 hMidiOut, UINT16* lpuDeviceID)
 {
     TRACE(mmsys, "midiOutGetID\n");
     return 0;
@@ -2866,7 +2161,7 @@
  * 				midiOutMessage		[WINMM.83]
  */
 DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, 
-                              DWORD dwParam1, DWORD dwParam2)
+			    DWORD dwParam1, DWORD dwParam2)
 {
     LPMIDIOPENDESC	lpDesc;
     
@@ -2959,8 +2254,7 @@
 /**************************************************************************
  * 				midiInGetDevCaps	[WINMM.60]
  */
-UINT WINAPI midiInGetDevCapsW(UINT uDeviceID,
-                                  LPMIDIINCAPSW lpCaps, UINT uSize)
+UINT WINAPI midiInGetDevCapsW(UINT uDeviceID, LPMIDIINCAPSW lpCaps, UINT uSize)
 {
     MIDIINCAPS16	mic16;
     UINT		ret = midiInGetDevCaps16(uDeviceID, &mic16,uSize);
@@ -2976,8 +2270,7 @@
 /**************************************************************************
  * 				midiInGetDevCaps	[WINMM.59]
  */
-UINT WINAPI midiInGetDevCapsA(UINT uDeviceID,
-                                  LPMIDIINCAPSA lpCaps, UINT uSize)
+UINT WINAPI midiInGetDevCapsA(UINT uDeviceID, LPMIDIINCAPSA lpCaps, UINT uSize)
 {
     MIDIINCAPS16	mic16;
     UINT		ret = midiInGetDevCaps16(uDeviceID, &mic16,uSize);
@@ -3032,8 +2325,8 @@
 /**************************************************************************
  * 				midiInOpen		[WINMM.66]
  */
-UINT WINAPI midiInOpen(HMIDIIN * lphMidiIn, UINT uDeviceID,
-                           DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
+UINT WINAPI midiInOpen(HMIDIIN* lphMidiIn, UINT uDeviceID,
+		       DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
     HMIDIIN16	xhmid16;
     UINT 		ret = midiInOpen16(&xhmid16,uDeviceID, dwCallback, dwInstance,
@@ -3046,7 +2339,7 @@
 /**************************************************************************
  * 				midiInOpen		[MMSYSTEM.304]
  */
-UINT16 WINAPI midiInOpen16(HMIDIIN16 * lphMidiIn, UINT16 uDeviceID,
+UINT16 WINAPI midiInOpen16(HMIDIIN16* lphMidiIn, UINT16 uDeviceID,
                            DWORD dwCallback, DWORD dwInstance, DWORD dwFlags)
 {
     HMIDI16			hMidiIn;
@@ -3111,7 +2404,7 @@
  * 				midiInPrepareHeader	[WINMM.67]
  */
 UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn,
-                                    MIDIHDR16 * lpMidiInHdr, UINT uSize)
+				MIDIHDR16* lpMidiInHdr, UINT uSize)
 {
     LPMIDIOPENDESC	lpDesc;
     
@@ -3128,7 +2421,7 @@
  * 				midiInPrepareHeader	[MMSYSTEM.306]
  */
 UINT16 WINAPI midiInPrepareHeader16(HMIDIIN16 hMidiIn,
-                                    MIDIHDR16 * lpMidiInHdr, UINT16 uSize)
+                                    MIDIHDR16* lpMidiInHdr, UINT16 uSize)
 {
     LPMIDIOPENDESC	lpDesc;
     
@@ -3145,7 +2438,7 @@
  * 				midiInUnprepareHeader	[WINMM.71]
  */
 UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn,
-                                      MIDIHDR16 * lpMidiInHdr, UINT uSize)
+				  MIDIHDR16* lpMidiInHdr, UINT uSize)
 {
     return midiInUnprepareHeader16(hMidiIn, lpMidiInHdr,uSize);
 }
@@ -3154,7 +2447,7 @@
  * 				midiInUnprepareHeader	[MMSYSTEM.307]
  */
 UINT16 WINAPI midiInUnprepareHeader16(HMIDIIN16 hMidiIn,
-                                      MIDIHDR16 * lpMidiInHdr, UINT16 uSize)
+                                      MIDIHDR16* lpMidiInHdr, UINT16 uSize)
 {
     LPMIDIOPENDESC	lpDesc;
     TRACE(mmsys, "(%04X, %p, %d)\n", 
@@ -3169,7 +2462,7 @@
  * 				midiInAddBuffer		[WINMM.57]
  */
 UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn,
-                                MIDIHDR16 * lpMidiInHdr, UINT uSize)
+			    MIDIHDR16* lpMidiInHdr, UINT uSize)
 {
     return midiInAddBuffer16(hMidiIn, lpMidiInHdr,uSize);
 }
@@ -3178,7 +2471,7 @@
  * 				midiInAddBuffer		[MMSYSTEM.308]
  */
 UINT16 WINAPI midiInAddBuffer16(HMIDIIN16 hMidiIn,
-                                MIDIHDR16 * lpMidiInHdr, UINT16 uSize)
+                                MIDIHDR16* lpMidiInHdr, UINT16 uSize)
 {
     TRACE(mmsys, "midiInAddBuffer\n");
     return 0;
@@ -3290,7 +2583,7 @@
  * 				midiInMessage		[WINMM.65]
  */
 DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, 
-                             DWORD dwParam1, DWORD dwParam2)
+			   DWORD dwParam1, DWORD dwParam2)
 {
     LPMIDIOPENDESC	lpDesc;
     
@@ -3455,8 +2748,8 @@
  * 				midiStreamOpen			[WINMM.91]
  */
 MMRESULT WINAPI midiStreamOpen(HMIDISTRM* phms, LPUINT lpuDeviceID, 
-				   DWORD cMidi, DWORD dwCallback, 
-				   DWORD dwInstance, DWORD fdwOpen) 
+			       DWORD cMidi, DWORD dwCallback, 
+			       DWORD dwInstance, DWORD fdwOpen) 
 {
     WINE_MIDIStream*	ms;
 
@@ -3689,7 +2982,8 @@
 /**************************************************************************
  * 				waveOutGetNumDevs		[MMSYSTEM.401]
  */
-UINT WINAPI waveOutGetNumDevs() {
+UINT WINAPI waveOutGetNumDevs() 
+{
     return waveOutGetNumDevs16();
 }
 
@@ -3709,7 +3003,7 @@
 /**************************************************************************
  * 				waveOutGetDevCaps		[MMSYSTEM.402]
  */
-UINT16 WINAPI waveOutGetDevCaps16(UINT16 uDeviceID, WAVEOUTCAPS16 * lpCaps,
+UINT16 WINAPI waveOutGetDevCaps16(UINT16 uDeviceID, LPWAVEOUTCAPS16 lpCaps,
 				  UINT16 uSize)
 {
     if (uDeviceID > waveOutGetNumDevs16() - 1) return MMSYSERR_BADDEVICEID;
@@ -3722,7 +3016,7 @@
  * 				waveOutGetDevCapsA		[WINMM.162]
  */
 UINT WINAPI waveOutGetDevCapsA(UINT uDeviceID, LPWAVEOUTCAPSA lpCaps,
-				   UINT uSize)
+			       UINT uSize)
 {
     WAVEOUTCAPS16	woc16;
     UINT16 ret = waveOutGetDevCaps16(uDeviceID, &woc16, sizeof(woc16));
@@ -3857,9 +3151,9 @@
  *			waveOutOpen			[WINMM.173]
  * All the args/structs have the same layout as the win16 equivalents
  */
-UINT WINAPI waveOutOpen(HWAVEOUT * lphWaveOut, UINT uDeviceID,
-                            const LPWAVEFORMATEX lpFormat, DWORD dwCallback,
-                            DWORD dwInstance, DWORD dwFlags)
+UINT WINAPI waveOutOpen(HWAVEOUT* lphWaveOut, UINT uDeviceID,
+			const LPWAVEFORMATEX lpFormat, DWORD dwCallback,
+			DWORD dwInstance, DWORD dwFlags)
 {
     HWAVEOUT16	hwo16;
     UINT	ret = waveOutOpen16(&hwo16,uDeviceID, lpFormat, dwCallback, dwInstance,
@@ -3872,7 +3166,7 @@
 /**************************************************************************
  *			waveOutOpen			[MMSYSTEM.404]
  */
-UINT16 WINAPI waveOutOpen16(HWAVEOUT16 * lphWaveOut, UINT16 uDeviceID,
+UINT16 WINAPI waveOutOpen16(HWAVEOUT16* lphWaveOut, UINT16 uDeviceID,
                             const LPWAVEFORMATEX lpFormat, DWORD dwCallback,
                             DWORD dwInstance, DWORD dwFlags)
 {
@@ -3944,7 +3238,7 @@
  * 				waveOutPrepareHeader	[WINMM.175]
  */
 UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut,
-				     WAVEHDR* lpWaveOutHdr, UINT uSize)
+				 WAVEHDR* lpWaveOutHdr, UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -3982,7 +3276,7 @@
  * 				waveOutUnprepareHeader	[WINMM.181]
  */
 UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut,
-                                       WAVEHDR* lpWaveOutHdr, UINT uSize)
+				   WAVEHDR* lpWaveOutHdr, UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4020,7 +3314,7 @@
  * 				waveOutWrite		[MMSYSTEM.408]
  */
 UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR* lpWaveOutHdr,
-                             UINT uSize)
+			 UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
 
@@ -4122,7 +3416,7 @@
  * 				waveOutGetPosition	[WINMM.170]
  */
 UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, LPMMTIME lpTime,
-                                   UINT uSize)
+			       UINT uSize)
 {
     MMTIME16	mmt16;
     UINT ret;
@@ -4201,7 +3495,7 @@
 /**************************************************************************
  * 				waveOutGetID	 	[MMSYSTEM.420]
  */
-UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT * lpuDeviceID)
+UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT* lpuDeviceID)
 {
     LPWAVEOPENDESC	lpDesc;
 
@@ -4217,7 +3511,7 @@
 /**************************************************************************
  * 				waveOutGetID	 	[MMSYSTEM.420]
  */
-UINT16 WINAPI waveOutGetID16(HWAVEOUT16 hWaveOut, UINT16 * lpuDeviceID)
+UINT16 WINAPI waveOutGetID16(HWAVEOUT16 hWaveOut, UINT16* lpuDeviceID)
 {
     LPWAVEOPENDESC	lpDesc;
 
@@ -4420,9 +3714,9 @@
 /**************************************************************************
  * 				waveInOpen			[WINMM.154]
  */
-UINT WINAPI waveInOpen(HWAVEIN * lphWaveIn, UINT uDeviceID,
-                           const LPWAVEFORMAT lpFormat, DWORD dwCallback,
-                           DWORD dwInstance, DWORD dwFlags)
+UINT WINAPI waveInOpen(HWAVEIN* lphWaveIn, UINT uDeviceID,
+		       const LPWAVEFORMAT lpFormat, DWORD dwCallback,
+		       DWORD dwInstance, DWORD dwFlags)
 {
     HWAVEIN16	hwin16;
     UINT	ret = waveInOpen16(&hwin16,uDeviceID, lpFormat, dwCallback, dwInstance,
@@ -4434,7 +3728,7 @@
 /**************************************************************************
  * 				waveInOpen			[MMSYSTEM.504]
  */
-UINT16 WINAPI waveInOpen16(HWAVEIN16 * lphWaveIn, UINT16 uDeviceID,
+UINT16 WINAPI waveInOpen16(HWAVEIN16* lphWaveIn, UINT16 uDeviceID,
                            const LPWAVEFORMAT lpFormat, DWORD dwCallback,
                            DWORD dwInstance, DWORD dwFlags)
 {
@@ -4502,7 +3796,7 @@
  * 				waveInPrepareHeader		[WINMM.155]
  */
 UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn,
-				    WAVEHDR * lpWaveInHdr, UINT uSize)
+				WAVEHDR* lpWaveInHdr, UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4524,7 +3818,7 @@
  * 				waveInPrepareHeader		[MMSYSTEM.506]
  */
 UINT16 WINAPI waveInPrepareHeader16(HWAVEIN16 hWaveIn,
-				    WAVEHDR * lpWaveInHdr, UINT16 uSize)
+				    WAVEHDR* lpWaveInHdr, UINT16 uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     LPBYTE		saveddata = lpWaveInHdr->lpData;
@@ -4552,7 +3846,7 @@
  * 				waveInUnprepareHeader	[WINMM.159]
  */
 UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn,
-                                      WAVEHDR * lpWaveInHdr, UINT uSize)
+				  WAVEHDR* lpWaveInHdr, UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4572,7 +3866,7 @@
  * 				waveInUnprepareHeader	[MMSYSTEM.507]
  */
 UINT16 WINAPI waveInUnprepareHeader16(HWAVEIN16 hWaveIn,
-                                      WAVEHDR * lpWaveInHdr, UINT16 uSize)
+                                      WAVEHDR* lpWaveInHdr, UINT16 uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4592,7 +3886,7 @@
  * 				waveInAddBuffer		[WINMM.144]
  */
 UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn,
-                                WAVEHDR * lpWaveInHdr, UINT uSize)
+			    WAVEHDR* lpWaveInHdr, UINT uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4613,7 +3907,7 @@
  * 				waveInAddBuffer		[MMSYSTEM.508]
  */
 UINT16 WINAPI waveInAddBuffer16(HWAVEIN16 hWaveIn,
-                                WAVEHDR * lpWaveInHdr, UINT16 uSize)
+                                WAVEHDR* lpWaveInHdr, UINT16 uSize)
 {
     LPWAVEOPENDESC	lpDesc;
     UINT16		ret;
@@ -4700,7 +3994,7 @@
  * 				waveInGetPosition	[WINMM.152]
  */
 UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, LPMMTIME lpTime,
-                                  UINT uSize)
+			      UINT uSize)
 {
     MMTIME16	mmt16;
     UINT 	ret;
@@ -4730,7 +4024,7 @@
 /**************************************************************************
  * 				waveInGetID			[WINMM.150]
  */
-UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT * lpuDeviceID)
+UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT* lpuDeviceID)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4745,7 +4039,7 @@
 /**************************************************************************
  * 				waveInGetID			[MMSYSTEM.513]
  */
-UINT16 WINAPI waveInGetID16(HWAVEIN16 hWaveIn, UINT16 * lpuDeviceID)
+UINT16 WINAPI waveInGetID16(HWAVEIN16 hWaveIn, UINT16* lpuDeviceID)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4761,7 +4055,7 @@
  * 				waveInMessage 		[WINMM.153]
  */
 DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage,
-                             DWORD dwParam1, DWORD dwParam2)
+			   DWORD dwParam1, DWORD dwParam2)
 {
     LPWAVEOPENDESC	lpDesc;
     
@@ -4814,7 +4108,7 @@
 	break;
     case WIDM_GETNUMDEVS:
     case WIDM_CLOSE:
-    case WIDM_STOP :
+    case WIDM_STOP:
     case WIDM_RESET:
     case WIDM_START:
     case WIDM_PAUSE:
@@ -4851,50 +4145,51 @@
 /**************************************************************************
  * 				DrvClose       		[MMSYSTEM.1101]
  */
-LRESULT WINAPI DrvClose(HDRVR16 hDrvr, LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DrvClose(HDRVR16 hDrv, LPARAM lParam1, LPARAM lParam2)
 {
-    TRACE(mmsys, "(%04X, %08lX, %08lX);\n", hDrvr, lParam1, lParam2);
+    TRACE(mmsys, "(%04X, %08lX, %08lX);\n", hDrv, lParam1, lParam2);
 
-    return CloseDriver16(hDrvr, lParam1, lParam2);
+    return CloseDriver16(hDrv, lParam1, lParam2);
 }
 
 /**************************************************************************
  * 				DrvSendMessage		[MMSYSTEM.1102]
  */
-LRESULT WINAPI DrvSendMessage(HDRVR16 hDriver, WORD msg, LPARAM lParam1,
+LRESULT WINAPI DrvSendMessage(HDRVR16 hDrv, WORD msg, LPARAM lParam1,
                               LPARAM lParam2)
 {
     /* DWORD 	dwDriverID = 0; */
 
-    FIXME(mmsys, "(%04X, %04X, %08lX, %08lX);\n", hDriver, msg, lParam1, lParam2);
+    FIXME(mmsys, "(%04X, %04X, %08lX, %08lX);\n", hDrv, msg, lParam1, lParam2);
     return MMSYSERR_NOTENABLED;
     /* FIXME: wrong ... */
     /* should known the mapping between hDrv and wDevIDs */
-    /* MCICDAUDIO_DriverProc16(dwDriverID, hDriver, msg, lParam1, lParam2); */
+    /* MCICDAUDIO_DriverProc16(dwDriverID, hDrv, msg, lParam1, lParam2); */
 }
 
 /**************************************************************************
  * 				DrvGetModuleHandle	[MMSYSTEM.1103]
  */
-HANDLE16 WINAPI DrvGetModuleHandle16(HDRVR16 hDrvr)
+HANDLE16 WINAPI DrvGetModuleHandle16(HDRVR16 hDrv)
 {
-    return GetDriverModuleHandle16(hDrvr);
+    return GetDriverModuleHandle16(hDrv);
 }
 
 /**************************************************************************
  * 				DrvDefDriverProc	[MMSYSTEM.1104]
  */
-LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDriv, WORD wMsg, 
+LRESULT WINAPI DrvDefDriverProc(DWORD dwDriverID, HDRVR16 hDrv, WORD wMsg, 
                                 DWORD dwParam1, DWORD dwParam2)
 {
-    return DefDriverProc16(dwDriverID, hDriv, wMsg, dwParam1, dwParam2);
+    /* FIXME : any mapping from 32 to 16 bit structure ? */
+    return DefDriverProc16(dwDriverID, hDrv, wMsg, dwParam1, dwParam2);
 }
 
 /**************************************************************************
- * 				DefDriverProc32  [WINMM.5]
+ * 				DefDriverProc			  [WINMM.5]
  */
-LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hdrvr,
-                               UINT Msg, LPARAM lParam1, LPARAM lParam2)
+LRESULT WINAPI DefDriverProc(DWORD dwDriverIdentifier, HDRVR hDrv,
+			     UINT Msg, LPARAM lParam1, LPARAM lParam2)
 {
     switch (Msg) {
     case DRV_LOAD:
diff --git a/relay32/winmm.spec b/relay32/winmm.spec
index 7fecf2e..0e5bd13 100644
--- a/relay32/winmm.spec
+++ b/relay32/winmm.spec
@@ -135,8 +135,8 @@
 132 stdcall mmioStringToFOURCCW(wstr long) mmioStringToFOURCCW
 133 stdcall mmioWrite(long ptr long) mmioWrite
 134 stdcall mmsystemGetVersion() mmsystemGetVersion
-135 stdcall sndPlaySoundA(ptr long) sndPlaySound
-136 stdcall sndPlaySoundW(ptr long) sndPlaySound32W
+135 stdcall sndPlaySoundA(ptr long) sndPlaySoundA
+136 stdcall sndPlaySoundW(ptr long) sndPlaySoundW
 137 stdcall timeBeginPeriod(long) timeBeginPeriod
 138 stdcall timeEndPeriod(long) timeEndPeriod
 139 stdcall timeGetDevCaps(ptr long) timeGetDevCaps