diff fuhtark_test/include/winapi/mmsystem.h @ 1500:91c8c3b7cbf0

add: futhark tests for generating vulkan api
author sam <sam@basx.dev>
date Wed, 26 Nov 2025 21:36:48 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/fuhtark_test/include/winapi/mmsystem.h	Wed Nov 26 21:36:48 2025 +0700
@@ -0,0 +1,2855 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the w64 mingw-runtime package.
+ * No warranty is given; refer to the file DISCLAIMER within this package.
+ */
+#ifndef _INC_MMSYSTEM
+#define _INC_MMSYSTEM
+
+#include <pshpack1.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _WINMM_
+#define WINMMAPI DECLSPEC_IMPORT
+#else
+#define WINMMAPI
+#endif
+#define _loadds
+#define _huge
+
+#define MAXPNAMELEN 32
+#define MAXERRORLENGTH 256
+#define MAX_JOYSTICKOEMVXDNAME 260
+
+  typedef UINT MMVERSION;
+  typedef UINT MMRESULT;
+
+#define _MMRESULT_
+
+#ifndef DEFINED_LPUINT
+#define DEFINED_LPUINT
+  typedef UINT *LPUINT;
+#endif
+
+  typedef struct mmtime_tag {
+    UINT wType;
+    union {
+      DWORD ms;
+      DWORD sample;
+      DWORD cb;
+      DWORD ticks;
+      struct {
+	BYTE hour;
+	BYTE min;
+	BYTE sec;
+	BYTE frame;
+	BYTE fps;
+	BYTE dummy;
+	BYTE pad[2];
+      } smpte;
+      struct {
+	DWORD songptrpos;
+      } midi;
+    } u;
+  } MMTIME,*PMMTIME,NEAR *NPMMTIME,*LPMMTIME;
+
+#define TIME_MS 0x0001
+#define TIME_SAMPLES 0x0002
+#define TIME_BYTES 0x0004
+#define TIME_SMPTE 0x0008
+#define TIME_MIDI 0x0010
+#define TIME_TICKS 0x0020
+
+#define MAKEFOURCC(ch0,ch1,ch2,ch3)				\
+  ((DWORD)(BYTE)(ch0) | ((DWORD)(BYTE)(ch1) << 8) | 		\
+   ((DWORD)(BYTE)(ch2) << 16) | ((DWORD)(BYTE)(ch3) << 24))
+
+#define MM_JOY1MOVE 0x3A0
+#define MM_JOY2MOVE 0x3A1
+#define MM_JOY1ZMOVE 0x3A2
+#define MM_JOY2ZMOVE 0x3A3
+#define MM_JOY1BUTTONDOWN 0x3B5
+#define MM_JOY2BUTTONDOWN 0x3B6
+#define MM_JOY1BUTTONUP 0x3B7
+#define MM_JOY2BUTTONUP 0x3B8
+
+#define MM_MCINOTIFY 0x3B9
+
+#define MM_WOM_OPEN 0x3BB
+#define MM_WOM_CLOSE 0x3BC
+#define MM_WOM_DONE 0x3BD
+
+#define MM_WIM_OPEN 0x3BE
+#define MM_WIM_CLOSE 0x3BF
+#define MM_WIM_DATA 0x3C0
+
+#define MM_MIM_OPEN 0x3C1
+#define MM_MIM_CLOSE 0x3C2
+#define MM_MIM_DATA 0x3C3
+#define MM_MIM_LONGDATA 0x3C4
+#define MM_MIM_ERROR 0x3C5
+#define MM_MIM_LONGERROR 0x3C6
+
+#define MM_MOM_OPEN 0x3C7
+#define MM_MOM_CLOSE 0x3C8
+#define MM_MOM_DONE 0x3C9
+
+#ifndef MM_DRVM_OPEN
+#define MM_DRVM_OPEN 0x3D0
+#define MM_DRVM_CLOSE 0x3D1
+#define MM_DRVM_DATA 0x3D2
+#define MM_DRVM_ERROR 0x3D3
+#endif
+
+#define MM_STREAM_OPEN 0x3D4
+#define MM_STREAM_CLOSE 0x3D5
+#define MM_STREAM_DONE 0x3D6
+#define MM_STREAM_ERROR 0x3D7
+
+#define MM_MOM_POSITIONCB 0x3CA
+
+#ifndef MM_MCISIGNAL
+#define MM_MCISIGNAL 0x3CB
+#endif
+
+#define MM_MIM_MOREDATA 0x3CC
+
+#define MM_MIXM_LINE_CHANGE 0x3D0
+#define MM_MIXM_CONTROL_CHANGE 0x3D1
+
+#define MMSYSERR_BASE 0
+#define WAVERR_BASE 32
+#define MIDIERR_BASE 64
+#define TIMERR_BASE 96
+#define JOYERR_BASE 160
+#define MCIERR_BASE 256
+#define MIXERR_BASE 1024
+
+#define MCI_STRING_OFFSET 512
+#define MCI_VD_OFFSET 1024
+#define MCI_CD_OFFSET 1088
+#define MCI_WAVE_OFFSET 1152
+#define MCI_SEQ_OFFSET 1216
+
+#define MMSYSERR_NOERROR 0
+#define MMSYSERR_ERROR (MMSYSERR_BASE + 1)
+#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE + 2)
+#define MMSYSERR_NOTENABLED (MMSYSERR_BASE + 3)
+#define MMSYSERR_ALLOCATED (MMSYSERR_BASE + 4)
+#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE + 5)
+#define MMSYSERR_NODRIVER (MMSYSERR_BASE + 6)
+#define MMSYSERR_NOMEM (MMSYSERR_BASE + 7)
+#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8)
+#define MMSYSERR_BADERRNUM (MMSYSERR_BASE + 9)
+#define MMSYSERR_INVALFLAG (MMSYSERR_BASE + 10)
+#define MMSYSERR_INVALPARAM (MMSYSERR_BASE + 11)
+#define MMSYSERR_HANDLEBUSY (MMSYSERR_BASE + 12)
+
+#define MMSYSERR_INVALIDALIAS (MMSYSERR_BASE + 13)
+#define MMSYSERR_BADDB (MMSYSERR_BASE + 14)
+#define MMSYSERR_KEYNOTFOUND (MMSYSERR_BASE + 15)
+#define MMSYSERR_READERROR (MMSYSERR_BASE + 16)
+#define MMSYSERR_WRITEERROR (MMSYSERR_BASE + 17)
+#define MMSYSERR_DELETEERROR (MMSYSERR_BASE + 18)
+#define MMSYSERR_VALNOTFOUND (MMSYSERR_BASE + 19)
+#define MMSYSERR_NODRIVERCB (MMSYSERR_BASE + 20)
+#define MMSYSERR_MOREDATA (MMSYSERR_BASE + 21)
+#define MMSYSERR_LASTERROR (MMSYSERR_BASE + 21)
+
+  DECLARE_HANDLE(HDRVR);
+
+#ifndef MMNODRV
+
+  typedef struct DRVCONFIGINFOEX {
+    DWORD dwDCISize;
+    LPCWSTR lpszDCISectionName;
+    LPCWSTR lpszDCIAliasName;
+    DWORD dnDevNode;
+  } DRVCONFIGINFOEX,*PDRVCONFIGINFOEX,NEAR *NPDRVCONFIGINFOEX,*LPDRVCONFIGINFOEX;
+
+#ifndef DRV_LOAD
+#define DRV_LOAD 0x0001
+#define DRV_ENABLE 0x0002
+#define DRV_OPEN 0x0003
+#define DRV_CLOSE 0x0004
+#define DRV_DISABLE 0x0005
+#define DRV_FREE 0x0006
+#define DRV_CONFIGURE 0x0007
+#define DRV_QUERYCONFIGURE 0x0008
+#define DRV_INSTALL 0x0009
+#define DRV_REMOVE 0x000A
+#define DRV_EXITSESSION 0x000B
+#define DRV_POWER 0x000F
+#define DRV_RESERVED 0x0800
+#define DRV_USER 0x4000
+
+  typedef struct tagDRVCONFIGINFO {
+    DWORD dwDCISize;
+    LPCWSTR lpszDCISectionName;
+    LPCWSTR lpszDCIAliasName;
+  } DRVCONFIGINFO,*PDRVCONFIGINFO,NEAR *NPDRVCONFIGINFO,*LPDRVCONFIGINFO;
+
+#define DRVCNF_CANCEL 0x0000
+#define DRVCNF_OK 0x0001
+#define DRVCNF_RESTART 0x0002
+
+  typedef LRESULT (CALLBACK *DRIVERPROC)(DWORD_PTR,HDRVR,UINT,LPARAM,LPARAM);
+
+  WINMMAPI LRESULT WINAPI CloseDriver(HDRVR hDriver,LPARAM lParam1,LPARAM lParam2);
+  WINMMAPI HDRVR WINAPI OpenDriver(LPCWSTR szDriverName,LPCWSTR szSectionName,LPARAM lParam2);
+  WINMMAPI LRESULT WINAPI SendDriverMessage(HDRVR hDriver,UINT message,LPARAM lParam1,LPARAM lParam2);
+  WINMMAPI HMODULE WINAPI DrvGetModuleHandle(HDRVR hDriver);
+  WINMMAPI HMODULE WINAPI GetDriverModuleHandle(HDRVR hDriver);
+  WINMMAPI LRESULT WINAPI DefDriverProc(DWORD_PTR dwDriverIdentifier,HDRVR hdrvr,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
+#endif
+
+#define DRV_CANCEL DRVCNF_CANCEL
+#define DRV_OK DRVCNF_OK
+#define DRV_RESTART DRVCNF_RESTART
+#define DRV_MCI_FIRST DRV_RESERVED
+#define DRV_MCI_LAST (DRV_RESERVED + 0xFFF)
+#endif
+
+#define CALLBACK_TYPEMASK 0x00070000l
+#define CALLBACK_NULL 0x00000000l
+#define CALLBACK_WINDOW 0x00010000l
+#define CALLBACK_TASK 0x00020000l
+#define CALLBACK_FUNCTION 0x00030000l
+#define CALLBACK_THREAD (CALLBACK_TASK)
+#define CALLBACK_EVENT 0x00050000l
+  typedef void (CALLBACK DRVCALLBACK)(HDRVR hdrvr,UINT uMsg,DWORD_PTR dwUser,DWORD_PTR dw1,DWORD_PTR dw2);
+
+  typedef DRVCALLBACK *LPDRVCALLBACK;
+  typedef DRVCALLBACK *PDRVCALLBACK;
+
+#ifndef MMNOMMSYSTEM
+#define OutputDebugStr OutputDebugString
+#endif
+
+#ifndef MMNOSOUND
+
+  WINMMAPI WINBOOL WINAPI sndPlaySoundA(LPCSTR pszSound,UINT fuSound);
+  WINMMAPI WINBOOL WINAPI sndPlaySoundW(LPCWSTR pszSound,UINT fuSound);
+#ifdef UNICODE
+#define sndPlaySound sndPlaySoundW
+#else
+#define sndPlaySound sndPlaySoundA
+#endif
+
+#define SND_SYNC 0x0000
+#define SND_ASYNC 0x0001
+#define SND_NODEFAULT 0x0002
+#define SND_MEMORY 0x0004
+#define SND_LOOP 0x0008
+#define SND_NOSTOP 0x0010
+#define SND_NOWAIT 0x00002000L
+#define SND_ALIAS 0x00010000L
+#define SND_ALIAS_ID 0x00110000L
+#define SND_FILENAME 0x00020000L
+#define SND_RESOURCE 0x00040004L
+#define SND_PURGE 0x0040
+#define SND_APPLICATION 0x0080
+
+#define SND_ALIAS_START 0
+
+#define sndAlias(c0,c1) (SND_ALIAS_START+((DWORD)(BYTE)(c0)|((DWORD)(BYTE)(c1)<<8)))
+
+#define SND_ALIAS_SYSTEMASTERISK sndAlias('S','*')
+#define SND_ALIAS_SYSTEMQUESTION sndAlias('S','?')
+#define SND_ALIAS_SYSTEMHAND sndAlias('S','H')
+#define SND_ALIAS_SYSTEMEXIT sndAlias('S','E')
+#define SND_ALIAS_SYSTEMSTART sndAlias('S','S')
+#define SND_ALIAS_SYSTEMWELCOME sndAlias('S','W')
+#define SND_ALIAS_SYSTEMEXCLAMATION sndAlias('S','!')
+#define SND_ALIAS_SYSTEMDEFAULT sndAlias('S','D')
+
+  WINMMAPI WINBOOL WINAPI PlaySoundA(LPCSTR pszSound,HMODULE hmod,DWORD fdwSound);
+  WINMMAPI WINBOOL WINAPI PlaySoundW(LPCWSTR pszSound,HMODULE hmod,DWORD fdwSound);
+#ifdef UNICODE
+#define PlaySound PlaySoundW
+#else
+#define PlaySound PlaySoundA
+#endif
+#endif
+
+#ifndef MMNOWAVE
+
+#define WAVERR_BADFORMAT (WAVERR_BASE + 0)
+#define WAVERR_STILLPLAYING (WAVERR_BASE + 1)
+#define WAVERR_UNPREPARED (WAVERR_BASE + 2)
+#define WAVERR_SYNC (WAVERR_BASE + 3)
+#define WAVERR_LASTERROR (WAVERR_BASE + 3)
+
+  DECLARE_HANDLE(HWAVE);
+  DECLARE_HANDLE(HWAVEIN);
+  DECLARE_HANDLE(HWAVEOUT);
+  typedef HWAVEIN *LPHWAVEIN;
+  typedef HWAVEOUT *LPHWAVEOUT;
+  typedef DRVCALLBACK WAVECALLBACK;
+  typedef WAVECALLBACK *LPWAVECALLBACK;
+
+#define WOM_OPEN MM_WOM_OPEN
+#define WOM_CLOSE MM_WOM_CLOSE
+#define WOM_DONE MM_WOM_DONE
+#define WIM_OPEN MM_WIM_OPEN
+#define WIM_CLOSE MM_WIM_CLOSE
+#define WIM_DATA MM_WIM_DATA
+
+#define WAVE_MAPPER ((UINT)-1)
+
+#define WAVE_FORMAT_QUERY 0x0001
+#define WAVE_ALLOWSYNC 0x0002
+#define WAVE_MAPPED 0x0004
+#define WAVE_FORMAT_DIRECT 0x0008
+#define WAVE_FORMAT_DIRECT_QUERY (WAVE_FORMAT_QUERY | WAVE_FORMAT_DIRECT)
+
+  typedef struct wavehdr_tag {
+    LPSTR lpData;
+    DWORD dwBufferLength;
+    DWORD dwBytesRecorded;
+    DWORD_PTR dwUser;
+    DWORD dwFlags;
+    DWORD dwLoops;
+    struct wavehdr_tag *lpNext;
+    DWORD_PTR reserved;
+  } WAVEHDR,*PWAVEHDR,NEAR *NPWAVEHDR,*LPWAVEHDR;
+
+#define WHDR_DONE 0x00000001
+#define WHDR_PREPARED 0x00000002
+#define WHDR_BEGINLOOP 0x00000004
+#define WHDR_ENDLOOP 0x00000008
+#define WHDR_INQUEUE 0x00000010
+
+  typedef struct tagWAVEOUTCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    DWORD dwSupport;
+  } WAVEOUTCAPSA,*PWAVEOUTCAPSA,*NPWAVEOUTCAPSA,*LPWAVEOUTCAPSA;
+
+  typedef struct tagWAVEOUTCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    DWORD dwSupport;
+  } WAVEOUTCAPSW,*PWAVEOUTCAPSW,*NPWAVEOUTCAPSW,*LPWAVEOUTCAPSW;
+#ifdef UNICODE
+  typedef WAVEOUTCAPSW WAVEOUTCAPS;
+  typedef PWAVEOUTCAPSW PWAVEOUTCAPS;
+  typedef NPWAVEOUTCAPSW NPWAVEOUTCAPS;
+  typedef LPWAVEOUTCAPSW LPWAVEOUTCAPS;
+#else
+  typedef WAVEOUTCAPSA WAVEOUTCAPS;
+  typedef PWAVEOUTCAPSA PWAVEOUTCAPS;
+  typedef NPWAVEOUTCAPSA NPWAVEOUTCAPS;
+  typedef LPWAVEOUTCAPSA LPWAVEOUTCAPS;
+#endif
+  typedef struct tagWAVEOUTCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } WAVEOUTCAPS2A,*PWAVEOUTCAPS2A,*NPWAVEOUTCAPS2A,*LPWAVEOUTCAPS2A;
+
+  typedef struct tagWAVEOUTCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } WAVEOUTCAPS2W,*PWAVEOUTCAPS2W,*NPWAVEOUTCAPS2W,*LPWAVEOUTCAPS2W;
+#ifdef UNICODE
+  typedef WAVEOUTCAPS2W WAVEOUTCAPS2;
+  typedef PWAVEOUTCAPS2W PWAVEOUTCAPS2;
+  typedef NPWAVEOUTCAPS2W NPWAVEOUTCAPS2;
+  typedef LPWAVEOUTCAPS2W LPWAVEOUTCAPS2;
+#else
+  typedef WAVEOUTCAPS2A WAVEOUTCAPS2;
+  typedef PWAVEOUTCAPS2A PWAVEOUTCAPS2;
+  typedef NPWAVEOUTCAPS2A NPWAVEOUTCAPS2;
+  typedef LPWAVEOUTCAPS2A LPWAVEOUTCAPS2;
+#endif
+
+#define WAVECAPS_PITCH 0x0001
+#define WAVECAPS_PLAYBACKRATE 0x0002
+#define WAVECAPS_VOLUME 0x0004
+#define WAVECAPS_LRVOLUME 0x0008
+#define WAVECAPS_SYNC 0x0010
+#define WAVECAPS_SAMPLEACCURATE 0x0020
+
+  typedef struct tagWAVEINCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+  } WAVEINCAPSA,*PWAVEINCAPSA,*NPWAVEINCAPSA,*LPWAVEINCAPSA;
+
+  typedef struct tagWAVEINCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+  } WAVEINCAPSW,*PWAVEINCAPSW,*NPWAVEINCAPSW,*LPWAVEINCAPSW;
+#ifdef UNICODE
+  typedef WAVEINCAPSW WAVEINCAPS;
+  typedef PWAVEINCAPSW PWAVEINCAPS;
+  typedef NPWAVEINCAPSW NPWAVEINCAPS;
+  typedef LPWAVEINCAPSW LPWAVEINCAPS;
+#else
+  typedef WAVEINCAPSA WAVEINCAPS;
+  typedef PWAVEINCAPSA PWAVEINCAPS;
+  typedef NPWAVEINCAPSA NPWAVEINCAPS;
+  typedef LPWAVEINCAPSA LPWAVEINCAPS;
+#endif
+  typedef struct tagWAVEINCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } WAVEINCAPS2A,*PWAVEINCAPS2A,*NPWAVEINCAPS2A,*LPWAVEINCAPS2A;
+
+  typedef struct tagWAVEINCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwFormats;
+    WORD wChannels;
+    WORD wReserved1;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } WAVEINCAPS2W,*PWAVEINCAPS2W,*NPWAVEINCAPS2W,*LPWAVEINCAPS2W;
+#ifdef UNICODE
+  typedef WAVEINCAPS2W WAVEINCAPS2;
+  typedef PWAVEINCAPS2W PWAVEINCAPS2;
+  typedef NPWAVEINCAPS2W NPWAVEINCAPS2;
+  typedef LPWAVEINCAPS2W LPWAVEINCAPS2;
+#else
+  typedef WAVEINCAPS2A WAVEINCAPS2;
+  typedef PWAVEINCAPS2A PWAVEINCAPS2;
+  typedef NPWAVEINCAPS2A NPWAVEINCAPS2;
+  typedef LPWAVEINCAPS2A LPWAVEINCAPS2;
+#endif
+
+#define WAVE_INVALIDFORMAT 0x00000000
+#define WAVE_FORMAT_1M08 0x00000001
+#define WAVE_FORMAT_1S08 0x00000002
+#define WAVE_FORMAT_1M16 0x00000004
+#define WAVE_FORMAT_1S16 0x00000008
+#define WAVE_FORMAT_2M08 0x00000010
+#define WAVE_FORMAT_2S08 0x00000020
+#define WAVE_FORMAT_2M16 0x00000040
+#define WAVE_FORMAT_2S16 0x00000080
+#define WAVE_FORMAT_4M08 0x00000100
+#define WAVE_FORMAT_4S08 0x00000200
+#define WAVE_FORMAT_4M16 0x00000400
+#define WAVE_FORMAT_4S16 0x00000800
+
+#define WAVE_FORMAT_44M08 0x00000100
+#define WAVE_FORMAT_44S08 0x00000200
+#define WAVE_FORMAT_44M16 0x00000400
+#define WAVE_FORMAT_44S16 0x00000800
+#define WAVE_FORMAT_48M08 0x00001000
+#define WAVE_FORMAT_48S08 0x00002000
+#define WAVE_FORMAT_48M16 0x00004000
+#define WAVE_FORMAT_48S16 0x00008000
+#define WAVE_FORMAT_96M08 0x00010000
+#define WAVE_FORMAT_96S08 0x00020000
+#define WAVE_FORMAT_96M16 0x00040000
+#define WAVE_FORMAT_96S16 0x00080000
+
+#ifndef WAVE_FORMAT_PCM
+  typedef struct waveformat_tag {
+    WORD wFormatTag;
+    WORD nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+  } WAVEFORMAT,*PWAVEFORMAT,NEAR *NPWAVEFORMAT,*LPWAVEFORMAT;
+
+#define WAVE_FORMAT_PCM 1
+
+  typedef struct pcmwaveformat_tag {
+    WAVEFORMAT wf;
+    WORD wBitsPerSample;
+  } PCMWAVEFORMAT,*PPCMWAVEFORMAT,NEAR *NPPCMWAVEFORMAT,*LPPCMWAVEFORMAT;
+#endif
+
+#ifndef _WAVEFORMATEX_
+#define _WAVEFORMATEX_
+
+  typedef struct tWAVEFORMATEX {
+    WORD wFormatTag;
+    WORD nChannels;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+    WORD wBitsPerSample;
+    WORD cbSize;
+  } WAVEFORMATEX,*PWAVEFORMATEX,NEAR *NPWAVEFORMATEX,*LPWAVEFORMATEX;
+#endif
+  typedef const WAVEFORMATEX *LPCWAVEFORMATEX;
+
+  WINMMAPI UINT WINAPI waveOutGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI waveOutGetDevCapsA(UINT_PTR uDeviceID,LPWAVEOUTCAPSA pwoc,UINT cbwoc);
+  WINMMAPI MMRESULT WINAPI waveOutGetDevCapsW(UINT_PTR uDeviceID,LPWAVEOUTCAPSW pwoc,UINT cbwoc);
+#ifdef UNICODE
+#define waveOutGetDevCaps waveOutGetDevCapsW
+#else
+#define waveOutGetDevCaps waveOutGetDevCapsA
+#endif
+
+  WINMMAPI MMRESULT WINAPI waveOutGetVolume(HWAVEOUT hwo,LPDWORD pdwVolume);
+  WINMMAPI MMRESULT WINAPI waveOutSetVolume(HWAVEOUT hwo,DWORD dwVolume);
+  WINMMAPI MMRESULT WINAPI waveOutGetErrorTextA(MMRESULT mmrError,LPSTR pszText,UINT cchText);
+  WINMMAPI MMRESULT WINAPI waveOutGetErrorTextW(MMRESULT mmrError,LPWSTR pszText,UINT cchText);
+#ifdef UNICODE
+#define waveOutGetErrorText waveOutGetErrorTextW
+#else
+#define waveOutGetErrorText waveOutGetErrorTextA
+#endif
+
+  WINMMAPI MMRESULT WINAPI waveOutOpen(LPHWAVEOUT phwo,UINT uDeviceID,LPCWAVEFORMATEX pwfx,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI waveOutClose(HWAVEOUT hwo);
+  WINMMAPI MMRESULT WINAPI waveOutPrepareHeader(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveOutUnprepareHeader(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveOutWrite(HWAVEOUT hwo,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveOutPause(HWAVEOUT hwo);
+  WINMMAPI MMRESULT WINAPI waveOutRestart(HWAVEOUT hwo);
+  WINMMAPI MMRESULT WINAPI waveOutReset(HWAVEOUT hwo);
+  WINMMAPI MMRESULT WINAPI waveOutBreakLoop(HWAVEOUT hwo);
+  WINMMAPI MMRESULT WINAPI waveOutGetPosition(HWAVEOUT hwo,LPMMTIME pmmt,UINT cbmmt);
+  WINMMAPI MMRESULT WINAPI waveOutGetPitch(HWAVEOUT hwo,LPDWORD pdwPitch);
+  WINMMAPI MMRESULT WINAPI waveOutSetPitch(HWAVEOUT hwo,DWORD dwPitch);
+  WINMMAPI MMRESULT WINAPI waveOutGetPlaybackRate(HWAVEOUT hwo,LPDWORD pdwRate);
+  WINMMAPI MMRESULT WINAPI waveOutSetPlaybackRate(HWAVEOUT hwo,DWORD dwRate);
+  WINMMAPI MMRESULT WINAPI waveOutGetID(HWAVEOUT hwo,LPUINT puDeviceID);
+  WINMMAPI MMRESULT WINAPI waveOutMessage(HWAVEOUT hwo,UINT uMsg,DWORD_PTR dw1,DWORD_PTR dw2);
+  WINMMAPI UINT WINAPI waveInGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI waveInGetDevCapsA(UINT_PTR uDeviceID,LPWAVEINCAPSA pwic,UINT cbwic);
+  WINMMAPI MMRESULT WINAPI waveInGetDevCapsW(UINT_PTR uDeviceID,LPWAVEINCAPSW pwic,UINT cbwic);
+#ifdef UNICODE
+#define waveInGetDevCaps waveInGetDevCapsW
+#else
+#define waveInGetDevCaps waveInGetDevCapsA
+#endif
+
+  WINMMAPI MMRESULT WINAPI waveInGetErrorTextA(MMRESULT mmrError,LPSTR pszText,UINT cchText);
+  WINMMAPI MMRESULT WINAPI waveInGetErrorTextW(MMRESULT mmrError,LPWSTR pszText,UINT cchText);
+#ifdef UNICODE
+#define waveInGetErrorText waveInGetErrorTextW
+#else
+#define waveInGetErrorText waveInGetErrorTextA
+#endif
+
+  WINMMAPI MMRESULT WINAPI waveInOpen(LPHWAVEIN phwi,UINT uDeviceID,LPCWAVEFORMATEX pwfx,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI waveInClose(HWAVEIN hwi);
+  WINMMAPI MMRESULT WINAPI waveInPrepareHeader(HWAVEIN hwi,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveInUnprepareHeader(HWAVEIN hwi,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveInAddBuffer(HWAVEIN hwi,LPWAVEHDR pwh,UINT cbwh);
+  WINMMAPI MMRESULT WINAPI waveInStart(HWAVEIN hwi);
+  WINMMAPI MMRESULT WINAPI waveInStop(HWAVEIN hwi);
+  WINMMAPI MMRESULT WINAPI waveInReset(HWAVEIN hwi);
+  WINMMAPI MMRESULT WINAPI waveInGetPosition(HWAVEIN hwi,LPMMTIME pmmt,UINT cbmmt);
+  WINMMAPI MMRESULT WINAPI waveInGetID(HWAVEIN hwi,LPUINT puDeviceID);
+  WINMMAPI MMRESULT WINAPI waveInMessage(HWAVEIN hwi,UINT uMsg,DWORD_PTR dw1,DWORD_PTR dw2);
+#endif
+
+#ifndef MMNOMIDI
+
+#define MIDIERR_UNPREPARED (MIDIERR_BASE + 0)
+#define MIDIERR_STILLPLAYING (MIDIERR_BASE + 1)
+#define MIDIERR_NOMAP (MIDIERR_BASE + 2)
+#define MIDIERR_NOTREADY (MIDIERR_BASE + 3)
+#define MIDIERR_NODEVICE (MIDIERR_BASE + 4)
+#define MIDIERR_INVALIDSETUP (MIDIERR_BASE + 5)
+#define MIDIERR_BADOPENMODE (MIDIERR_BASE + 6)
+#define MIDIERR_DONT_CONTINUE (MIDIERR_BASE + 7)
+#define MIDIERR_LASTERROR (MIDIERR_BASE + 7)
+
+  DECLARE_HANDLE(HMIDI);
+  DECLARE_HANDLE(HMIDIIN);
+  DECLARE_HANDLE(HMIDIOUT);
+  DECLARE_HANDLE(HMIDISTRM);
+  typedef HMIDI *LPHMIDI;
+  typedef HMIDIIN *LPHMIDIIN;
+  typedef HMIDIOUT *LPHMIDIOUT;
+  typedef HMIDISTRM *LPHMIDISTRM;
+  typedef DRVCALLBACK MIDICALLBACK;
+  typedef MIDICALLBACK *LPMIDICALLBACK;
+#define MIDIPATCHSIZE 128
+  typedef WORD PATCHARRAY[MIDIPATCHSIZE];
+  typedef WORD *LPPATCHARRAY;
+  typedef WORD KEYARRAY[MIDIPATCHSIZE];
+  typedef WORD *LPKEYARRAY;
+
+#define MIM_OPEN MM_MIM_OPEN
+#define MIM_CLOSE MM_MIM_CLOSE
+#define MIM_DATA MM_MIM_DATA
+#define MIM_LONGDATA MM_MIM_LONGDATA
+#define MIM_ERROR MM_MIM_ERROR
+#define MIM_LONGERROR MM_MIM_LONGERROR
+#define MOM_OPEN MM_MOM_OPEN
+#define MOM_CLOSE MM_MOM_CLOSE
+#define MOM_DONE MM_MOM_DONE
+
+#define MIM_MOREDATA MM_MIM_MOREDATA
+#define MOM_POSITIONCB MM_MOM_POSITIONCB
+
+#define MIDIMAPPER ((UINT)-1)
+#define MIDI_MAPPER ((UINT)-1)
+
+#define MIDI_IO_STATUS 0x00000020L
+
+#define MIDI_CACHE_ALL 1
+#define MIDI_CACHE_BESTFIT 2
+#define MIDI_CACHE_QUERY 3
+#define MIDI_UNCACHE 4
+
+  typedef struct tagMIDIOUTCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wVoices;
+    WORD wNotes;
+    WORD wChannelMask;
+    DWORD dwSupport;
+  } MIDIOUTCAPSA,*PMIDIOUTCAPSA,*NPMIDIOUTCAPSA,*LPMIDIOUTCAPSA;
+
+  typedef struct tagMIDIOUTCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wVoices;
+    WORD wNotes;
+    WORD wChannelMask;
+    DWORD dwSupport;
+  } MIDIOUTCAPSW,*PMIDIOUTCAPSW,*NPMIDIOUTCAPSW,*LPMIDIOUTCAPSW;
+#ifdef UNICODE
+  typedef MIDIOUTCAPSW MIDIOUTCAPS;
+  typedef PMIDIOUTCAPSW PMIDIOUTCAPS;
+  typedef NPMIDIOUTCAPSW NPMIDIOUTCAPS;
+  typedef LPMIDIOUTCAPSW LPMIDIOUTCAPS;
+#else
+  typedef MIDIOUTCAPSA MIDIOUTCAPS;
+  typedef PMIDIOUTCAPSA PMIDIOUTCAPS;
+  typedef NPMIDIOUTCAPSA NPMIDIOUTCAPS;
+  typedef LPMIDIOUTCAPSA LPMIDIOUTCAPS;
+#endif
+  typedef struct tagMIDIOUTCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wVoices;
+    WORD wNotes;
+    WORD wChannelMask;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIDIOUTCAPS2A,*PMIDIOUTCAPS2A,*NPMIDIOUTCAPS2A,*LPMIDIOUTCAPS2A;
+
+  typedef struct tagMIDIOUTCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wVoices;
+    WORD wNotes;
+    WORD wChannelMask;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIDIOUTCAPS2W,*PMIDIOUTCAPS2W,*NPMIDIOUTCAPS2W,*LPMIDIOUTCAPS2W;
+#ifdef UNICODE
+  typedef MIDIOUTCAPS2W MIDIOUTCAPS2;
+  typedef PMIDIOUTCAPS2W PMIDIOUTCAPS2;
+  typedef NPMIDIOUTCAPS2W NPMIDIOUTCAPS2;
+  typedef LPMIDIOUTCAPS2W LPMIDIOUTCAPS2;
+#else
+  typedef MIDIOUTCAPS2A MIDIOUTCAPS2;
+  typedef PMIDIOUTCAPS2A PMIDIOUTCAPS2;
+  typedef NPMIDIOUTCAPS2A NPMIDIOUTCAPS2;
+  typedef LPMIDIOUTCAPS2A LPMIDIOUTCAPS2;
+#endif
+
+#define MOD_MIDIPORT 1
+#define MOD_SYNTH 2
+#define MOD_SQSYNTH 3
+#define MOD_FMSYNTH 4
+#define MOD_MAPPER 5
+#define MOD_WAVETABLE 6
+#define MOD_SWSYNTH 7
+
+#define MIDICAPS_VOLUME 0x0001
+#define MIDICAPS_LRVOLUME 0x0002
+#define MIDICAPS_CACHE 0x0004
+#define MIDICAPS_STREAM 0x0008
+
+  typedef struct tagMIDIINCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwSupport;
+  } MIDIINCAPSA,*PMIDIINCAPSA,*NPMIDIINCAPSA,*LPMIDIINCAPSA;
+
+  typedef struct tagMIDIINCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwSupport;
+  } MIDIINCAPSW,*PMIDIINCAPSW,*NPMIDIINCAPSW,*LPMIDIINCAPSW;
+#ifdef UNICODE
+  typedef MIDIINCAPSW MIDIINCAPS;
+  typedef PMIDIINCAPSW PMIDIINCAPS;
+  typedef NPMIDIINCAPSW NPMIDIINCAPS;
+  typedef LPMIDIINCAPSW LPMIDIINCAPS;
+#else
+  typedef MIDIINCAPSA MIDIINCAPS;
+  typedef PMIDIINCAPSA PMIDIINCAPS;
+  typedef NPMIDIINCAPSA NPMIDIINCAPS;
+  typedef LPMIDIINCAPSA LPMIDIINCAPS;
+#endif
+  typedef struct tagMIDIINCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIDIINCAPS2A,*PMIDIINCAPS2A,*NPMIDIINCAPS2A,*LPMIDIINCAPS2A;
+
+  typedef struct tagMIDIINCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIDIINCAPS2W,*PMIDIINCAPS2W,*NPMIDIINCAPS2W,*LPMIDIINCAPS2W;
+#ifdef UNICODE
+  typedef MIDIINCAPS2W MIDIINCAPS2;
+  typedef PMIDIINCAPS2W PMIDIINCAPS2;
+  typedef NPMIDIINCAPS2W NPMIDIINCAPS2;
+  typedef LPMIDIINCAPS2W LPMIDIINCAPS2;
+#else
+  typedef MIDIINCAPS2A MIDIINCAPS2;
+  typedef PMIDIINCAPS2A PMIDIINCAPS2;
+  typedef NPMIDIINCAPS2A NPMIDIINCAPS2;
+  typedef LPMIDIINCAPS2A LPMIDIINCAPS2;
+#endif
+
+  typedef struct midihdr_tag {
+    LPSTR lpData;
+    DWORD dwBufferLength;
+    DWORD dwBytesRecorded;
+    DWORD_PTR dwUser;
+    DWORD dwFlags;
+    struct midihdr_tag far *lpNext;
+    DWORD_PTR reserved;
+    DWORD dwOffset;
+    DWORD_PTR dwReserved[8];
+  } MIDIHDR,*PMIDIHDR,NEAR *NPMIDIHDR,*LPMIDIHDR;
+
+  typedef struct midievent_tag {
+    DWORD dwDeltaTime;
+    DWORD dwStreamID;
+    DWORD dwEvent;
+    DWORD dwParms[1];
+  } MIDIEVENT;
+
+  typedef struct midistrmbuffver_tag {
+    DWORD dwVersion;
+    DWORD dwMid;
+    DWORD dwOEMVersion;
+  } MIDISTRMBUFFVER;
+
+#define MHDR_DONE 0x00000001
+#define MHDR_PREPARED 0x00000002
+#define MHDR_INQUEUE 0x00000004
+#define MHDR_ISSTRM 0x00000008
+
+#define MEVT_F_SHORT 0x00000000L
+#define MEVT_F_LONG 0x80000000L
+#define MEVT_F_CALLBACK 0x40000000L
+
+#define MEVT_EVENTTYPE(x) ((BYTE)(((x)>>24)&0xFF))
+#define MEVT_EVENTPARM(x) ((DWORD)((x)&0x00FFFFFFL))
+
+#define MEVT_SHORTMSG ((BYTE)0x00)
+#define MEVT_TEMPO ((BYTE)0x01)
+#define MEVT_NOP ((BYTE)0x02)
+
+#define MEVT_LONGMSG ((BYTE)0x80)
+#define MEVT_COMMENT ((BYTE)0x82)
+#define MEVT_VERSION ((BYTE)0x84)
+
+#define MIDISTRM_ERROR (-2)
+
+#define MIDIPROP_SET 0x80000000L
+#define MIDIPROP_GET 0x40000000L
+
+#define MIDIPROP_TIMEDIV 0x00000001L
+#define MIDIPROP_TEMPO 0x00000002L
+
+  typedef struct midiproptimediv_tag {
+    DWORD cbStruct;
+    DWORD dwTimeDiv;
+  } MIDIPROPTIMEDIV,*LPMIDIPROPTIMEDIV;
+
+  typedef struct midiproptempo_tag {
+    DWORD cbStruct;
+    DWORD dwTempo;
+  } MIDIPROPTEMPO,*LPMIDIPROPTEMPO;
+
+  WINMMAPI UINT WINAPI midiOutGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI midiStreamOpen(LPHMIDISTRM phms,LPUINT puDeviceID,DWORD cMidi,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI midiStreamClose(HMIDISTRM hms);
+  WINMMAPI MMRESULT WINAPI midiStreamProperty(HMIDISTRM hms,LPBYTE lppropdata,DWORD dwProperty);
+  WINMMAPI MMRESULT WINAPI midiStreamPosition(HMIDISTRM hms,LPMMTIME lpmmt,UINT cbmmt);
+  WINMMAPI MMRESULT WINAPI midiStreamOut(HMIDISTRM hms,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiStreamPause(HMIDISTRM hms);
+  WINMMAPI MMRESULT WINAPI midiStreamRestart(HMIDISTRM hms);
+  WINMMAPI MMRESULT WINAPI midiStreamStop(HMIDISTRM hms);
+  WINMMAPI MMRESULT WINAPI midiConnect(HMIDI hmi,HMIDIOUT hmo,LPVOID pReserved);
+  WINMMAPI MMRESULT WINAPI midiDisconnect(HMIDI hmi,HMIDIOUT hmo,LPVOID pReserved);
+  WINMMAPI MMRESULT WINAPI midiOutGetDevCapsA(UINT_PTR uDeviceID,LPMIDIOUTCAPSA pmoc,UINT cbmoc);
+  WINMMAPI MMRESULT WINAPI midiOutGetDevCapsW(UINT_PTR uDeviceID,LPMIDIOUTCAPSW pmoc,UINT cbmoc);
+#ifdef UNICODE
+#define midiOutGetDevCaps midiOutGetDevCapsW
+#else
+#define midiOutGetDevCaps midiOutGetDevCapsA
+#endif
+
+  WINMMAPI MMRESULT WINAPI midiOutGetVolume(HMIDIOUT hmo,LPDWORD pdwVolume);
+  WINMMAPI MMRESULT WINAPI midiOutSetVolume(HMIDIOUT hmo,DWORD dwVolume);
+  WINMMAPI MMRESULT WINAPI midiOutGetErrorTextA(MMRESULT mmrError,LPSTR pszText,UINT cchText);
+  WINMMAPI MMRESULT WINAPI midiOutGetErrorTextW(MMRESULT mmrError,LPWSTR pszText,UINT cchText);
+#ifdef UNICODE
+#define midiOutGetErrorText midiOutGetErrorTextW
+#else
+#define midiOutGetErrorText midiOutGetErrorTextA
+#endif
+
+  WINMMAPI MMRESULT WINAPI midiOutOpen(LPHMIDIOUT phmo,UINT uDeviceID,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI midiOutClose(HMIDIOUT hmo);
+  WINMMAPI MMRESULT WINAPI midiOutPrepareHeader(HMIDIOUT hmo,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiOutUnprepareHeader(HMIDIOUT hmo,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiOutShortMsg(HMIDIOUT hmo,DWORD dwMsg);
+  WINMMAPI MMRESULT WINAPI midiOutLongMsg(HMIDIOUT hmo,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiOutReset(HMIDIOUT hmo);
+  WINMMAPI MMRESULT WINAPI midiOutCachePatches(HMIDIOUT hmo,UINT uBank,LPWORD pwpa,UINT fuCache);
+  WINMMAPI MMRESULT WINAPI midiOutCacheDrumPatches(HMIDIOUT hmo,UINT uPatch,LPWORD pwkya,UINT fuCache);
+  WINMMAPI MMRESULT WINAPI midiOutGetID(HMIDIOUT hmo,LPUINT puDeviceID);
+  WINMMAPI MMRESULT WINAPI midiOutMessage(HMIDIOUT hmo,UINT uMsg,DWORD_PTR dw1,DWORD_PTR dw2);
+  WINMMAPI UINT WINAPI midiInGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI midiInGetDevCapsA(UINT_PTR uDeviceID,LPMIDIINCAPSA pmic,UINT cbmic);
+  WINMMAPI MMRESULT WINAPI midiInGetDevCapsW(UINT_PTR uDeviceID,LPMIDIINCAPSW pmic,UINT cbmic);
+#ifdef UNICODE
+#define midiInGetDevCaps midiInGetDevCapsW
+#else
+#define midiInGetDevCaps midiInGetDevCapsA
+#endif
+  WINMMAPI MMRESULT WINAPI midiInGetErrorTextA(MMRESULT mmrError,LPSTR pszText,UINT cchText);
+  WINMMAPI MMRESULT WINAPI midiInGetErrorTextW(MMRESULT mmrError,LPWSTR pszText,UINT cchText);
+#ifdef UNICODE
+#define midiInGetErrorText midiInGetErrorTextW
+#else
+#define midiInGetErrorText midiInGetErrorTextA
+#endif
+
+  WINMMAPI MMRESULT WINAPI midiInOpen(LPHMIDIIN phmi,UINT uDeviceID,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI midiInClose(HMIDIIN hmi);
+  WINMMAPI MMRESULT WINAPI midiInPrepareHeader(HMIDIIN hmi,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiInUnprepareHeader(HMIDIIN hmi,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiInAddBuffer(HMIDIIN hmi,LPMIDIHDR pmh,UINT cbmh);
+  WINMMAPI MMRESULT WINAPI midiInStart(HMIDIIN hmi);
+  WINMMAPI MMRESULT WINAPI midiInStop(HMIDIIN hmi);
+  WINMMAPI MMRESULT WINAPI midiInReset(HMIDIIN hmi);
+  WINMMAPI MMRESULT WINAPI midiInGetID(HMIDIIN hmi,LPUINT puDeviceID);
+  WINMMAPI MMRESULT WINAPI midiInMessage(HMIDIIN hmi,UINT uMsg,DWORD_PTR dw1,DWORD_PTR dw2);
+#endif
+
+#ifndef MMNOAUX
+
+#define AUX_MAPPER ((UINT)-1)
+
+  typedef struct tagAUXCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wReserved1;
+    DWORD dwSupport;
+  } AUXCAPSA,*PAUXCAPSA,*NPAUXCAPSA,*LPAUXCAPSA;
+
+  typedef struct tagAUXCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wReserved1;
+    DWORD dwSupport;
+  } AUXCAPSW,*PAUXCAPSW,*NPAUXCAPSW,*LPAUXCAPSW;
+#ifdef UNICODE
+  typedef AUXCAPSW AUXCAPS;
+  typedef PAUXCAPSW PAUXCAPS;
+  typedef NPAUXCAPSW NPAUXCAPS;
+  typedef LPAUXCAPSW LPAUXCAPS;
+#else
+  typedef AUXCAPSA AUXCAPS;
+  typedef PAUXCAPSA PAUXCAPS;
+  typedef NPAUXCAPSA NPAUXCAPS;
+  typedef LPAUXCAPSA LPAUXCAPS;
+#endif
+  typedef struct tagAUXCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wReserved1;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } AUXCAPS2A,*PAUXCAPS2A,*NPAUXCAPS2A,*LPAUXCAPS2A;
+
+  typedef struct tagAUXCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    WORD wTechnology;
+    WORD wReserved1;
+    DWORD dwSupport;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } AUXCAPS2W,*PAUXCAPS2W,*NPAUXCAPS2W,*LPAUXCAPS2W;
+#ifdef UNICODE
+  typedef AUXCAPS2W AUXCAPS2;
+  typedef PAUXCAPS2W PAUXCAPS2;
+  typedef NPAUXCAPS2W NPAUXCAPS2;
+  typedef LPAUXCAPS2W LPAUXCAPS2;
+#else
+  typedef AUXCAPS2A AUXCAPS2;
+  typedef PAUXCAPS2A PAUXCAPS2;
+  typedef NPAUXCAPS2A NPAUXCAPS2;
+  typedef LPAUXCAPS2A LPAUXCAPS2;
+#endif
+
+#define AUXCAPS_CDAUDIO 1
+#define AUXCAPS_AUXIN 2
+
+#define AUXCAPS_VOLUME 0x0001
+#define AUXCAPS_LRVOLUME 0x0002
+
+  WINMMAPI UINT WINAPI auxGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI auxGetDevCapsA(UINT_PTR uDeviceID,LPAUXCAPSA pac,UINT cbac);
+  WINMMAPI MMRESULT WINAPI auxGetDevCapsW(UINT_PTR uDeviceID,LPAUXCAPSW pac,UINT cbac);
+#ifdef UNICODE
+#define auxGetDevCaps auxGetDevCapsW
+#else
+#define auxGetDevCaps auxGetDevCapsA
+#endif
+  WINMMAPI MMRESULT WINAPI auxSetVolume(UINT uDeviceID,DWORD dwVolume);
+  WINMMAPI MMRESULT WINAPI auxGetVolume(UINT uDeviceID,LPDWORD pdwVolume);
+  WINMMAPI MMRESULT WINAPI auxOutMessage(UINT uDeviceID,UINT uMsg,DWORD_PTR dw1,DWORD_PTR dw2);
+#endif
+
+#ifndef MMNOMIXER
+
+  DECLARE_HANDLE(HMIXEROBJ);
+  typedef HMIXEROBJ *LPHMIXEROBJ;
+
+  DECLARE_HANDLE(HMIXER);
+  typedef HMIXER *LPHMIXER;
+
+#define MIXER_SHORT_NAME_CHARS 16
+#define MIXER_LONG_NAME_CHARS 64
+
+#define MIXERR_INVALLINE (MIXERR_BASE + 0)
+#define MIXERR_INVALCONTROL (MIXERR_BASE + 1)
+#define MIXERR_INVALVALUE (MIXERR_BASE + 2)
+#define MIXERR_LASTERROR (MIXERR_BASE + 2)
+
+#define MIXER_OBJECTF_HANDLE 0x80000000L
+#define MIXER_OBJECTF_MIXER 0x00000000L
+#define MIXER_OBJECTF_HMIXER (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIXER)
+#define MIXER_OBJECTF_WAVEOUT 0x10000000L
+#define MIXER_OBJECTF_HWAVEOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEOUT)
+#define MIXER_OBJECTF_WAVEIN 0x20000000L
+#define MIXER_OBJECTF_HWAVEIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_WAVEIN)
+#define MIXER_OBJECTF_MIDIOUT 0x30000000L
+#define MIXER_OBJECTF_HMIDIOUT (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIOUT)
+#define MIXER_OBJECTF_MIDIIN 0x40000000L
+#define MIXER_OBJECTF_HMIDIIN (MIXER_OBJECTF_HANDLE|MIXER_OBJECTF_MIDIIN)
+#define MIXER_OBJECTF_AUX 0x50000000L
+
+  WINMMAPI UINT WINAPI mixerGetNumDevs(void);
+
+  typedef struct tagMIXERCAPSA {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD fdwSupport;
+    DWORD cDestinations;
+  } MIXERCAPSA,*PMIXERCAPSA,*LPMIXERCAPSA;
+
+  typedef struct tagMIXERCAPSW {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD fdwSupport;
+    DWORD cDestinations;
+  } MIXERCAPSW,*PMIXERCAPSW,*LPMIXERCAPSW;
+#ifdef UNICODE
+  typedef MIXERCAPSW MIXERCAPS;
+  typedef PMIXERCAPSW PMIXERCAPS;
+  typedef LPMIXERCAPSW LPMIXERCAPS;
+#else
+  typedef MIXERCAPSA MIXERCAPS;
+  typedef PMIXERCAPSA PMIXERCAPS;
+  typedef LPMIXERCAPSA LPMIXERCAPS;
+#endif
+  typedef struct tagMIXERCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    CHAR szPname[MAXPNAMELEN];
+    DWORD fdwSupport;
+    DWORD cDestinations;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIXERCAPS2A,*PMIXERCAPS2A,*LPMIXERCAPS2A;
+
+  typedef struct tagMIXERCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    MMVERSION vDriverVersion;
+    WCHAR szPname[MAXPNAMELEN];
+    DWORD fdwSupport;
+    DWORD cDestinations;
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } MIXERCAPS2W,*PMIXERCAPS2W,*LPMIXERCAPS2W;
+#ifdef UNICODE
+  typedef MIXERCAPS2W MIXERCAPS2;
+  typedef PMIXERCAPS2W PMIXERCAPS2;
+  typedef LPMIXERCAPS2W LPMIXERCAPS2;
+#else
+  typedef MIXERCAPS2A MIXERCAPS2;
+  typedef PMIXERCAPS2A PMIXERCAPS2;
+  typedef LPMIXERCAPS2A LPMIXERCAPS2;
+#endif
+
+  WINMMAPI MMRESULT WINAPI mixerGetDevCapsA(UINT_PTR uMxId,LPMIXERCAPSA pmxcaps,UINT cbmxcaps);
+  WINMMAPI MMRESULT WINAPI mixerGetDevCapsW(UINT_PTR uMxId,LPMIXERCAPSW pmxcaps,UINT cbmxcaps);
+#ifdef UNICODE
+#define mixerGetDevCaps mixerGetDevCapsW
+#else
+#define mixerGetDevCaps mixerGetDevCapsA
+#endif
+
+  WINMMAPI MMRESULT WINAPI mixerOpen(LPHMIXER phmx,UINT uMxId,DWORD_PTR dwCallback,DWORD_PTR dwInstance,DWORD fdwOpen);
+  WINMMAPI MMRESULT WINAPI mixerClose(HMIXER hmx);
+  WINMMAPI DWORD WINAPI mixerMessage(HMIXER hmx,UINT uMsg,DWORD_PTR dwParam1,DWORD_PTR dwParam2);
+
+  typedef struct tagMIXERLINEA {
+    DWORD cbStruct;
+    DWORD dwDestination;
+    DWORD dwSource;
+    DWORD dwLineID;
+    DWORD fdwLine;
+    DWORD_PTR dwUser;
+    DWORD dwComponentType;
+    DWORD cChannels;
+    DWORD cConnections;
+    DWORD cControls;
+    CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+    CHAR szName[MIXER_LONG_NAME_CHARS];
+    struct {
+      DWORD dwType;
+      DWORD dwDeviceID;
+      WORD wMid;
+      WORD wPid;
+      MMVERSION vDriverVersion;
+      CHAR szPname[MAXPNAMELEN];
+    } Target;
+  } MIXERLINEA,*PMIXERLINEA,*LPMIXERLINEA;
+
+  typedef struct tagMIXERLINEW {
+    DWORD cbStruct;
+    DWORD dwDestination;
+    DWORD dwSource;
+    DWORD dwLineID;
+    DWORD fdwLine;
+    DWORD_PTR dwUser;
+    DWORD dwComponentType;
+    DWORD cChannels;
+    DWORD cConnections;
+    DWORD cControls;
+    WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+    WCHAR szName[MIXER_LONG_NAME_CHARS];
+    struct {
+      DWORD dwType;
+      DWORD dwDeviceID;
+      WORD wMid;
+      WORD wPid;
+      MMVERSION vDriverVersion;
+      WCHAR szPname[MAXPNAMELEN];
+    } Target;
+  } MIXERLINEW,*PMIXERLINEW,*LPMIXERLINEW;
+#ifdef UNICODE
+  typedef MIXERLINEW MIXERLINE;
+  typedef PMIXERLINEW PMIXERLINE;
+  typedef LPMIXERLINEW LPMIXERLINE;
+#else
+  typedef MIXERLINEA MIXERLINE;
+  typedef PMIXERLINEA PMIXERLINE;
+  typedef LPMIXERLINEA LPMIXERLINE;
+#endif
+
+#define MIXERLINE_LINEF_ACTIVE 0x00000001L
+#define MIXERLINE_LINEF_DISCONNECTED 0x00008000L
+#define MIXERLINE_LINEF_SOURCE 0x80000000L
+
+#define MIXERLINE_COMPONENTTYPE_DST_FIRST 0x0L
+#define MIXERLINE_COMPONENTTYPE_DST_UNDEFINED (MIXERLINE_COMPONENTTYPE_DST_FIRST + 0)
+#define MIXERLINE_COMPONENTTYPE_DST_DIGITAL (MIXERLINE_COMPONENTTYPE_DST_FIRST + 1)
+#define MIXERLINE_COMPONENTTYPE_DST_LINE (MIXERLINE_COMPONENTTYPE_DST_FIRST + 2)
+#define MIXERLINE_COMPONENTTYPE_DST_MONITOR (MIXERLINE_COMPONENTTYPE_DST_FIRST + 3)
+#define MIXERLINE_COMPONENTTYPE_DST_SPEAKERS (MIXERLINE_COMPONENTTYPE_DST_FIRST + 4)
+#define MIXERLINE_COMPONENTTYPE_DST_HEADPHONES (MIXERLINE_COMPONENTTYPE_DST_FIRST + 5)
+#define MIXERLINE_COMPONENTTYPE_DST_TELEPHONE (MIXERLINE_COMPONENTTYPE_DST_FIRST + 6)
+#define MIXERLINE_COMPONENTTYPE_DST_WAVEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST + 7)
+#define MIXERLINE_COMPONENTTYPE_DST_VOICEIN (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)
+#define MIXERLINE_COMPONENTTYPE_DST_LAST (MIXERLINE_COMPONENTTYPE_DST_FIRST + 8)
+#define MIXERLINE_COMPONENTTYPE_SRC_FIRST 0x00001000L
+#define MIXERLINE_COMPONENTTYPE_SRC_UNDEFINED (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 0)
+#define MIXERLINE_COMPONENTTYPE_SRC_DIGITAL (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 1)
+#define MIXERLINE_COMPONENTTYPE_SRC_LINE (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 2)
+#define MIXERLINE_COMPONENTTYPE_SRC_MICROPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 3)
+#define MIXERLINE_COMPONENTTYPE_SRC_SYNTHESIZER (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 4)
+#define MIXERLINE_COMPONENTTYPE_SRC_COMPACTDISC (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 5)
+#define MIXERLINE_COMPONENTTYPE_SRC_TELEPHONE (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 6)
+#define MIXERLINE_COMPONENTTYPE_SRC_PCSPEAKER (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 7)
+#define MIXERLINE_COMPONENTTYPE_SRC_WAVEOUT (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 8)
+#define MIXERLINE_COMPONENTTYPE_SRC_AUXILIARY (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 9)
+#define MIXERLINE_COMPONENTTYPE_SRC_ANALOG (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)
+#define MIXERLINE_COMPONENTTYPE_SRC_LAST (MIXERLINE_COMPONENTTYPE_SRC_FIRST + 10)
+
+#define MIXERLINE_TARGETTYPE_UNDEFINED 0
+#define MIXERLINE_TARGETTYPE_WAVEOUT 1
+#define MIXERLINE_TARGETTYPE_WAVEIN 2
+#define MIXERLINE_TARGETTYPE_MIDIOUT 3
+#define MIXERLINE_TARGETTYPE_MIDIIN 4
+#define MIXERLINE_TARGETTYPE_AUX 5
+
+  WINMMAPI MMRESULT WINAPI mixerGetLineInfoA(HMIXEROBJ hmxobj,LPMIXERLINEA pmxl,DWORD fdwInfo);
+  WINMMAPI MMRESULT WINAPI mixerGetLineInfoW(HMIXEROBJ hmxobj,LPMIXERLINEW pmxl,DWORD fdwInfo);
+#ifdef UNICODE
+#define mixerGetLineInfo mixerGetLineInfoW
+#else
+#define mixerGetLineInfo mixerGetLineInfoA
+#endif
+
+#define MIXER_GETLINEINFOF_DESTINATION 0x00000000L
+#define MIXER_GETLINEINFOF_SOURCE 0x00000001L
+#define MIXER_GETLINEINFOF_LINEID 0x00000002L
+#define MIXER_GETLINEINFOF_COMPONENTTYPE 0x00000003L
+#define MIXER_GETLINEINFOF_TARGETTYPE 0x00000004L
+
+#define MIXER_GETLINEINFOF_QUERYMASK 0x0000000FL
+
+  WINMMAPI MMRESULT WINAPI mixerGetID(HMIXEROBJ hmxobj,UINT *puMxId,DWORD fdwId);
+
+  typedef struct tagMIXERCONTROLA {
+    DWORD cbStruct;
+    DWORD dwControlID;
+    DWORD dwControlType;
+    DWORD fdwControl;
+    DWORD cMultipleItems;
+    CHAR szShortName[MIXER_SHORT_NAME_CHARS];
+    CHAR szName[MIXER_LONG_NAME_CHARS];
+    union {
+      __MINGW_EXTENSION struct {
+	LONG lMinimum;
+	LONG lMaximum;
+      };
+      __MINGW_EXTENSION struct {
+	DWORD dwMinimum;
+	DWORD dwMaximum;
+      };
+      DWORD dwReserved[6];
+    } Bounds;
+    union {
+      DWORD cSteps;
+      DWORD cbCustomData;
+      DWORD dwReserved[6];
+    } Metrics;
+  } MIXERCONTROLA,*PMIXERCONTROLA,*LPMIXERCONTROLA;
+
+  typedef struct tagMIXERCONTROLW {
+    DWORD cbStruct;
+    DWORD dwControlID;
+    DWORD dwControlType;
+    DWORD fdwControl;
+    DWORD cMultipleItems;
+    WCHAR szShortName[MIXER_SHORT_NAME_CHARS];
+    WCHAR szName[MIXER_LONG_NAME_CHARS];
+    union {
+      __MINGW_EXTENSION struct {
+	LONG lMinimum;
+	LONG lMaximum;
+      };
+      __MINGW_EXTENSION struct {
+	DWORD dwMinimum;
+	DWORD dwMaximum;
+      };
+      DWORD dwReserved[6];
+    } Bounds;
+    union {
+      DWORD cSteps;
+      DWORD cbCustomData;
+      DWORD dwReserved[6];
+    } Metrics;
+  } MIXERCONTROLW,*PMIXERCONTROLW,*LPMIXERCONTROLW;
+#ifdef UNICODE
+  typedef MIXERCONTROLW MIXERCONTROL;
+  typedef PMIXERCONTROLW PMIXERCONTROL;
+  typedef LPMIXERCONTROLW LPMIXERCONTROL;
+#else
+  typedef MIXERCONTROLA MIXERCONTROL;
+  typedef PMIXERCONTROLA PMIXERCONTROL;
+  typedef LPMIXERCONTROLA LPMIXERCONTROL;
+#endif
+
+#define MIXERCONTROL_CONTROLF_UNIFORM 0x00000001L
+#define MIXERCONTROL_CONTROLF_MULTIPLE 0x00000002L
+#define MIXERCONTROL_CONTROLF_DISABLED 0x80000000L
+
+#define MIXERCONTROL_CT_CLASS_MASK 0xF0000000L
+#define MIXERCONTROL_CT_CLASS_CUSTOM 0x00000000L
+#define MIXERCONTROL_CT_CLASS_METER 0x10000000L
+#define MIXERCONTROL_CT_CLASS_SWITCH 0x20000000L
+#define MIXERCONTROL_CT_CLASS_NUMBER 0x30000000L
+#define MIXERCONTROL_CT_CLASS_SLIDER 0x40000000L
+#define MIXERCONTROL_CT_CLASS_FADER 0x50000000L
+#define MIXERCONTROL_CT_CLASS_TIME 0x60000000L
+#define MIXERCONTROL_CT_CLASS_LIST 0x70000000L
+
+#define MIXERCONTROL_CT_SUBCLASS_MASK 0x0F000000L
+
+#define MIXERCONTROL_CT_SC_SWITCH_BOOLEAN 0x00000000L
+#define MIXERCONTROL_CT_SC_SWITCH_BUTTON 0x01000000L
+
+#define MIXERCONTROL_CT_SC_METER_POLLED 0x00000000L
+
+#define MIXERCONTROL_CT_SC_TIME_MICROSECS 0x00000000L
+#define MIXERCONTROL_CT_SC_TIME_MILLISECS 0x01000000L
+
+#define MIXERCONTROL_CT_SC_LIST_SINGLE 0x00000000L
+#define MIXERCONTROL_CT_SC_LIST_MULTIPLE 0x01000000L
+
+#define MIXERCONTROL_CT_UNITS_MASK 0x00FF0000L
+#define MIXERCONTROL_CT_UNITS_CUSTOM 0x00000000L
+#define MIXERCONTROL_CT_UNITS_BOOLEAN 0x00010000L
+#define MIXERCONTROL_CT_UNITS_SIGNED 0x00020000L
+#define MIXERCONTROL_CT_UNITS_UNSIGNED 0x00030000L
+#define MIXERCONTROL_CT_UNITS_DECIBELS 0x00040000L
+#define MIXERCONTROL_CT_UNITS_PERCENT 0x00050000L
+
+#define MIXERCONTROL_CONTROLTYPE_CUSTOM (MIXERCONTROL_CT_CLASS_CUSTOM | MIXERCONTROL_CT_UNITS_CUSTOM)
+#define MIXERCONTROL_CONTROLTYPE_BOOLEANMETER (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_SIGNEDMETER (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PEAKMETER (MIXERCONTROL_CONTROLTYPE_SIGNEDMETER + 1)
+#define MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER (MIXERCONTROL_CT_CLASS_METER | MIXERCONTROL_CT_SC_METER_POLLED | MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_BOOLEAN (MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BOOLEAN | MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_ONOFF (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 1)
+#define MIXERCONTROL_CONTROLTYPE_MUTE (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 2)
+#define MIXERCONTROL_CONTROLTYPE_MONO (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 3)
+#define MIXERCONTROL_CONTROLTYPE_LOUDNESS (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 4)
+#define MIXERCONTROL_CONTROLTYPE_STEREOENH (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 5)
+#define MIXERCONTROL_CONTROLTYPE_BASS_BOOST (MIXERCONTROL_CONTROLTYPE_BOOLEAN + 0x00002277)
+#define MIXERCONTROL_CONTROLTYPE_BUTTON (MIXERCONTROL_CT_CLASS_SWITCH | MIXERCONTROL_CT_SC_SWITCH_BUTTON | MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_DECIBELS (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_DECIBELS)
+#define MIXERCONTROL_CONTROLTYPE_SIGNED (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_UNSIGNED (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PERCENT (MIXERCONTROL_CT_CLASS_NUMBER | MIXERCONTROL_CT_UNITS_PERCENT)
+#define MIXERCONTROL_CONTROLTYPE_SLIDER (MIXERCONTROL_CT_CLASS_SLIDER | MIXERCONTROL_CT_UNITS_SIGNED)
+#define MIXERCONTROL_CONTROLTYPE_PAN (MIXERCONTROL_CONTROLTYPE_SLIDER + 1)
+#define MIXERCONTROL_CONTROLTYPE_QSOUNDPAN (MIXERCONTROL_CONTROLTYPE_SLIDER + 2)
+#define MIXERCONTROL_CONTROLTYPE_FADER (MIXERCONTROL_CT_CLASS_FADER | MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_VOLUME (MIXERCONTROL_CONTROLTYPE_FADER + 1)
+#define MIXERCONTROL_CONTROLTYPE_BASS (MIXERCONTROL_CONTROLTYPE_FADER + 2)
+#define MIXERCONTROL_CONTROLTYPE_TREBLE (MIXERCONTROL_CONTROLTYPE_FADER + 3)
+#define MIXERCONTROL_CONTROLTYPE_EQUALIZER (MIXERCONTROL_CONTROLTYPE_FADER + 4)
+#define MIXERCONTROL_CONTROLTYPE_SINGLESELECT (MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_SINGLE | MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_MUX (MIXERCONTROL_CONTROLTYPE_SINGLESELECT + 1)
+#define MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT (MIXERCONTROL_CT_CLASS_LIST | MIXERCONTROL_CT_SC_LIST_MULTIPLE | MIXERCONTROL_CT_UNITS_BOOLEAN)
+#define MIXERCONTROL_CONTROLTYPE_MIXER (MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT + 1)
+#define MIXERCONTROL_CONTROLTYPE_MICROTIME (MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MICROSECS | MIXERCONTROL_CT_UNITS_UNSIGNED)
+#define MIXERCONTROL_CONTROLTYPE_MILLITIME (MIXERCONTROL_CT_CLASS_TIME | MIXERCONTROL_CT_SC_TIME_MILLISECS | MIXERCONTROL_CT_UNITS_UNSIGNED)
+
+  typedef struct tagMIXERLINECONTROLSA {
+    DWORD cbStruct;
+    DWORD dwLineID;
+    __MINGW_EXTENSION union {
+      DWORD dwControlID;
+      DWORD dwControlType;
+    };
+    DWORD cControls;
+    DWORD cbmxctrl;
+    LPMIXERCONTROLA pamxctrl;
+  } MIXERLINECONTROLSA,*PMIXERLINECONTROLSA,*LPMIXERLINECONTROLSA;
+
+  typedef struct tagMIXERLINECONTROLSW {
+    DWORD cbStruct;
+    DWORD dwLineID;
+    __MINGW_EXTENSION union {
+      DWORD dwControlID;
+      DWORD dwControlType;
+    };
+    DWORD cControls;
+    DWORD cbmxctrl;
+    LPMIXERCONTROLW pamxctrl;
+  } MIXERLINECONTROLSW,*PMIXERLINECONTROLSW,*LPMIXERLINECONTROLSW;
+#ifdef UNICODE
+  typedef MIXERLINECONTROLSW MIXERLINECONTROLS;
+  typedef PMIXERLINECONTROLSW PMIXERLINECONTROLS;
+  typedef LPMIXERLINECONTROLSW LPMIXERLINECONTROLS;
+#else
+  typedef MIXERLINECONTROLSA MIXERLINECONTROLS;
+  typedef PMIXERLINECONTROLSA PMIXERLINECONTROLS;
+  typedef LPMIXERLINECONTROLSA LPMIXERLINECONTROLS;
+#endif
+
+  WINMMAPI MMRESULT WINAPI mixerGetLineControlsA(HMIXEROBJ hmxobj,LPMIXERLINECONTROLSA pmxlc,DWORD fdwControls);
+  WINMMAPI MMRESULT WINAPI mixerGetLineControlsW(HMIXEROBJ hmxobj,LPMIXERLINECONTROLSW pmxlc,DWORD fdwControls);
+#ifdef UNICODE
+#define mixerGetLineControls mixerGetLineControlsW
+#else
+#define mixerGetLineControls mixerGetLineControlsA
+#endif
+
+#define MIXER_GETLINECONTROLSF_ALL 0x00000000L
+#define MIXER_GETLINECONTROLSF_ONEBYID 0x00000001L
+#define MIXER_GETLINECONTROLSF_ONEBYTYPE 0x00000002L
+
+#define MIXER_GETLINECONTROLSF_QUERYMASK 0x0000000FL
+
+  typedef struct tMIXERCONTROLDETAILS {
+    DWORD cbStruct;
+    DWORD dwControlID;
+    DWORD cChannels;
+    __MINGW_EXTENSION union {
+      HWND hwndOwner;
+      DWORD cMultipleItems;
+    };
+    DWORD cbDetails;
+    LPVOID paDetails;
+  } MIXERCONTROLDETAILS,*PMIXERCONTROLDETAILS,*LPMIXERCONTROLDETAILS;
+
+  typedef struct tagMIXERCONTROLDETAILS_LISTTEXTA {
+    DWORD dwParam1;
+    DWORD dwParam2;
+    CHAR szName[MIXER_LONG_NAME_CHARS];
+  } MIXERCONTROLDETAILS_LISTTEXTA,*PMIXERCONTROLDETAILS_LISTTEXTA,*LPMIXERCONTROLDETAILS_LISTTEXTA;
+  typedef struct tagMIXERCONTROLDETAILS_LISTTEXTW {
+    DWORD dwParam1;
+    DWORD dwParam2;
+    WCHAR szName[MIXER_LONG_NAME_CHARS];
+  } MIXERCONTROLDETAILS_LISTTEXTW,*PMIXERCONTROLDETAILS_LISTTEXTW,*LPMIXERCONTROLDETAILS_LISTTEXTW;
+#ifdef UNICODE
+  typedef MIXERCONTROLDETAILS_LISTTEXTW MIXERCONTROLDETAILS_LISTTEXT;
+  typedef PMIXERCONTROLDETAILS_LISTTEXTW PMIXERCONTROLDETAILS_LISTTEXT;
+  typedef LPMIXERCONTROLDETAILS_LISTTEXTW LPMIXERCONTROLDETAILS_LISTTEXT;
+#else
+  typedef MIXERCONTROLDETAILS_LISTTEXTA MIXERCONTROLDETAILS_LISTTEXT;
+  typedef PMIXERCONTROLDETAILS_LISTTEXTA PMIXERCONTROLDETAILS_LISTTEXT;
+  typedef LPMIXERCONTROLDETAILS_LISTTEXTA LPMIXERCONTROLDETAILS_LISTTEXT;
+#endif
+
+  typedef struct tMIXERCONTROLDETAILS_BOOLEAN {
+    LONG fValue;
+  } MIXERCONTROLDETAILS_BOOLEAN,*PMIXERCONTROLDETAILS_BOOLEAN,*LPMIXERCONTROLDETAILS_BOOLEAN;
+
+  typedef struct tMIXERCONTROLDETAILS_SIGNED {
+    LONG lValue;
+  } MIXERCONTROLDETAILS_SIGNED,*PMIXERCONTROLDETAILS_SIGNED,*LPMIXERCONTROLDETAILS_SIGNED;
+
+  typedef struct tMIXERCONTROLDETAILS_UNSIGNED {
+    DWORD dwValue;
+  } MIXERCONTROLDETAILS_UNSIGNED,*PMIXERCONTROLDETAILS_UNSIGNED,*LPMIXERCONTROLDETAILS_UNSIGNED;
+
+  WINMMAPI MMRESULT WINAPI mixerGetControlDetailsA(HMIXEROBJ hmxobj,LPMIXERCONTROLDETAILS pmxcd,DWORD fdwDetails);
+  WINMMAPI MMRESULT WINAPI mixerGetControlDetailsW(HMIXEROBJ hmxobj,LPMIXERCONTROLDETAILS pmxcd,DWORD fdwDetails);
+#ifdef UNICODE
+#define mixerGetControlDetails mixerGetControlDetailsW
+#else
+#define mixerGetControlDetails mixerGetControlDetailsA
+#endif
+
+#define MIXER_GETCONTROLDETAILSF_VALUE 0x00000000L
+#define MIXER_GETCONTROLDETAILSF_LISTTEXT 0x00000001L
+
+#define MIXER_GETCONTROLDETAILSF_QUERYMASK 0x0000000FL
+
+  WINMMAPI MMRESULT WINAPI mixerSetControlDetails(HMIXEROBJ hmxobj,LPMIXERCONTROLDETAILS pmxcd,DWORD fdwDetails);
+
+#define MIXER_SETCONTROLDETAILSF_VALUE 0x00000000L
+#define MIXER_SETCONTROLDETAILSF_CUSTOM 0x00000001L
+
+#define MIXER_SETCONTROLDETAILSF_QUERYMASK 0x0000000FL
+#endif
+
+#ifndef MMNOTIMER
+
+#define TIMERR_NOERROR (0)
+#define TIMERR_NOCANDO (TIMERR_BASE+1)
+#define TIMERR_STRUCT (TIMERR_BASE+33)
+
+  typedef void (CALLBACK TIMECALLBACK)(UINT uTimerID,UINT uMsg,DWORD_PTR dwUser,DWORD_PTR dw1,DWORD_PTR dw2);
+  typedef TIMECALLBACK *LPTIMECALLBACK;
+
+#define TIME_ONESHOT 0x0000
+#define TIME_PERIODIC 0x0001
+
+#define TIME_CALLBACK_FUNCTION 0x0000
+#define TIME_CALLBACK_EVENT_SET 0x0010
+#define TIME_CALLBACK_EVENT_PULSE 0x0020
+#define TIME_KILL_SYNCHRONOUS 0x0100
+
+  typedef struct timecaps_tag {
+    UINT wPeriodMin;
+    UINT wPeriodMax;
+  } TIMECAPS,*PTIMECAPS,NEAR *NPTIMECAPS,*LPTIMECAPS;
+
+  WINMMAPI MMRESULT WINAPI timeGetSystemTime(LPMMTIME pmmt,UINT cbmmt);
+  WINMMAPI DWORD WINAPI timeGetTime(void);
+  WINMMAPI MMRESULT WINAPI timeSetEvent(UINT uDelay,UINT uResolution,LPTIMECALLBACK fptc,DWORD_PTR dwUser,UINT fuEvent);
+  WINMMAPI MMRESULT WINAPI timeKillEvent(UINT uTimerID);
+  WINMMAPI MMRESULT WINAPI timeGetDevCaps(LPTIMECAPS ptc,UINT cbtc);
+  WINMMAPI MMRESULT WINAPI timeBeginPeriod(UINT uPeriod);
+  WINMMAPI MMRESULT WINAPI timeEndPeriod(UINT uPeriod);
+#endif
+
+#ifndef MMNOJOY
+
+#define JOYERR_NOERROR (0)
+#define JOYERR_PARMS (JOYERR_BASE+5)
+#define JOYERR_NOCANDO (JOYERR_BASE+6)
+#define JOYERR_UNPLUGGED (JOYERR_BASE+7)
+
+#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_BUTTON5 0x00000010l
+#define JOY_BUTTON6 0x00000020l
+#define JOY_BUTTON7 0x00000040l
+#define JOY_BUTTON8 0x00000080l
+#define JOY_BUTTON9 0x00000100l
+#define JOY_BUTTON10 0x00000200l
+#define JOY_BUTTON11 0x00000400l
+#define JOY_BUTTON12 0x00000800l
+#define JOY_BUTTON13 0x00001000l
+#define JOY_BUTTON14 0x00002000l
+#define JOY_BUTTON15 0x00004000l
+#define JOY_BUTTON16 0x00008000l
+#define JOY_BUTTON17 0x00010000l
+#define JOY_BUTTON18 0x00020000l
+#define JOY_BUTTON19 0x00040000l
+#define JOY_BUTTON20 0x00080000l
+#define JOY_BUTTON21 0x00100000l
+#define JOY_BUTTON22 0x00200000l
+#define JOY_BUTTON23 0x00400000l
+#define JOY_BUTTON24 0x00800000l
+#define JOY_BUTTON25 0x01000000l
+#define JOY_BUTTON26 0x02000000l
+#define JOY_BUTTON27 0x04000000l
+#define JOY_BUTTON28 0x08000000l
+#define JOY_BUTTON29 0x10000000l
+#define JOY_BUTTON30 0x20000000l
+#define JOY_BUTTON31 0x40000000l
+#define JOY_BUTTON32 0x80000000l
+
+#define JOY_POVCENTERED (WORD) -1
+#define JOY_POVFORWARD 0
+#define JOY_POVRIGHT 9000
+#define JOY_POVBACKWARD 18000
+#define JOY_POVLEFT 27000
+
+#define JOY_RETURNX 0x00000001l
+#define JOY_RETURNY 0x00000002l
+#define JOY_RETURNZ 0x00000004l
+#define JOY_RETURNR 0x00000008l
+#define JOY_RETURNU 0x00000010l
+#define JOY_RETURNV 0x00000020l
+#define JOY_RETURNPOV 0x00000040l
+#define JOY_RETURNBUTTONS 0x00000080l
+#define JOY_RETURNRAWDATA 0x00000100l
+#define JOY_RETURNPOVCTS 0x00000200l
+#define JOY_RETURNCENTERED 0x00000400l
+#define JOY_USEDEADZONE 0x00000800l
+#define JOY_RETURNALL (JOY_RETURNX | JOY_RETURNY | JOY_RETURNZ | JOY_RETURNR | JOY_RETURNU | JOY_RETURNV | JOY_RETURNPOV | JOY_RETURNBUTTONS)
+#define JOY_CAL_READALWAYS 0x00010000l
+#define JOY_CAL_READXYONLY 0x00020000l
+#define JOY_CAL_READ3 0x00040000l
+#define JOY_CAL_READ4 0x00080000l
+#define JOY_CAL_READXONLY 0x00100000l
+#define JOY_CAL_READYONLY 0x00200000l
+#define JOY_CAL_READ5 0x00400000l
+#define JOY_CAL_READ6 0x00800000l
+#define JOY_CAL_READZONLY 0x01000000l
+#define JOY_CAL_READRONLY 0x02000000l
+#define JOY_CAL_READUONLY 0x04000000l
+#define JOY_CAL_READVONLY 0x08000000l
+
+#define JOYSTICKID1 0
+#define JOYSTICKID2 1
+
+#define JOYCAPS_HASZ 0x0001
+#define JOYCAPS_HASR 0x0002
+#define JOYCAPS_HASU 0x0004
+#define JOYCAPS_HASV 0x0008
+#define JOYCAPS_HASPOV 0x0010
+#define JOYCAPS_POV4DIR 0x0020
+#define JOYCAPS_POVCTS 0x0040
+
+  typedef struct tagJOYCAPSA {
+    WORD wMid;
+    WORD wPid;
+    CHAR szPname[MAXPNAMELEN];
+    UINT wXmin;
+    UINT wXmax;
+    UINT wYmin;
+    UINT wYmax;
+    UINT wZmin;
+    UINT wZmax;
+    UINT wNumButtons;
+    UINT wPeriodMin;
+    UINT wPeriodMax;
+    UINT wRmin;
+    UINT wRmax;
+    UINT wUmin;
+    UINT wUmax;
+    UINT wVmin;
+    UINT wVmax;
+    UINT wCaps;
+    UINT wMaxAxes;
+    UINT wNumAxes;
+    UINT wMaxButtons;
+    CHAR szRegKey[MAXPNAMELEN];
+    CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+  } JOYCAPSA,*PJOYCAPSA,*NPJOYCAPSA,*LPJOYCAPSA;
+
+  typedef struct tagJOYCAPSW {
+    WORD wMid;
+    WORD wPid;
+    WCHAR szPname[MAXPNAMELEN];
+    UINT wXmin;
+    UINT wXmax;
+    UINT wYmin;
+    UINT wYmax;
+    UINT wZmin;
+    UINT wZmax;
+    UINT wNumButtons;
+    UINT wPeriodMin;
+    UINT wPeriodMax;
+    UINT wRmin;
+    UINT wRmax;
+    UINT wUmin;
+    UINT wUmax;
+    UINT wVmin;
+    UINT wVmax;
+    UINT wCaps;
+    UINT wMaxAxes;
+    UINT wNumAxes;
+    UINT wMaxButtons;
+    WCHAR szRegKey[MAXPNAMELEN];
+    WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+  } JOYCAPSW,*PJOYCAPSW,*NPJOYCAPSW,*LPJOYCAPSW;
+#ifdef UNICODE
+  typedef JOYCAPSW JOYCAPS;
+  typedef PJOYCAPSW PJOYCAPS;
+  typedef NPJOYCAPSW NPJOYCAPS;
+  typedef LPJOYCAPSW LPJOYCAPS;
+#else
+  typedef JOYCAPSA JOYCAPS;
+  typedef PJOYCAPSA PJOYCAPS;
+  typedef NPJOYCAPSA NPJOYCAPS;
+  typedef LPJOYCAPSA LPJOYCAPS;
+#endif
+  typedef struct tagJOYCAPS2A {
+    WORD wMid;
+    WORD wPid;
+    CHAR szPname[MAXPNAMELEN];
+    UINT wXmin;
+    UINT wXmax;
+    UINT wYmin;
+    UINT wYmax;
+    UINT wZmin;
+    UINT wZmax;
+    UINT wNumButtons;
+    UINT wPeriodMin;
+    UINT wPeriodMax;
+    UINT wRmin;
+    UINT wRmax;
+    UINT wUmin;
+    UINT wUmax;
+    UINT wVmin;
+    UINT wVmax;
+    UINT wCaps;
+    UINT wMaxAxes;
+    UINT wNumAxes;
+    UINT wMaxButtons;
+    CHAR szRegKey[MAXPNAMELEN];
+    CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } JOYCAPS2A,*PJOYCAPS2A,*NPJOYCAPS2A,*LPJOYCAPS2A;
+
+  typedef struct tagJOYCAPS2W {
+    WORD wMid;
+    WORD wPid;
+    WCHAR szPname[MAXPNAMELEN];
+    UINT wXmin;
+    UINT wXmax;
+    UINT wYmin;
+    UINT wYmax;
+    UINT wZmin;
+    UINT wZmax;
+    UINT wNumButtons;
+    UINT wPeriodMin;
+    UINT wPeriodMax;
+    UINT wRmin;
+    UINT wRmax;
+    UINT wUmin;
+    UINT wUmax;
+    UINT wVmin;
+    UINT wVmax;
+    UINT wCaps;
+    UINT wMaxAxes;
+    UINT wNumAxes;
+    UINT wMaxButtons;
+    WCHAR szRegKey[MAXPNAMELEN];
+    WCHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME];
+    GUID ManufacturerGuid;
+    GUID ProductGuid;
+    GUID NameGuid;
+  } JOYCAPS2W,*PJOYCAPS2W,*NPJOYCAPS2W,*LPJOYCAPS2W;
+#ifdef UNICODE
+  typedef JOYCAPS2W JOYCAPS2;
+  typedef PJOYCAPS2W PJOYCAPS2;
+  typedef NPJOYCAPS2W NPJOYCAPS2;
+  typedef LPJOYCAPS2W LPJOYCAPS2;
+#else
+  typedef JOYCAPS2A JOYCAPS2;
+  typedef PJOYCAPS2A PJOYCAPS2;
+  typedef NPJOYCAPS2A NPJOYCAPS2;
+  typedef LPJOYCAPS2A LPJOYCAPS2;
+#endif
+
+  typedef struct joyinfo_tag {
+    UINT wXpos;
+    UINT wYpos;
+    UINT wZpos;
+    UINT wButtons;
+  } JOYINFO,*PJOYINFO,NEAR *NPJOYINFO,*LPJOYINFO;
+
+  typedef struct joyinfoex_tag {
+    DWORD dwSize;
+    DWORD dwFlags;
+    DWORD dwXpos;
+    DWORD dwYpos;
+    DWORD dwZpos;
+    DWORD dwRpos;
+    DWORD dwUpos;
+    DWORD dwVpos;
+    DWORD dwButtons;
+    DWORD dwButtonNumber;
+    DWORD dwPOV;
+    DWORD dwReserved1;
+    DWORD dwReserved2;
+  } JOYINFOEX,*PJOYINFOEX,NEAR *NPJOYINFOEX,*LPJOYINFOEX;
+
+  WINMMAPI UINT WINAPI joyGetNumDevs(void);
+  WINMMAPI MMRESULT WINAPI joyGetDevCapsA(UINT_PTR uJoyID,LPJOYCAPSA pjc,UINT cbjc);
+  WINMMAPI MMRESULT WINAPI joyGetDevCapsW(UINT_PTR uJoyID,LPJOYCAPSW pjc,UINT cbjc);
+#ifdef UNICODE
+#define joyGetDevCaps joyGetDevCapsW
+#else
+#define joyGetDevCaps joyGetDevCapsA
+#endif
+  WINMMAPI MMRESULT WINAPI joyGetPos(UINT uJoyID,LPJOYINFO pji);
+  WINMMAPI MMRESULT WINAPI joyGetPosEx(UINT uJoyID,LPJOYINFOEX pji);
+  WINMMAPI MMRESULT WINAPI joyGetThreshold(UINT uJoyID,LPUINT puThreshold);
+  WINMMAPI MMRESULT WINAPI joyReleaseCapture(UINT uJoyID);
+  WINMMAPI MMRESULT WINAPI joySetCapture(HWND hwnd,UINT uJoyID,UINT uPeriod,WINBOOL fChanged);
+  WINMMAPI MMRESULT WINAPI joySetThreshold(UINT uJoyID,UINT uThreshold);
+#endif
+
+#ifndef MMNOMMIO
+
+#define MMIOERR_BASE 256
+#define MMIOERR_FILENOTFOUND (MMIOERR_BASE + 1)
+#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE + 2)
+#define MMIOERR_CANNOTOPEN (MMIOERR_BASE + 3)
+#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE + 4)
+#define MMIOERR_CANNOTREAD (MMIOERR_BASE + 5)
+#define MMIOERR_CANNOTWRITE (MMIOERR_BASE + 6)
+#define MMIOERR_CANNOTSEEK (MMIOERR_BASE + 7)
+#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8)
+#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9)
+#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10)
+#define MMIOERR_PATHNOTFOUND (MMIOERR_BASE + 11)
+#define MMIOERR_ACCESSDENIED (MMIOERR_BASE + 12)
+#define MMIOERR_SHARINGVIOLATION (MMIOERR_BASE + 13)
+#define MMIOERR_NETWORKERROR (MMIOERR_BASE + 14)
+#define MMIOERR_TOOMANYOPENFILES (MMIOERR_BASE + 15)
+#define MMIOERR_INVALIDFILE (MMIOERR_BASE + 16)
+
+#define CFSEPCHAR '+'
+
+  typedef DWORD FOURCC;
+  typedef char _huge *HPSTR;
+  DECLARE_HANDLE(HMMIO);
+  typedef LRESULT (CALLBACK MMIOPROC)(LPSTR lpmmioinfo,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
+  typedef MMIOPROC *LPMMIOPROC;
+
+  typedef struct _MMIOINFO {
+    DWORD dwFlags;
+    FOURCC fccIOProc;
+    LPMMIOPROC pIOProc;
+    UINT wErrorRet;
+    HTASK htask;
+    LONG cchBuffer;
+    HPSTR pchBuffer;
+    HPSTR pchNext;
+    HPSTR pchEndRead;
+    HPSTR pchEndWrite;
+    LONG lBufOffset;
+    LONG lDiskOffset;
+    DWORD adwInfo[3];
+    DWORD dwReserved1;
+    DWORD dwReserved2;
+    HMMIO hmmio;
+  } MMIOINFO,*PMMIOINFO,NEAR *NPMMIOINFO,*LPMMIOINFO;
+
+  typedef const MMIOINFO *LPCMMIOINFO;
+
+  typedef struct _MMCKINFO {
+    FOURCC ckid;
+    DWORD cksize;
+    FOURCC fccType;
+    DWORD dwDataOffset;
+    DWORD dwFlags;
+  } MMCKINFO,*PMMCKINFO,NEAR *NPMMCKINFO,*LPMMCKINFO;
+
+  typedef const MMCKINFO *LPCMMCKINFO;
+
+#define MMIO_RWMODE 0x00000003
+#define MMIO_SHAREMODE 0x00000070
+
+#define MMIO_CREATE 0x00001000
+#define MMIO_PARSE 0x00000100
+#define MMIO_DELETE 0x00000200
+#define MMIO_EXIST 0x00004000
+#define MMIO_ALLOCBUF 0x00010000
+#define MMIO_GETTEMP 0x00020000
+
+#define MMIO_DIRTY 0x10000000
+
+#define MMIO_READ 0x00000000
+#define MMIO_WRITE 0x00000001
+#define MMIO_READWRITE 0x00000002
+
+#define MMIO_COMPAT 0x00000000
+#define MMIO_EXCLUSIVE 0x00000010
+#define MMIO_DENYWRITE 0x00000020
+#define MMIO_DENYREAD 0x00000030
+#define MMIO_DENYNONE 0x00000040
+
+#define MMIO_FHOPEN 0x0010
+#define MMIO_EMPTYBUF 0x0010
+#define MMIO_TOUPPER 0x0010
+#define MMIO_INSTALLPROC 0x00010000
+#define MMIO_GLOBALPROC 0x10000000
+#define MMIO_REMOVEPROC 0x00020000
+#define MMIO_UNICODEPROC 0x01000000
+#define MMIO_FINDPROC 0x00040000
+#define MMIO_FINDCHUNK 0x0010
+#define MMIO_FINDRIFF 0x0020
+#define MMIO_FINDLIST 0x0040
+#define MMIO_CREATERIFF 0x0020
+#define MMIO_CREATELIST 0x0040
+
+#define MMIOM_READ MMIO_READ
+#define MMIOM_WRITE MMIO_WRITE
+#define MMIOM_SEEK 2
+#define MMIOM_OPEN 3
+#define MMIOM_CLOSE 4
+#define MMIOM_WRITEFLUSH 5
+#define MMIOM_RENAME 6
+
+#define MMIOM_USER 0x8000
+
+#define FOURCC_RIFF mmioFOURCC('R','I','F','F')
+#define FOURCC_LIST mmioFOURCC('L','I','S','T')
+
+#define FOURCC_DOS mmioFOURCC('D','O','S',' ')
+#define FOURCC_MEM mmioFOURCC('M','E','M',' ')
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#define SEEK_CUR 1
+#define SEEK_END 2
+#endif
+
+#define MMIO_DEFAULTBUFFER 8192
+
+#define mmioFOURCC(ch0,ch1,ch2,ch3) MAKEFOURCC(ch0,ch1,ch2,ch3)
+
+  WINMMAPI FOURCC WINAPI mmioStringToFOURCCA(LPCSTR sz,UINT uFlags);
+  WINMMAPI FOURCC WINAPI mmioStringToFOURCCW(LPCWSTR sz,UINT uFlags);
+#ifdef UNICODE
+#define mmioStringToFOURCC mmioStringToFOURCCW
+#else
+#define mmioStringToFOURCC mmioStringToFOURCCA
+#endif
+  WINMMAPI LPMMIOPROC WINAPI mmioInstallIOProcA(FOURCC fccIOProc,LPMMIOPROC pIOProc,DWORD dwFlags);
+  WINMMAPI LPMMIOPROC WINAPI mmioInstallIOProcW(FOURCC fccIOProc,LPMMIOPROC pIOProc,DWORD dwFlags);
+#ifdef UNICODE
+#define mmioInstallIOProc mmioInstallIOProcW
+#else
+#define mmioInstallIOProc mmioInstallIOProcA
+#endif
+  WINMMAPI HMMIO WINAPI mmioOpenA(LPSTR pszFileName,LPMMIOINFO pmmioinfo,DWORD fdwOpen);
+  WINMMAPI HMMIO WINAPI mmioOpenW(LPWSTR pszFileName,LPMMIOINFO pmmioinfo,DWORD fdwOpen);
+#ifdef UNICODE
+#define mmioOpen mmioOpenW
+#else
+#define mmioOpen mmioOpenA
+#endif
+  WINMMAPI MMRESULT WINAPI mmioRenameA(LPCSTR pszFileName,LPCSTR pszNewFileName,LPCMMIOINFO pmmioinfo,DWORD fdwRename);
+  WINMMAPI MMRESULT WINAPI mmioRenameW(LPCWSTR pszFileName,LPCWSTR pszNewFileName,LPCMMIOINFO pmmioinfo,DWORD fdwRename);
+#ifdef UNICODE
+#define mmioRename mmioRenameW
+#else
+#define mmioRename mmioRenameA
+#endif
+
+  WINMMAPI MMRESULT WINAPI mmioClose(HMMIO hmmio,UINT fuClose);
+  WINMMAPI LONG WINAPI mmioRead(HMMIO hmmio,HPSTR pch,LONG cch);
+  WINMMAPI LONG WINAPI mmioWrite(HMMIO hmmio,const char _huge *pch,LONG cch);
+  WINMMAPI LONG WINAPI mmioSeek(HMMIO hmmio,LONG lOffset,int iOrigin);
+  WINMMAPI MMRESULT WINAPI mmioGetInfo(HMMIO hmmio,LPMMIOINFO pmmioinfo,UINT fuInfo);
+  WINMMAPI MMRESULT WINAPI mmioSetInfo(HMMIO hmmio,LPCMMIOINFO pmmioinfo,UINT fuInfo);
+  WINMMAPI MMRESULT WINAPI mmioSetBuffer(HMMIO hmmio,LPSTR pchBuffer,LONG cchBuffer,UINT fuBuffer);
+  WINMMAPI MMRESULT WINAPI mmioFlush(HMMIO hmmio,UINT fuFlush);
+  WINMMAPI MMRESULT WINAPI mmioAdvance(HMMIO hmmio,LPMMIOINFO pmmioinfo,UINT fuAdvance);
+  WINMMAPI LRESULT WINAPI mmioSendMessage(HMMIO hmmio,UINT uMsg,LPARAM lParam1,LPARAM lParam2);
+  WINMMAPI MMRESULT WINAPI mmioDescend(HMMIO hmmio,LPMMCKINFO pmmcki,const MMCKINFO *pmmckiParent,UINT fuDescend);
+  WINMMAPI MMRESULT WINAPI mmioAscend(HMMIO hmmio,LPMMCKINFO pmmcki,UINT fuAscend);
+  WINMMAPI MMRESULT WINAPI mmioCreateChunk(HMMIO hmmio,LPMMCKINFO pmmcki,UINT fuCreate);
+#endif
+
+#ifndef MMNOMCI
+
+#ifndef _MCIERROR_
+#define _MCIERROR_
+  typedef DWORD MCIERROR;
+#endif
+
+#ifndef _MCIDEVICEID_
+#define _MCIDEVICEID_
+  typedef UINT MCIDEVICEID;
+#endif
+
+  typedef UINT (CALLBACK *YIELDPROC)(MCIDEVICEID mciId,DWORD dwYieldData);
+
+  WINMMAPI MCIERROR WINAPI mciSendCommandA(MCIDEVICEID mciId,UINT uMsg,DWORD_PTR dwParam1,DWORD_PTR dwParam2);
+  WINMMAPI MCIERROR WINAPI mciSendCommandW(MCIDEVICEID mciId,UINT uMsg,DWORD_PTR dwParam1,DWORD_PTR dwParam2);
+#ifdef UNICODE
+#define mciSendCommand mciSendCommandW
+#else
+#define mciSendCommand mciSendCommandA
+#endif
+  WINMMAPI MCIERROR WINAPI mciSendStringA(LPCSTR lpstrCommand,LPSTR lpstrReturnString,UINT uReturnLength,HWND hwndCallback);
+  WINMMAPI MCIERROR WINAPI mciSendStringW(LPCWSTR lpstrCommand,LPWSTR lpstrReturnString,UINT uReturnLength,HWND hwndCallback);
+#ifdef UNICODE
+#define mciSendString mciSendStringW
+#else
+#define mciSendString mciSendStringA
+#endif
+  WINMMAPI MCIDEVICEID WINAPI mciGetDeviceIDA(LPCSTR pszDevice);
+  WINMMAPI MCIDEVICEID WINAPI mciGetDeviceIDW(LPCWSTR pszDevice);
+#ifdef UNICODE
+#define mciGetDeviceID mciGetDeviceIDW
+#else
+#define mciGetDeviceID mciGetDeviceIDA
+#endif
+  WINMMAPI MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDA(DWORD dwElementID,LPCSTR lpstrType);
+  WINMMAPI MCIDEVICEID WINAPI mciGetDeviceIDFromElementIDW(DWORD dwElementID,LPCWSTR lpstrType);
+#ifdef UNICODE
+#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDW
+#else
+#define mciGetDeviceIDFromElementID mciGetDeviceIDFromElementIDA
+#endif
+  WINMMAPI WINBOOL WINAPI mciGetErrorStringA(MCIERROR mcierr,LPSTR pszText,UINT cchText);
+  WINMMAPI WINBOOL WINAPI mciGetErrorStringW(MCIERROR mcierr,LPWSTR pszText,UINT cchText);
+#ifdef UNICODE
+#define mciGetErrorString mciGetErrorStringW
+#else
+#define mciGetErrorString mciGetErrorStringA
+#endif
+
+  WINMMAPI WINBOOL WINAPI mciSetYieldProc(MCIDEVICEID mciId,YIELDPROC fpYieldProc,DWORD dwYieldData);
+  WINMMAPI HTASK WINAPI mciGetCreatorTask(MCIDEVICEID mciId);
+  WINMMAPI YIELDPROC WINAPI mciGetYieldProc(MCIDEVICEID mciId,LPDWORD pdwYieldData);
+
+#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE + 1)
+#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE + 3)
+#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE + 5)
+#define MCIERR_HARDWARE (MCIERR_BASE + 6)
+#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE + 7)
+#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE + 8)
+#define MCIERR_DEVICE_OPEN (MCIERR_BASE + 9)
+#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE + 10)
+#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE + 11)
+#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE + 12)
+#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE + 13)
+#define MCIERR_BAD_INTEGER (MCIERR_BASE + 14)
+#define MCIERR_PARSER_INTERNAL (MCIERR_BASE + 15)
+#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE + 16)
+#define MCIERR_MISSING_PARAMETER (MCIERR_BASE + 17)
+#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE + 18)
+#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE + 19)
+#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE + 20)
+#define MCIERR_INTERNAL (MCIERR_BASE + 21)
+#define MCIERR_DRIVER (MCIERR_BASE + 22)
+#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE + 23)
+#define MCIERR_MULTIPLE (MCIERR_BASE + 24)
+#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE + 25)
+#define MCIERR_OUTOFRANGE (MCIERR_BASE + 26)
+#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE + 28)
+#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE + 30)
+#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE + 31)
+#define MCIERR_DEVICE_LOCKED (MCIERR_BASE + 32)
+#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE + 33)
+#define MCIERR_BAD_CONSTANT (MCIERR_BASE + 34)
+#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE + 35)
+#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE + 36)
+#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE + 37)
+#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE + 38)
+#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE + 39)
+#define MCIERR_INVALID_FILE (MCIERR_BASE + 40)
+#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE + 41)
+#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE + 42)
+#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE + 43)
+#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE + 44)
+#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE + 45)
+#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE + 46)
+#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE + 47)
+#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE + 48)
+#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE + 49)
+#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE + 50)
+#define MCIERR_GET_CD (MCIERR_BASE + 51)
+#define MCIERR_SET_CD (MCIERR_BASE + 52)
+#define MCIERR_SET_DRIVE (MCIERR_BASE + 53)
+#define MCIERR_DEVICE_LENGTH (MCIERR_BASE + 54)
+#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE + 55)
+#define MCIERR_NO_INTEGER (MCIERR_BASE + 56)
+#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE + 64)
+#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE + 65)
+#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE + 66)
+#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE + 67)
+#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE + 68)
+#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE + 69)
+#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE + 70)
+#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE + 71)
+#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE + 72)
+#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE + 73)
+#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80)
+#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81)
+#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82)
+#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83)
+#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84)
+#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85)
+#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86)
+#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87)
+#define MCIERR_NO_WINDOW (MCIERR_BASE + 90)
+#define MCIERR_CREATEWINDOW (MCIERR_BASE + 91)
+#define MCIERR_FILE_READ (MCIERR_BASE + 92)
+#define MCIERR_FILE_WRITE (MCIERR_BASE + 93)
+#define MCIERR_NO_IDENTITY (MCIERR_BASE + 94)
+#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE + 256)
+
+#define MCI_FIRST DRV_MCI_FIRST
+
+#define MCI_OPEN 0x0803
+#define MCI_CLOSE 0x0804
+#define MCI_ESCAPE 0x0805
+#define MCI_PLAY 0x0806
+#define MCI_SEEK 0x0807
+#define MCI_STOP 0x0808
+#define MCI_PAUSE 0x0809
+#define MCI_INFO 0x080A
+#define MCI_GETDEVCAPS 0x080B
+#define MCI_SPIN 0x080C
+#define MCI_SET 0x080D
+#define MCI_STEP 0x080E
+#define MCI_RECORD 0x080F
+#define MCI_SYSINFO 0x0810
+#define MCI_BREAK 0x0811
+#define MCI_SAVE 0x0813
+#define MCI_STATUS 0x0814
+#define MCI_CUE 0x0830
+#define MCI_REALIZE 0x0840
+#define MCI_WINDOW 0x0841
+#define MCI_PUT 0x0842
+#define MCI_WHERE 0x0843
+#define MCI_FREEZE 0x0844
+#define MCI_UNFREEZE 0x0845
+#define MCI_LOAD 0x0850
+#define MCI_CUT 0x0851
+#define MCI_COPY 0x0852
+#define MCI_PASTE 0x0853
+#define MCI_UPDATE 0x0854
+#define MCI_RESUME 0x0855
+#define MCI_DELETE 0x0856
+
+#define MCI_USER_MESSAGES (DRV_MCI_FIRST + 0x400)
+#define MCI_LAST 0x0FFF
+
+#define MCI_ALL_DEVICE_ID ((MCIDEVICEID)-1)
+
+#define MCI_DEVTYPE_VCR 513
+#define MCI_DEVTYPE_VIDEODISC 514
+#define MCI_DEVTYPE_OVERLAY 515
+#define MCI_DEVTYPE_CD_AUDIO 516
+#define MCI_DEVTYPE_DAT 517
+#define MCI_DEVTYPE_SCANNER 518
+#define MCI_DEVTYPE_ANIMATION 519
+#define MCI_DEVTYPE_DIGITAL_VIDEO 520
+#define MCI_DEVTYPE_OTHER 521
+#define MCI_DEVTYPE_WAVEFORM_AUDIO 522
+#define MCI_DEVTYPE_SEQUENCER 523
+
+#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR
+#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER
+
+#define MCI_DEVTYPE_FIRST_USER 0x1000
+
+#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12)
+#define MCI_MODE_STOP (MCI_STRING_OFFSET + 13)
+#define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14)
+#define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15)
+#define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16)
+#define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17)
+#define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18)
+
+#define MCI_FORMAT_MILLISECONDS 0
+#define MCI_FORMAT_HMS 1
+#define MCI_FORMAT_MSF 2
+#define MCI_FORMAT_FRAMES 3
+#define MCI_FORMAT_SMPTE_24 4
+#define MCI_FORMAT_SMPTE_25 5
+#define MCI_FORMAT_SMPTE_30 6
+#define MCI_FORMAT_SMPTE_30DROP 7
+#define MCI_FORMAT_BYTES 8
+#define MCI_FORMAT_SAMPLES 9
+#define MCI_FORMAT_TMSF 10
+
+#define MCI_MSF_MINUTE(msf) ((BYTE)(msf))
+#define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8))
+#define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16))
+
+#define MCI_MAKE_MSF(m,s,f) ((DWORD)(((BYTE)(m) | ((WORD)(s)<<8)) | (((DWORD)(BYTE)(f))<<16)))
+
+#define MCI_TMSF_TRACK(tmsf) ((BYTE)(tmsf))
+#define MCI_TMSF_MINUTE(tmsf) ((BYTE)(((WORD)(tmsf)) >> 8))
+#define MCI_TMSF_SECOND(tmsf) ((BYTE)((tmsf)>>16))
+#define MCI_TMSF_FRAME(tmsf) ((BYTE)((tmsf)>>24))
+
+#define MCI_MAKE_TMSF(t,m,s,f) ((DWORD)(((BYTE)(t) | ((WORD)(m)<<8)) | (((DWORD)(BYTE)(s) | ((WORD)(f)<<8))<<16)))
+
+#define MCI_HMS_HOUR(hms) ((BYTE)(hms))
+#define MCI_HMS_MINUTE(hms) ((BYTE)(((WORD)(hms)) >> 8))
+#define MCI_HMS_SECOND(hms) ((BYTE)((hms)>>16))
+
+#define MCI_MAKE_HMS(h,m,s) ((DWORD)(((BYTE)(h) | ((WORD)(m)<<8)) | (((DWORD)(BYTE)(s))<<16)))
+
+#define MCI_NOTIFY_SUCCESSFUL 0x0001
+#define MCI_NOTIFY_SUPERSEDED 0x0002
+#define MCI_NOTIFY_ABORTED 0x0004
+#define MCI_NOTIFY_FAILURE 0x0008
+
+#define MCI_NOTIFY 0x00000001L
+#define MCI_WAIT 0x00000002L
+#define MCI_FROM 0x00000004L
+#define MCI_TO 0x00000008L
+#define MCI_TRACK 0x00000010L
+
+#define MCI_OPEN_SHAREABLE 0x00000100L
+#define MCI_OPEN_ELEMENT 0x00000200L
+#define MCI_OPEN_ALIAS 0x00000400L
+#define MCI_OPEN_ELEMENT_ID 0x00000800L
+#define MCI_OPEN_TYPE_ID 0x00001000L
+#define MCI_OPEN_TYPE 0x00002000L
+
+#define MCI_SEEK_TO_START 0x00000100L
+#define MCI_SEEK_TO_END 0x00000200L
+
+#define MCI_STATUS_ITEM 0x00000100L
+#define MCI_STATUS_START 0x00000200L
+
+#define MCI_STATUS_LENGTH 0x00000001L
+#define MCI_STATUS_POSITION 0x00000002L
+#define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003L
+#define MCI_STATUS_MODE 0x00000004L
+#define MCI_STATUS_MEDIA_PRESENT 0x00000005L
+#define MCI_STATUS_TIME_FORMAT 0x00000006L
+#define MCI_STATUS_READY 0x00000007L
+#define MCI_STATUS_CURRENT_TRACK 0x00000008L
+
+#define MCI_INFO_PRODUCT 0x00000100L
+#define MCI_INFO_FILE 0x00000200L
+#define MCI_INFO_MEDIA_UPC 0x00000400L
+#define MCI_INFO_MEDIA_IDENTITY 0x00000800L
+#define MCI_INFO_NAME 0x00001000L
+#define MCI_INFO_COPYRIGHT 0x00002000L
+
+#define MCI_GETDEVCAPS_ITEM 0x00000100L
+
+#define MCI_GETDEVCAPS_CAN_RECORD 0x00000001L
+#define MCI_GETDEVCAPS_HAS_AUDIO 0x00000002L
+#define MCI_GETDEVCAPS_HAS_VIDEO 0x00000003L
+#define MCI_GETDEVCAPS_DEVICE_TYPE 0x00000004L
+#define MCI_GETDEVCAPS_USES_FILES 0x00000005L
+#define MCI_GETDEVCAPS_COMPOUND_DEVICE 0x00000006L
+#define MCI_GETDEVCAPS_CAN_EJECT 0x00000007L
+#define MCI_GETDEVCAPS_CAN_PLAY 0x00000008L
+#define MCI_GETDEVCAPS_CAN_SAVE 0x00000009L
+
+#define MCI_SYSINFO_QUANTITY 0x00000100L
+#define MCI_SYSINFO_OPEN 0x00000200L
+#define MCI_SYSINFO_NAME 0x00000400L
+#define MCI_SYSINFO_INSTALLNAME 0x00000800L
+
+#define MCI_SET_DOOR_OPEN 0x00000100L
+#define MCI_SET_DOOR_CLOSED 0x00000200L
+#define MCI_SET_TIME_FORMAT 0x00000400L
+#define MCI_SET_AUDIO 0x00000800L
+#define MCI_SET_VIDEO 0x00001000L
+#define MCI_SET_ON 0x00002000L
+#define MCI_SET_OFF 0x00004000L
+
+#define MCI_SET_AUDIO_ALL 0x00000000L
+#define MCI_SET_AUDIO_LEFT 0x00000001L
+#define MCI_SET_AUDIO_RIGHT 0x00000002L
+
+#define MCI_BREAK_KEY 0x00000100L
+#define MCI_BREAK_HWND 0x00000200L
+#define MCI_BREAK_OFF 0x00000400L
+
+#define MCI_RECORD_INSERT 0x00000100L
+#define MCI_RECORD_OVERWRITE 0x00000200L
+
+#define MCI_SAVE_FILE 0x00000100L
+
+#define MCI_LOAD_FILE 0x00000100L
+
+  typedef struct tagMCI_GENERIC_PARMS {
+    DWORD_PTR dwCallback;
+  } MCI_GENERIC_PARMS,*PMCI_GENERIC_PARMS,*LPMCI_GENERIC_PARMS;
+
+  typedef struct tagMCI_OPEN_PARMSA {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCSTR lpstrDeviceType;
+    LPCSTR lpstrElementName;
+    LPCSTR lpstrAlias;
+  } MCI_OPEN_PARMSA,*PMCI_OPEN_PARMSA,*LPMCI_OPEN_PARMSA;
+
+  typedef struct tagMCI_OPEN_PARMSW {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCWSTR lpstrDeviceType;
+    LPCWSTR lpstrElementName;
+    LPCWSTR lpstrAlias;
+  } MCI_OPEN_PARMSW,*PMCI_OPEN_PARMSW,*LPMCI_OPEN_PARMSW;
+#ifdef UNICODE
+  typedef MCI_OPEN_PARMSW MCI_OPEN_PARMS;
+  typedef PMCI_OPEN_PARMSW PMCI_OPEN_PARMS;
+  typedef LPMCI_OPEN_PARMSW LPMCI_OPEN_PARMS;
+#else
+  typedef MCI_OPEN_PARMSA MCI_OPEN_PARMS;
+  typedef PMCI_OPEN_PARMSA PMCI_OPEN_PARMS;
+  typedef LPMCI_OPEN_PARMSA LPMCI_OPEN_PARMS;
+#endif
+
+  typedef struct tagMCI_PLAY_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrom;
+    DWORD dwTo;
+  } MCI_PLAY_PARMS,*PMCI_PLAY_PARMS,*LPMCI_PLAY_PARMS;
+
+  typedef struct tagMCI_SEEK_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwTo;
+  } MCI_SEEK_PARMS,*PMCI_SEEK_PARMS,*LPMCI_SEEK_PARMS;
+
+  typedef struct tagMCI_STATUS_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD_PTR dwReturn;
+    DWORD dwItem;
+    DWORD dwTrack;
+  } MCI_STATUS_PARMS,*PMCI_STATUS_PARMS,*LPMCI_STATUS_PARMS;
+
+  typedef struct tagMCI_INFO_PARMSA {
+    DWORD_PTR dwCallback;
+    LPSTR lpstrReturn;
+    DWORD dwRetSize;
+  } MCI_INFO_PARMSA,*LPMCI_INFO_PARMSA;
+  typedef struct tagMCI_INFO_PARMSW {
+    DWORD_PTR dwCallback;
+    LPWSTR lpstrReturn;
+    DWORD dwRetSize;
+  } MCI_INFO_PARMSW,*LPMCI_INFO_PARMSW;
+#ifdef UNICODE
+  typedef MCI_INFO_PARMSW MCI_INFO_PARMS;
+  typedef LPMCI_INFO_PARMSW LPMCI_INFO_PARMS;
+#else
+  typedef MCI_INFO_PARMSA MCI_INFO_PARMS;
+  typedef LPMCI_INFO_PARMSA LPMCI_INFO_PARMS;
+#endif
+
+  typedef struct tagMCI_GETDEVCAPS_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwReturn;
+    DWORD dwItem;
+  } MCI_GETDEVCAPS_PARMS,*PMCI_GETDEVCAPS_PARMS,*LPMCI_GETDEVCAPS_PARMS;
+
+  typedef struct tagMCI_SYSINFO_PARMSA {
+    DWORD_PTR dwCallback;
+    LPSTR lpstrReturn;
+    DWORD dwRetSize;
+    DWORD dwNumber;
+    UINT wDeviceType;
+  } MCI_SYSINFO_PARMSA,*PMCI_SYSINFO_PARMSA,*LPMCI_SYSINFO_PARMSA;
+
+  typedef struct tagMCI_SYSINFO_PARMSW {
+    DWORD_PTR dwCallback;
+    LPWSTR lpstrReturn;
+    DWORD dwRetSize;
+    DWORD dwNumber;
+    UINT wDeviceType;
+  } MCI_SYSINFO_PARMSW,*PMCI_SYSINFO_PARMSW,*LPMCI_SYSINFO_PARMSW;
+#ifdef UNICODE
+  typedef MCI_SYSINFO_PARMSW MCI_SYSINFO_PARMS;
+  typedef PMCI_SYSINFO_PARMSW PMCI_SYSINFO_PARMS;
+  typedef LPMCI_SYSINFO_PARMSW LPMCI_SYSINFO_PARMS;
+#else
+  typedef MCI_SYSINFO_PARMSA MCI_SYSINFO_PARMS;
+  typedef PMCI_SYSINFO_PARMSA PMCI_SYSINFO_PARMS;
+  typedef LPMCI_SYSINFO_PARMSA LPMCI_SYSINFO_PARMS;
+#endif
+
+  typedef struct tagMCI_SET_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwTimeFormat;
+    DWORD dwAudio;
+  } MCI_SET_PARMS,*PMCI_SET_PARMS,*LPMCI_SET_PARMS;
+
+  typedef struct tagMCI_BREAK_PARMS {
+    DWORD_PTR dwCallback;
+    int nVirtKey;
+    HWND hwndBreak;
+  } MCI_BREAK_PARMS,*PMCI_BREAK_PARMS,*LPMCI_BREAK_PARMS;
+
+  typedef struct tagMCI_SAVE_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR lpfilename;
+  } MCI_SAVE_PARMSA,*PMCI_SAVE_PARMSA,*LPMCI_SAVE_PARMSA;
+  typedef struct tagMCI_SAVE_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR lpfilename;
+  } MCI_SAVE_PARMSW,*PMCI_SAVE_PARMSW,*LPMCI_SAVE_PARMSW;
+#ifdef UNICODE
+  typedef MCI_SAVE_PARMSW MCI_SAVE_PARMS;
+  typedef PMCI_SAVE_PARMSW PMCI_SAVE_PARMS;
+  typedef LPMCI_SAVE_PARMSW LPMCI_SAVE_PARMS;
+#else
+  typedef MCI_SAVE_PARMSA MCI_SAVE_PARMS;
+  typedef PMCI_SAVE_PARMSA PMCI_SAVE_PARMS;
+  typedef LPMCI_SAVE_PARMSA LPMCI_SAVE_PARMS;
+#endif
+
+  typedef struct tagMCI_LOAD_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR lpfilename;
+  } MCI_LOAD_PARMSA,*PMCI_LOAD_PARMSA,*LPMCI_LOAD_PARMSA;
+  typedef struct tagMCI_LOAD_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR lpfilename;
+  } MCI_LOAD_PARMSW,*PMCI_LOAD_PARMSW,*LPMCI_LOAD_PARMSW;
+#ifdef UNICODE
+  typedef MCI_LOAD_PARMSW MCI_LOAD_PARMS;
+  typedef PMCI_LOAD_PARMSW PMCI_LOAD_PARMS;
+  typedef LPMCI_LOAD_PARMSW LPMCI_LOAD_PARMS;
+#else
+  typedef MCI_LOAD_PARMSA MCI_LOAD_PARMS;
+  typedef PMCI_LOAD_PARMSA PMCI_LOAD_PARMS;
+  typedef LPMCI_LOAD_PARMSA LPMCI_LOAD_PARMS;
+#endif
+
+  typedef struct tagMCI_RECORD_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrom;
+    DWORD dwTo;
+  } MCI_RECORD_PARMS,*LPMCI_RECORD_PARMS;
+
+#define MCI_VD_MODE_PARK (MCI_VD_OFFSET + 1)
+
+#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET + 2)
+#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET + 3)
+#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET + 4)
+
+#define MCI_VD_FORMAT_TRACK 0x4001
+
+#define MCI_VD_PLAY_REVERSE 0x00010000L
+#define MCI_VD_PLAY_FAST 0x00020000L
+#define MCI_VD_PLAY_SPEED 0x00040000L
+#define MCI_VD_PLAY_SCAN 0x00080000L
+#define MCI_VD_PLAY_SLOW 0x00100000L
+
+#define MCI_VD_SEEK_REVERSE 0x00010000L
+
+#define MCI_VD_STATUS_SPEED 0x00004002L
+#define MCI_VD_STATUS_FORWARD 0x00004003L
+#define MCI_VD_STATUS_MEDIA_TYPE 0x00004004L
+#define MCI_VD_STATUS_SIDE 0x00004005L
+#define MCI_VD_STATUS_DISC_SIZE 0x00004006L
+
+#define MCI_VD_GETDEVCAPS_CLV 0x00010000L
+#define MCI_VD_GETDEVCAPS_CAV 0x00020000L
+
+#define MCI_VD_SPIN_UP 0x00010000L
+#define MCI_VD_SPIN_DOWN 0x00020000L
+
+#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x00004002L
+#define MCI_VD_GETDEVCAPS_FAST_RATE 0x00004003L
+#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x00004004L
+#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x00004005L
+
+#define MCI_VD_STEP_FRAMES 0x00010000L
+#define MCI_VD_STEP_REVERSE 0x00020000L
+
+#define MCI_VD_ESCAPE_STRING 0x00000100L
+
+  typedef struct tagMCI_VD_PLAY_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrom;
+    DWORD dwTo;
+    DWORD dwSpeed;
+  } MCI_VD_PLAY_PARMS,*PMCI_VD_PLAY_PARMS,*LPMCI_VD_PLAY_PARMS;
+
+  typedef struct tagMCI_VD_STEP_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrames;
+  } MCI_VD_STEP_PARMS,*PMCI_VD_STEP_PARMS,*LPMCI_VD_STEP_PARMS;
+
+  typedef struct tagMCI_VD_ESCAPE_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR lpstrCommand;
+  } MCI_VD_ESCAPE_PARMSA,*PMCI_VD_ESCAPE_PARMSA,*LPMCI_VD_ESCAPE_PARMSA;
+  typedef struct tagMCI_VD_ESCAPE_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR lpstrCommand;
+  } MCI_VD_ESCAPE_PARMSW,*PMCI_VD_ESCAPE_PARMSW,*LPMCI_VD_ESCAPE_PARMSW;
+#ifdef UNICODE
+  typedef MCI_VD_ESCAPE_PARMSW MCI_VD_ESCAPE_PARMS;
+  typedef PMCI_VD_ESCAPE_PARMSW PMCI_VD_ESCAPE_PARMS;
+  typedef LPMCI_VD_ESCAPE_PARMSW LPMCI_VD_ESCAPE_PARMS;
+#else
+  typedef MCI_VD_ESCAPE_PARMSA MCI_VD_ESCAPE_PARMS;
+  typedef PMCI_VD_ESCAPE_PARMSA PMCI_VD_ESCAPE_PARMS;
+  typedef LPMCI_VD_ESCAPE_PARMSA LPMCI_VD_ESCAPE_PARMS;
+#endif
+
+#define MCI_CDA_STATUS_TYPE_TRACK 0x00004001L
+#define MCI_CDA_TRACK_AUDIO (MCI_CD_OFFSET + 0)
+#define MCI_CDA_TRACK_OTHER (MCI_CD_OFFSET + 1)
+
+#define MCI_WAVE_PCM (MCI_WAVE_OFFSET + 0)
+#define MCI_WAVE_MAPPER (MCI_WAVE_OFFSET + 1)
+
+#define MCI_WAVE_OPEN_BUFFER 0x00010000L
+
+#define MCI_WAVE_SET_FORMATTAG 0x00010000L
+#define MCI_WAVE_SET_CHANNELS 0x00020000L
+#define MCI_WAVE_SET_SAMPLESPERSEC 0x00040000L
+#define MCI_WAVE_SET_AVGBYTESPERSEC 0x00080000L
+#define MCI_WAVE_SET_BLOCKALIGN 0x00100000L
+#define MCI_WAVE_SET_BITSPERSAMPLE 0x00200000L
+
+#define MCI_WAVE_INPUT 0x00400000L
+#define MCI_WAVE_OUTPUT 0x00800000L
+
+#define MCI_WAVE_STATUS_FORMATTAG 0x00004001L
+#define MCI_WAVE_STATUS_CHANNELS 0x00004002L
+#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x00004003L
+#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x00004004L
+#define MCI_WAVE_STATUS_BLOCKALIGN 0x00004005L
+#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x00004006L
+#define MCI_WAVE_STATUS_LEVEL 0x00004007L
+
+#define MCI_WAVE_SET_ANYINPUT 0x04000000L
+#define MCI_WAVE_SET_ANYOUTPUT 0x08000000L
+
+#define MCI_WAVE_GETDEVCAPS_INPUTS 0x00004001L
+#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x00004002L
+
+  typedef struct tagMCI_WAVE_OPEN_PARMSA {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCSTR lpstrDeviceType;
+    LPCSTR lpstrElementName;
+    LPCSTR lpstrAlias;
+    DWORD dwBufferSeconds;
+  } MCI_WAVE_OPEN_PARMSA,*PMCI_WAVE_OPEN_PARMSA,*LPMCI_WAVE_OPEN_PARMSA;
+
+  typedef struct tagMCI_WAVE_OPEN_PARMSW {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCWSTR lpstrDeviceType;
+    LPCWSTR lpstrElementName;
+    LPCWSTR lpstrAlias;
+    DWORD dwBufferSeconds;
+  } MCI_WAVE_OPEN_PARMSW,*PMCI_WAVE_OPEN_PARMSW,*LPMCI_WAVE_OPEN_PARMSW;
+#ifdef UNICODE
+  typedef MCI_WAVE_OPEN_PARMSW MCI_WAVE_OPEN_PARMS;
+  typedef PMCI_WAVE_OPEN_PARMSW PMCI_WAVE_OPEN_PARMS;
+  typedef LPMCI_WAVE_OPEN_PARMSW LPMCI_WAVE_OPEN_PARMS;
+#else
+  typedef MCI_WAVE_OPEN_PARMSA MCI_WAVE_OPEN_PARMS;
+  typedef PMCI_WAVE_OPEN_PARMSA PMCI_WAVE_OPEN_PARMS;
+  typedef LPMCI_WAVE_OPEN_PARMSA LPMCI_WAVE_OPEN_PARMS;
+#endif
+
+  typedef struct tagMCI_WAVE_DELETE_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrom;
+    DWORD dwTo;
+  } MCI_WAVE_DELETE_PARMS,*PMCI_WAVE_DELETE_PARMS,*LPMCI_WAVE_DELETE_PARMS;
+
+  typedef struct tagMCI_WAVE_SET_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwTimeFormat;
+    DWORD dwAudio;
+    UINT wInput;
+    UINT wOutput;
+    WORD wFormatTag;
+    WORD wReserved2;
+    WORD nChannels;
+    WORD wReserved3;
+    DWORD nSamplesPerSec;
+    DWORD nAvgBytesPerSec;
+    WORD nBlockAlign;
+    WORD wReserved4;
+    WORD wBitsPerSample;
+    WORD wReserved5;
+  } MCI_WAVE_SET_PARMS,*PMCI_WAVE_SET_PARMS,*LPMCI_WAVE_SET_PARMS;
+
+#define MCI_SEQ_DIV_PPQN (0 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_24 (1 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_25 (2 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30DROP (3 + MCI_SEQ_OFFSET)
+#define MCI_SEQ_DIV_SMPTE_30 (4 + MCI_SEQ_OFFSET)
+
+#define MCI_SEQ_FORMAT_SONGPTR 0x4001
+#define MCI_SEQ_FILE 0x4002
+#define MCI_SEQ_MIDI 0x4003
+#define MCI_SEQ_SMPTE 0x4004
+#define MCI_SEQ_NONE 65533
+#define MCI_SEQ_MAPPER 65535
+
+#define MCI_SEQ_STATUS_TEMPO 0x00004002L
+#define MCI_SEQ_STATUS_PORT 0x00004003L
+#define MCI_SEQ_STATUS_SLAVE 0x00004007L
+#define MCI_SEQ_STATUS_MASTER 0x00004008L
+#define MCI_SEQ_STATUS_OFFSET 0x00004009L
+#define MCI_SEQ_STATUS_DIVTYPE 0x0000400AL
+#define MCI_SEQ_STATUS_NAME 0x0000400BL
+#define MCI_SEQ_STATUS_COPYRIGHT 0x0000400CL
+
+#define MCI_SEQ_SET_TEMPO 0x00010000L
+#define MCI_SEQ_SET_PORT 0x00020000L
+#define MCI_SEQ_SET_SLAVE 0x00040000L
+#define MCI_SEQ_SET_MASTER 0x00080000L
+#define MCI_SEQ_SET_OFFSET 0x01000000L
+
+  typedef struct tagMCI_SEQ_SET_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwTimeFormat;
+    DWORD dwAudio;
+    DWORD dwTempo;
+    DWORD dwPort;
+    DWORD dwSlave;
+    DWORD dwMaster;
+    DWORD dwOffset;
+  } MCI_SEQ_SET_PARMS,*PMCI_SEQ_SET_PARMS,*LPMCI_SEQ_SET_PARMS;
+
+#define MCI_ANIM_OPEN_WS 0x00010000L
+#define MCI_ANIM_OPEN_PARENT 0x00020000L
+#define MCI_ANIM_OPEN_NOSTATIC 0x00040000L
+
+#define MCI_ANIM_PLAY_SPEED 0x00010000L
+#define MCI_ANIM_PLAY_REVERSE 0x00020000L
+#define MCI_ANIM_PLAY_FAST 0x00040000L
+#define MCI_ANIM_PLAY_SLOW 0x00080000L
+#define MCI_ANIM_PLAY_SCAN 0x00100000L
+
+#define MCI_ANIM_STEP_REVERSE 0x00010000L
+#define MCI_ANIM_STEP_FRAMES 0x00020000L
+
+#define MCI_ANIM_STATUS_SPEED 0x00004001L
+#define MCI_ANIM_STATUS_FORWARD 0x00004002L
+#define MCI_ANIM_STATUS_HWND 0x00004003L
+#define MCI_ANIM_STATUS_HPAL 0x00004004L
+#define MCI_ANIM_STATUS_STRETCH 0x00004005L
+
+#define MCI_ANIM_INFO_TEXT 0x00010000L
+
+#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x00004001L
+#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x00004002L
+#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x00004003L
+#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x00004004L
+#define MCI_ANIM_GETDEVCAPS_PALETTES 0x00004006L
+#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x00004007L
+#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x00004008L
+
+#define MCI_ANIM_REALIZE_NORM 0x00010000L
+#define MCI_ANIM_REALIZE_BKGD 0x00020000L
+
+#define MCI_ANIM_WINDOW_HWND 0x00010000L
+#define MCI_ANIM_WINDOW_STATE 0x00040000L
+#define MCI_ANIM_WINDOW_TEXT 0x00080000L
+#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x00200000L
+
+#define MCI_ANIM_WINDOW_DEFAULT 0x00000000L
+
+#define MCI_ANIM_RECT 0x00010000L
+#define MCI_ANIM_PUT_SOURCE 0x00020000L
+#define MCI_ANIM_PUT_DESTINATION 0x00040000L
+
+#define MCI_ANIM_WHERE_SOURCE 0x00020000L
+#define MCI_ANIM_WHERE_DESTINATION 0x00040000L
+
+#define MCI_ANIM_UPDATE_HDC 0x00020000L
+
+  typedef struct tagMCI_ANIM_OPEN_PARMSA {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCSTR lpstrDeviceType;
+    LPCSTR lpstrElementName;
+    LPCSTR lpstrAlias;
+    DWORD dwStyle;
+    HWND hWndParent;
+  } MCI_ANIM_OPEN_PARMSA,*PMCI_ANIM_OPEN_PARMSA,*LPMCI_ANIM_OPEN_PARMSA;
+
+  typedef struct tagMCI_ANIM_OPEN_PARMSW {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCWSTR lpstrDeviceType;
+    LPCWSTR lpstrElementName;
+    LPCWSTR lpstrAlias;
+    DWORD dwStyle;
+    HWND hWndParent;
+  } MCI_ANIM_OPEN_PARMSW,*PMCI_ANIM_OPEN_PARMSW,*LPMCI_ANIM_OPEN_PARMSW;
+#ifdef UNICODE
+  typedef MCI_ANIM_OPEN_PARMSW MCI_ANIM_OPEN_PARMS;
+  typedef PMCI_ANIM_OPEN_PARMSW PMCI_ANIM_OPEN_PARMS;
+  typedef LPMCI_ANIM_OPEN_PARMSW LPMCI_ANIM_OPEN_PARMS;
+#else
+  typedef MCI_ANIM_OPEN_PARMSA MCI_ANIM_OPEN_PARMS;
+  typedef PMCI_ANIM_OPEN_PARMSA PMCI_ANIM_OPEN_PARMS;
+  typedef LPMCI_ANIM_OPEN_PARMSA LPMCI_ANIM_OPEN_PARMS;
+#endif
+
+  typedef struct tagMCI_ANIM_PLAY_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrom;
+    DWORD dwTo;
+    DWORD dwSpeed;
+  } MCI_ANIM_PLAY_PARMS,*PMCI_ANIM_PLAY_PARMS,*LPMCI_ANIM_PLAY_PARMS;
+
+  typedef struct tagMCI_ANIM_STEP_PARMS {
+    DWORD_PTR dwCallback;
+    DWORD dwFrames;
+  } MCI_ANIM_STEP_PARMS,*PMCI_ANIM_STEP_PARMS,*LPMCI_ANIM_STEP_PARMS;
+
+  typedef struct tagMCI_ANIM_WINDOW_PARMSA {
+    DWORD_PTR dwCallback;
+    HWND hWnd;
+    UINT nCmdShow;
+    LPCSTR lpstrText;
+  } MCI_ANIM_WINDOW_PARMSA,*PMCI_ANIM_WINDOW_PARMSA,*LPMCI_ANIM_WINDOW_PARMSA;
+
+  typedef struct tagMCI_ANIM_WINDOW_PARMSW {
+    DWORD_PTR dwCallback;
+    HWND hWnd;
+    UINT nCmdShow;
+    LPCWSTR lpstrText;
+  } MCI_ANIM_WINDOW_PARMSW,*PMCI_ANIM_WINDOW_PARMSW,*LPMCI_ANIM_WINDOW_PARMSW;
+#ifdef UNICODE
+  typedef MCI_ANIM_WINDOW_PARMSW MCI_ANIM_WINDOW_PARMS;
+  typedef PMCI_ANIM_WINDOW_PARMSW PMCI_ANIM_WINDOW_PARMS;
+  typedef LPMCI_ANIM_WINDOW_PARMSW LPMCI_ANIM_WINDOW_PARMS;
+#else
+  typedef MCI_ANIM_WINDOW_PARMSA MCI_ANIM_WINDOW_PARMS;
+  typedef PMCI_ANIM_WINDOW_PARMSA PMCI_ANIM_WINDOW_PARMS;
+  typedef LPMCI_ANIM_WINDOW_PARMSA LPMCI_ANIM_WINDOW_PARMS;
+#endif
+
+  typedef struct tagMCI_ANIM_RECT_PARMS {
+    DWORD_PTR dwCallback;
+#ifdef MCI_USE_OFFEXT
+    POINT ptOffset;
+    POINT ptExtent;
+#else
+    RECT rc;
+#endif
+  } MCI_ANIM_RECT_PARMS;
+
+  typedef MCI_ANIM_RECT_PARMS *PMCI_ANIM_RECT_PARMS;
+  typedef MCI_ANIM_RECT_PARMS *LPMCI_ANIM_RECT_PARMS;
+
+  typedef struct tagMCI_ANIM_UPDATE_PARMS {
+    DWORD_PTR dwCallback;
+    RECT rc;
+    HDC hDC;
+  } MCI_ANIM_UPDATE_PARMS,*PMCI_ANIM_UPDATE_PARMS,*LPMCI_ANIM_UPDATE_PARMS;
+
+#define MCI_OVLY_OPEN_WS 0x00010000L
+#define MCI_OVLY_OPEN_PARENT 0x00020000L
+
+#define MCI_OVLY_STATUS_HWND 0x00004001L
+#define MCI_OVLY_STATUS_STRETCH 0x00004002L
+
+#define MCI_OVLY_INFO_TEXT 0x00010000L
+
+#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x00004001L
+#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x00004002L
+#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x00004003L
+
+#define MCI_OVLY_WINDOW_HWND 0x00010000L
+#define MCI_OVLY_WINDOW_STATE 0x00040000L
+#define MCI_OVLY_WINDOW_TEXT 0x00080000L
+#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x00100000L
+#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x00200000L
+
+#define MCI_OVLY_WINDOW_DEFAULT 0x00000000L
+
+#define MCI_OVLY_RECT 0x00010000L
+#define MCI_OVLY_PUT_SOURCE 0x00020000L
+#define MCI_OVLY_PUT_DESTINATION 0x00040000L
+#define MCI_OVLY_PUT_FRAME 0x00080000L
+#define MCI_OVLY_PUT_VIDEO 0x00100000L
+
+#define MCI_OVLY_WHERE_SOURCE 0x00020000L
+#define MCI_OVLY_WHERE_DESTINATION 0x00040000L
+#define MCI_OVLY_WHERE_FRAME 0x00080000L
+#define MCI_OVLY_WHERE_VIDEO 0x00100000L
+
+  typedef struct tagMCI_OVLY_OPEN_PARMSA {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCSTR lpstrDeviceType;
+    LPCSTR lpstrElementName;
+    LPCSTR lpstrAlias;
+    DWORD dwStyle;
+    HWND hWndParent;
+  } MCI_OVLY_OPEN_PARMSA,*PMCI_OVLY_OPEN_PARMSA,*LPMCI_OVLY_OPEN_PARMSA;
+
+  typedef struct tagMCI_OVLY_OPEN_PARMSW {
+    DWORD_PTR dwCallback;
+    MCIDEVICEID wDeviceID;
+    LPCWSTR lpstrDeviceType;
+    LPCWSTR lpstrElementName;
+    LPCWSTR lpstrAlias;
+    DWORD dwStyle;
+    HWND hWndParent;
+  } MCI_OVLY_OPEN_PARMSW,*PMCI_OVLY_OPEN_PARMSW,*LPMCI_OVLY_OPEN_PARMSW;
+#ifdef UNICODE
+  typedef MCI_OVLY_OPEN_PARMSW MCI_OVLY_OPEN_PARMS;
+  typedef PMCI_OVLY_OPEN_PARMSW PMCI_OVLY_OPEN_PARMS;
+  typedef LPMCI_OVLY_OPEN_PARMSW LPMCI_OVLY_OPEN_PARMS;
+#else
+  typedef MCI_OVLY_OPEN_PARMSA MCI_OVLY_OPEN_PARMS;
+  typedef PMCI_OVLY_OPEN_PARMSA PMCI_OVLY_OPEN_PARMS;
+  typedef LPMCI_OVLY_OPEN_PARMSA LPMCI_OVLY_OPEN_PARMS;
+#endif
+
+  typedef struct tagMCI_OVLY_WINDOW_PARMSA {
+    DWORD_PTR dwCallback;
+    HWND hWnd;
+    UINT nCmdShow;
+    LPCSTR lpstrText;
+  } MCI_OVLY_WINDOW_PARMSA,*PMCI_OVLY_WINDOW_PARMSA,*LPMCI_OVLY_WINDOW_PARMSA;
+
+  typedef struct tagMCI_OVLY_WINDOW_PARMSW {
+    DWORD_PTR dwCallback;
+    HWND hWnd;
+    UINT nCmdShow;
+    LPCWSTR lpstrText;
+  } MCI_OVLY_WINDOW_PARMSW,*PMCI_OVLY_WINDOW_PARMSW,*LPMCI_OVLY_WINDOW_PARMSW;
+#ifdef UNICODE
+  typedef MCI_OVLY_WINDOW_PARMSW MCI_OVLY_WINDOW_PARMS;
+  typedef PMCI_OVLY_WINDOW_PARMSW PMCI_OVLY_WINDOW_PARMS;
+  typedef LPMCI_OVLY_WINDOW_PARMSW LPMCI_OVLY_WINDOW_PARMS;
+#else
+  typedef MCI_OVLY_WINDOW_PARMSA MCI_OVLY_WINDOW_PARMS;
+  typedef PMCI_OVLY_WINDOW_PARMSA PMCI_OVLY_WINDOW_PARMS;
+  typedef LPMCI_OVLY_WINDOW_PARMSA LPMCI_OVLY_WINDOW_PARMS;
+#endif
+
+  typedef struct tagMCI_OVLY_RECT_PARMS {
+    DWORD_PTR dwCallback;
+#ifdef MCI_USE_OFFEXT
+    POINT ptOffset;
+    POINT ptExtent;
+#else
+    RECT rc;
+#endif
+  } MCI_OVLY_RECT_PARMS,*PMCI_OVLY_RECT_PARMS,*LPMCI_OVLY_RECT_PARMS;
+
+  typedef struct tagMCI_OVLY_SAVE_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR lpfilename;
+    RECT rc;
+  } MCI_OVLY_SAVE_PARMSA,*PMCI_OVLY_SAVE_PARMSA,*LPMCI_OVLY_SAVE_PARMSA;
+
+  typedef struct tagMCI_OVLY_SAVE_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR lpfilename;
+    RECT rc;
+  } MCI_OVLY_SAVE_PARMSW,*PMCI_OVLY_SAVE_PARMSW,*LPMCI_OVLY_SAVE_PARMSW;
+#ifdef UNICODE
+  typedef MCI_OVLY_SAVE_PARMSW MCI_OVLY_SAVE_PARMS;
+  typedef PMCI_OVLY_SAVE_PARMSW PMCI_OVLY_SAVE_PARMS;
+  typedef LPMCI_OVLY_SAVE_PARMSW LPMCI_OVLY_SAVE_PARMS;
+#else
+  typedef MCI_OVLY_SAVE_PARMSA MCI_OVLY_SAVE_PARMS;
+  typedef PMCI_OVLY_SAVE_PARMSA PMCI_OVLY_SAVE_PARMS;
+  typedef LPMCI_OVLY_SAVE_PARMSA LPMCI_OVLY_SAVE_PARMS;
+#endif
+
+  typedef struct tagMCI_OVLY_LOAD_PARMSA {
+    DWORD_PTR dwCallback;
+    LPCSTR lpfilename;
+    RECT rc;
+  } MCI_OVLY_LOAD_PARMSA,*PMCI_OVLY_LOAD_PARMSA,*LPMCI_OVLY_LOAD_PARMSA;
+
+  typedef struct tagMCI_OVLY_LOAD_PARMSW {
+    DWORD_PTR dwCallback;
+    LPCWSTR lpfilename;
+    RECT rc;
+  } MCI_OVLY_LOAD_PARMSW,*PMCI_OVLY_LOAD_PARMSW,*LPMCI_OVLY_LOAD_PARMSW;
+#ifdef UNICODE
+  typedef MCI_OVLY_LOAD_PARMSW MCI_OVLY_LOAD_PARMS;
+  typedef PMCI_OVLY_LOAD_PARMSW PMCI_OVLY_LOAD_PARMS;
+  typedef LPMCI_OVLY_LOAD_PARMSW LPMCI_OVLY_LOAD_PARMS;
+#else
+  typedef MCI_OVLY_LOAD_PARMSA MCI_OVLY_LOAD_PARMS;
+  typedef PMCI_OVLY_LOAD_PARMSA PMCI_OVLY_LOAD_PARMS;
+  typedef LPMCI_OVLY_LOAD_PARMSA LPMCI_OVLY_LOAD_PARMS;
+#endif
+#endif
+
+#ifndef NEWTRANSPARENT
+#define NEWTRANSPARENT 3
+#define QUERYROPSUPPORT 40
+#endif
+
+#define SELECTDIB 41
+#define DIBINDEX(n) MAKELONG((n),0x10FF)
+
+#ifndef SC_SCREENSAVE
+#define SC_SCREENSAVE 0xF140
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#include <poppack.h>
+#endif