Started the implementation of MSACM.DLL and MSACM32.DLL.

diff --git a/include/msacm.h b/include/msacm.h
new file mode 100644
index 0000000..3563628
--- /dev/null
+++ b/include/msacm.h
@@ -0,0 +1,1003 @@
+/*
+ *      msacm.h   -       Declarations for MSACM
+ */
+
+#ifndef __WINE_MSACM_H
+#define __WINE_MSACM_H
+
+#include "wintypes.h"
+#include "driver.h"
+#include "mmsystem.h"
+#include "mmreg.h"
+
+/***********************************************************************
+ * Types
+ */
+
+/* FIXME: Move to wintypes.h */
+#define DECLARE_HANDLE(a) \
+typedef HANDLE16 a##16; \
+typedef HANDLE32 a##32; \
+typedef a##16 *P##a##16; \
+typedef a##16 *NP##a##16; \
+typedef a##16 *LP##a##16; \
+typedef a##32 *P##a##32;
+
+DECLARE_HANDLE(HACMDRIVERID);
+DECLARE_HANDLE(HACMDRIVER);
+DECLARE_HANDLE(HACMSTREAM);
+DECLARE_HANDLE(HACMOBJ);
+
+/* FIXME: Remove when define moved to wintypes.h */
+#undef DECLARE_HANDLE
+
+/***********************************************************************
+ * Defines/Enums
+ */
+
+#define ACMERR_BASE        512
+#define ACMERR_NOTPOSSIBLE (ACMERR_BASE + 0)
+#define ACMERR_BUSY        (ACMERR_BASE + 1)
+#define ACMERR_UNPREPARED  (ACMERR_BASE + 2)
+#define ACMERR_CANCELED    (ACMERR_BASE + 3)
+
+#define MM_ACM_OPEN  MM_STREAM_OPEN
+#define MM_ACM_CLOSE MM_STREAM_CLOSE
+#define MM_ACM_DONE  MM_STREAM_DONE
+
+#define ACM_DRIVERADDF_FUNCTION   0x00000003L
+#define ACM_DRIVERADDF_NOTIFYHWND 0x00000004L
+#define ACM_DRIVERADDF_TYPEMASK   0x00000007L
+#define ACM_DRIVERADDF_LOCAL      0x00000000L
+#define ACM_DRIVERADDF_GLOBAL     0x00000008L
+
+#define ACMDRIVERDETAILS_SHORTNAME_CHARS  32
+#define ACMDRIVERDETAILS_LONGNAME_CHARS  128
+#define ACMDRIVERDETAILS_COPYRIGHT_CHARS  80
+#define ACMDRIVERDETAILS_LICENSING_CHARS 128
+#define ACMDRIVERDETAILS_FEATURES_CHARS  512
+
+#define ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC mmioFOURCC('a', 'u', 'd', 'c')
+#define ACMDRIVERDETAILS_FCCCOMP_UNDEFINED  mmioFOURCC('\0', '\0', '\0', '\0')
+
+#define ACMDRIVERDETAILS_SUPPORTF_CODEC     0x00000001L
+#define ACMDRIVERDETAILS_SUPPORTF_CONVERTER 0x00000002L
+#define ACMDRIVERDETAILS_SUPPORTF_FILTER    0x00000004L
+#define ACMDRIVERDETAILS_SUPPORTF_HARDWARE  0x00000008L
+#define ACMDRIVERDETAILS_SUPPORTF_ASYNC     0x00000010L
+#define ACMDRIVERDETAILS_SUPPORTF_LOCAL     0x40000000L
+#define ACMDRIVERDETAILS_SUPPORTF_DISABLED  0x80000000L
+
+#define ACM_DRIVERENUMF_NOLOCAL  0x40000000L
+#define ACM_DRIVERENUMF_DISABLED 0x80000000L
+
+#define ACM_DRIVERPRIORITYF_ENABLE    0x00000001L
+#define ACM_DRIVERPRIORITYF_DISABLE   0x00000002L
+#define ACM_DRIVERPRIORITYF_ABLEMASK  0x00000003L
+#define ACM_DRIVERPRIORITYF_BEGIN     0x00010000L
+#define ACM_DRIVERPRIORITYF_END       0x00020000L
+#define ACM_DRIVERPRIORITYF_DEFERMASK 0x00030000L
+
+#define MM_ACM_FILTERCHOOSE 0x8000
+
+#define FILTERCHOOSE_MESSAGE          0
+#define FILTERCHOOSE_FILTERTAG_VERIFY (FILTERCHOOSE_MESSAGE+0)
+#define FILTERCHOOSE_FILTER_VERIFY    (FILTERCHOOSE_MESSAGE+1)
+#define FILTERCHOOSE_CUSTOM_VERIFY    (FILTERCHOOSE_MESSAGE+2)
+
+#define ACMFILTERCHOOSE_STYLEF_SHOWHELP             0x00000004L
+#define ACMFILTERCHOOSE_STYLEF_ENABLEHOOK           0x00000008L
+#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATE       0x00000010L
+#define ACMFILTERCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L
+#define ACMFILTERCHOOSE_STYLEF_INITTOFILTERSTRUCT   0x00000040L
+#define ACMFILTERCHOOSE_STYLEF_CONTEXTHELP          0x00000080L
+
+#define ACMFILTERDETAILS_FILTER_CHARS 128
+
+#define ACM_FILTERDETAILSF_INDEX     0x00000000L
+#define ACM_FILTERDETAILSF_FILTER    0x00000001L
+#define ACM_FILTERDETAILSF_QUERYMASK 0x0000000FL
+
+#define ACMFILTERTAGDETAILS_FILTERTAG_CHARS 48
+
+#define ACM_FILTERTAGDETAILSF_INDEX       0x00000000L
+#define ACM_FILTERTAGDETAILSF_FILTERTAG   0x00000001L
+#define ACM_FILTERTAGDETAILSF_LARGESTSIZE 0x00000002L
+#define ACM_FILTERTAGDETAILSF_QUERYMASK   0x0000000FL
+
+#define ACM_FILTERENUMF_DWFILTERTAG 0x00010000L
+
+#define ACMHELPMSGSTRING32A       "acmchoose_help"
+#define ACMHELPMSGSTRING32W       L"acmchoose_help"
+#define ACMHELPMSGSTRING16       "acmchoose_help"
+
+#define ACMHELPMSGCONTEXTMENU32A  "acmchoose_contextmenu"
+#define ACMHELPMSGCONTEXTMENU32W  L"acmchoose_contextmenu"
+#define ACMHELPMSGCONTEXTMENU16   "acmchoose_contextmenu"
+
+#define ACMHELPMSGCONTEXTHELP32A  "acmchoose_contexthelp"
+#define ACMHELPMSGCONTEXTHELP32W  L"acmchoose_contexthelp"
+#define ACMHELPMSGCONTEXTHELP16   "acmchoose_contexthelp"
+
+#define MM_ACM_FORMATCHOOSE 0x8000
+
+#define FORMATCHOOSE_MESSAGE          0
+#define FORMATCHOOSE_FORMATTAG_VERIFY (FORMATCHOOSE_MESSAGE+0)
+#define FORMATCHOOSE_FORMAT_VERIFY    (FORMATCHOOSE_MESSAGE+1)
+#define FORMATCHOOSE_CUSTOM_VERIFY    (FORMATCHOOSE_MESSAGE+2)
+
+#define ACMFORMATCHOOSE_STYLEF_SHOWHELP             0x00000004L
+#define ACMFORMATCHOOSE_STYLEF_ENABLEHOOK           0x00000008L
+#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATE       0x00000010L
+#define ACMFORMATCHOOSE_STYLEF_ENABLETEMPLATEHANDLE 0x00000020L
+#define ACMFORMATCHOOSE_STYLEF_INITTOWFXSTRUCT      0x00000040L
+#define ACMFORMATCHOOSE_STYLEF_CONTEXTHELP          0x00000080L
+
+#define ACMFORMATDETAILS_FORMAT_CHARS   128
+
+#define ACM_FORMATDETAILSF_INDEX     0x00000000L
+#define ACM_FORMATDETAILSF_FORMAT    0x00000001L
+#define ACM_FORMATDETAILSF_QUERYMASK 0x0000000FL
+
+#define ACM_FORMATENUMF_WFORMATTAG     0x00010000L
+#define ACM_FORMATENUMF_NCHANNELS      0x00020000L
+#define ACM_FORMATENUMF_NSAMPLESPERSEC 0x00040000L
+#define ACM_FORMATENUMF_WBITSPERSAMPLE 0x00080000L
+#define ACM_FORMATENUMF_CONVERT        0x00100000L
+#define ACM_FORMATENUMF_SUGGEST        0x00200000L
+#define ACM_FORMATENUMF_HARDWARE       0x00400000L
+#define ACM_FORMATENUMF_INPUT          0x00800000L
+#define ACM_FORMATENUMF_OUTPUT         0x01000000L
+
+#define ACM_FORMATSUGGESTF_WFORMATTAG     0x00010000L
+#define ACM_FORMATSUGGESTF_NCHANNELS      0x00020000L
+#define ACM_FORMATSUGGESTF_NSAMPLESPERSEC 0x00040000L
+#define ACM_FORMATSUGGESTF_WBITSPERSAMPLE 0x00080000L
+#define ACM_FORMATSUGGESTF_TYPEMASK       0x00FF0000L
+
+#define ACMFORMATTAGDETAILS_FORMATTAG_CHARS 48
+
+#define ACM_FORMATTAGDETAILSF_INDEX       0x00000000L
+#define ACM_FORMATTAGDETAILSF_FORMATTAG   0x00000001L
+#define ACM_FORMATTAGDETAILSF_LARGESTSIZE 0x00000002L
+#define ACM_FORMATTAGDETAILSF_QUERYMASK   0x0000000FL
+
+#define ACM_METRIC_COUNT_DRIVERS            1
+#define ACM_METRIC_COUNT_CODECS             2
+#define ACM_METRIC_COUNT_CONVERTERS         3
+#define ACM_METRIC_COUNT_FILTERS            4
+#define ACM_METRIC_COUNT_DISABLED           5
+#define ACM_METRIC_COUNT_HARDWARE           6
+#define ACM_METRIC_COUNT_LOCAL_DRIVERS     20
+#define ACM_METRIC_COUNT_LOCAL_CODECS      21
+#define ACM_METRIC_COUNT_LOCAL_CONVERTERS  22
+#define ACM_METRIC_COUNT_LOCAL_FILTERS     23
+#define ACM_METRIC_COUNT_LOCAL_DISABLED    24
+#define ACM_METRIC_HARDWARE_WAVE_INPUT     30
+#define ACM_METRIC_HARDWARE_WAVE_OUTPUT    31
+#define ACM_METRIC_MAX_SIZE_FORMAT         50
+#define ACM_METRIC_MAX_SIZE_FILTER         51
+#define ACM_METRIC_DRIVER_SUPPORT         100
+#define ACM_METRIC_DRIVER_PRIORITY        101
+
+#define ACM_STREAMCONVERTF_BLOCKALIGN 0x00000004
+#define ACM_STREAMCONVERTF_START      0x00000010
+#define ACM_STREAMCONVERTF_END        0x00000020
+
+#define ACMSTREAMHEADER_STATUSF_DONE     0x00010000L
+#define ACMSTREAMHEADER_STATUSF_PREPARED 0x00020000L
+#define ACMSTREAMHEADER_STATUSF_INQUEUE  0x00100000L
+
+#define ACM_STREAMOPENF_QUERY       0x00000001
+#define ACM_STREAMOPENF_ASYNC       0x00000002
+#define ACM_STREAMOPENF_NONREALTIME 0x00000004
+
+#define ACM_STREAMSIZEF_SOURCE      0x00000000L
+#define ACM_STREAMSIZEF_DESTINATION 0x00000001L
+#define ACM_STREAMSIZEF_QUERYMASK   0x0000000FL
+
+#define ACMDM_USER                  (DRV_USER + 0x0000)
+#define ACMDM_RESERVED_LOW          (DRV_USER + 0x2000)
+#define ACMDM_RESERVED_HIGH         (DRV_USER + 0x2FFF)
+
+#define ACMDM_BASE                  ACMDM_RESERVED_LOW
+
+#define ACMDM_DRIVER_ABOUT          (ACMDM_BASE + 11)
+
+/***********************************************************************
+ * Callbacks
+ */
+
+typedef BOOL32 (CALLBACK *ACMDRIVERENUMCB32)(
+  HACMDRIVERID32 hadid, DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL16 (CALLBACK *ACMDRIVERENUMCB16)(
+  HACMDRIVERID16 hadid, DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef UINT32 (CALLBACK *ACMFILTERCHOOSEHOOKPROC32A)(
+  HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam
+);
+
+typedef UINT32 (CALLBACK *ACMFILTERCHOOSEHOOKPROC32W)(
+  HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam
+);
+
+typedef UINT32 (CALLBACK *ACMFILTERCHOOSEHOOKPROC16)(
+  HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam
+);
+
+typedef UINT32 (CALLBACK *ACMFORMATCHOOSEHOOKPROC32A)(
+  HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam
+);
+
+typedef UINT32 (CALLBACK *ACMFORMATCHOOSEHOOKPROC32W)(
+  HWND32 hwnd, UINT32 uMsg, WPARAM32 wParam, LPARAM lParam
+);
+
+typedef UINT16 (CALLBACK *ACMFORMATCHOOSEHOOKPROC16)(
+  HWND16 hwnd, UINT16 uMsg, WPARAM16 wParam, LPARAM lParam
+);
+
+/***********************************************************************
+ * Structures
+ */
+
+typedef struct _ACMDRIVERDETAILS32A
+{
+  DWORD    cbStruct;
+
+  FOURCC   fccType;
+  FOURCC   fccComp;
+
+  WORD     wMid;
+  WORD     wPid;
+
+  DWORD    vdwACM;
+  DWORD    vdwDriver;
+
+  DWORD    fdwSupport;
+  DWORD    cFormatTags;
+  DWORD    cFilterTags;
+
+  HICON32  hicon;
+
+  CHAR     szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
+  CHAR     szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
+  CHAR     szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
+  CHAR     szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
+  CHAR     szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];
+} ACMDRIVERDETAILS32A, *PACMDRIVERDETAILS32A;
+
+typedef struct _ACMDRIVERDETAILS32W
+{
+  DWORD    cbStruct;
+
+  FOURCC   fccType;
+  FOURCC   fccComp;
+
+  WORD     wMid;
+  WORD     wPid;
+
+  DWORD    vdwACM;
+  DWORD    vdwDriver;
+
+  DWORD    fdwSupport;
+  DWORD    cFormatTags;
+  DWORD    cFilterTags;
+
+  HICON32  hicon;
+
+  WCHAR    szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
+  WCHAR    szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
+  WCHAR    szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
+  WCHAR    szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
+  WCHAR    szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];
+} ACMDRIVERDETAILS32W, *PACMDRIVERDETAILS32W;
+
+typedef struct _ACMDRIVERDETAILS16
+{
+  DWORD   cbStruct;
+
+  FOURCC  fccType;
+  FOURCC  fccComp;
+
+  WORD    wMid;
+  WORD    wPid;
+
+  DWORD   vdwACM;
+  DWORD   vdwDriver;
+
+  DWORD   fdwSupport;
+  DWORD   cFormatTags;
+  DWORD   cFilterTags;
+
+  HICON16 hicon;
+
+  CHAR    szShortName[ACMDRIVERDETAILS_SHORTNAME_CHARS];
+  CHAR    szLongName[ACMDRIVERDETAILS_LONGNAME_CHARS];
+  CHAR    szCopyright[ACMDRIVERDETAILS_COPYRIGHT_CHARS];
+  CHAR    szLicensing[ACMDRIVERDETAILS_LICENSING_CHARS];
+  CHAR    szFeatures[ACMDRIVERDETAILS_FEATURES_CHARS];
+} ACMDRIVERDETAILS16, *NPACMDRIVERDETAILS16, *LPACMDRIVERDETAILS16;
+
+typedef struct _ACMFILTERCHOOSE32A
+{
+  DWORD         cbStruct;
+  DWORD         fdwStyle;
+
+  HWND32        hwndOwner;
+
+  PWAVEFILTER32 pwfltr;
+  DWORD         cbwfltr;
+
+  LPCSTR        pszTitle;
+
+  CHAR          szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+  CHAR          szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+  LPSTR         pszName;
+  DWORD         cchName;
+
+  DWORD         fdwEnum;
+  PWAVEFILTER32 pwfltrEnum;
+    
+  HINSTANCE32   hInstance;
+  LPCSTR        pszTemplateName;
+  LPARAM        lCustData;
+  ACMFILTERCHOOSEHOOKPROC32A pfnHook;
+} ACMFILTERCHOOSE32A, *PACMFILTERCHOOSE32A;
+
+typedef struct _ACMFILTERCHOOSE32W
+{
+  DWORD         cbStruct;
+  DWORD         fdwStyle;
+
+  HWND32        hwndOwner;
+
+  PWAVEFILTER32 pwfltr;
+  DWORD         cbwfltr;
+
+  LPCWSTR       pszTitle;
+
+  WCHAR         szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+  WCHAR         szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+  LPWSTR        pszName;
+  DWORD         cchName;
+
+  DWORD         fdwEnum;
+  PWAVEFILTER32 pwfltrEnum;
+    
+  HINSTANCE32   hInstance;
+  LPCWSTR       pszTemplateName;
+  LPARAM        lCustData;
+  ACMFILTERCHOOSEHOOKPROC32W pfnHook;
+} ACMFILTERCHOOSE32W, *PACMFILTERCHOOSE32W;
+
+typedef struct _ACMFILTERCHOOSE16
+{
+  DWORD          cbStruct;
+  DWORD          fdwStyle;
+
+  HWND16         hwndOwner;
+
+  LPWAVEFILTER16 pwfltr;
+  DWORD          cbwfltr;
+
+  LPCSTR         pszTitle;
+
+  char           szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+  char           szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+  LPSTR          pszName;
+  DWORD          cchName;
+
+  DWORD          fdwEnum;
+  LPWAVEFILTER16 pwfltrEnum;
+    
+  HINSTANCE16    hInstance;
+  LPCSTR         pszTemplateName;
+  LPARAM         lCustData;
+  ACMFILTERCHOOSEHOOKPROC16 pfnHook;
+} ACMFILTERCHOOSE16, *NPACMFILTERCHOOSE16, *LPACMFILTERCHOOSE16;
+
+typedef struct _ACMFILTERDETAILS32A
+{
+  DWORD           cbStruct;
+  DWORD           dwFilterIndex;
+  DWORD           dwFilterTag;
+  DWORD           fdwSupport;
+  PWAVEFILTER32   pwfltr;
+  DWORD           cbwfltr;
+  CHAR            szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+} ACMFILTERDETAILS32A, *PACMFILTERDETAILS32A;
+
+typedef struct _ACMFILTERDETAILS32W
+{
+  DWORD          cbStruct;
+  DWORD          dwFilterIndex;
+  DWORD          dwFilterTag;
+  DWORD          fdwSupport;
+  PWAVEFILTER32  pwfltr;
+  DWORD          cbwfltr;
+  WCHAR          szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+} ACMFILTERDETAILS32W, *PACMFILTERDETAILS32W;
+
+typedef struct _ACMFILTERDETAILS16
+{
+  DWORD          cbStruct;
+  DWORD          dwFilterIndex;
+  DWORD          dwFilterTag;
+  DWORD          fdwSupport;
+  LPWAVEFILTER16 pwfltr;
+  DWORD          cbwfltr;
+  CHAR           szFilter[ACMFILTERDETAILS_FILTER_CHARS];
+} ACMFILTERDETAILS16, *NPACMFILTERDETAILS16, *LPACMFILTERDETAILS16;
+
+typedef struct _ACMFILTERTAGDETAILS32A
+{
+  DWORD cbStruct;
+  DWORD dwFilterTagIndex;
+  DWORD dwFilterTag;
+  DWORD cbFilterSize;
+  DWORD fdwSupport;
+  DWORD cStandardFilters;
+  CHAR  szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+} ACMFILTERTAGDETAILS32A, *PACMFILTERTAGDETAILS32A;
+
+typedef struct _ACMFILTERTAGDETAILS32W
+{
+  DWORD cbStruct;
+  DWORD dwFilterTagIndex;
+  DWORD dwFilterTag;
+  DWORD cbFilterSize;
+  DWORD fdwSupport;
+  DWORD cStandardFilters;
+  WCHAR szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+} ACMFILTERTAGDETAILS32W, *PACMFILTERTAGDETAILS32W;
+
+typedef struct _ACMFILTERTAGDETAILS16
+{
+  DWORD cbStruct;
+  DWORD dwFilterTagIndex;
+  DWORD dwFilterTag;
+  DWORD cbFilterSize;
+  DWORD fdwSupport;
+  DWORD cStandardFilters;
+  CHAR  szFilterTag[ACMFILTERTAGDETAILS_FILTERTAG_CHARS];
+} ACMFILTERTAGDETAILS16, *NPACMFILTERTAGDETAILS16, *LPACMFILTERTAGDETAILS16;
+
+typedef struct _ACMFORMATCHOOSE32A
+{
+  DWORD           cbStruct;
+  DWORD           fdwStyle;
+ 
+  HWND32          hwndOwner;
+
+  PWAVEFORMATEX32 pwfx;
+  DWORD           cbwfx;
+  LPCSTR          pszTitle;
+    
+  CHAR            szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+  CHAR            szFormat[ACMFORMATDETAILS_FORMAT_CHARS];    
+
+  LPSTR           pszName;
+  DWORD           cchName;
+
+  DWORD           fdwEnum;
+  PWAVEFORMATEX32 pwfxEnum;
+    
+  HINSTANCE32     hInstance;
+  LPCSTR          pszTemplateName;
+  LPARAM          lCustData;
+  ACMFORMATCHOOSEHOOKPROC32A pfnHook;
+} ACMFORMATCHOOSE32A, *PACMFORMATCHOOSE32A;
+
+typedef struct _ACMFORMATCHOOSE32W
+{
+  DWORD           cbStruct;
+  DWORD           fdwStyle;
+    
+  HWND32          hwndOwner;
+
+  PWAVEFORMATEX32 pwfx;
+  DWORD           cbwfx;
+  LPCWSTR         pszTitle;
+    
+  WCHAR           szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+  WCHAR           szFormat[ACMFORMATDETAILS_FORMAT_CHARS];    
+
+  LPWSTR          pszName;
+  DWORD           cchName;
+
+  DWORD           fdwEnum;
+  LPWAVEFORMATEX  pwfxEnum;
+    
+  HINSTANCE32     hInstance;
+  LPCWSTR         pszTemplateName;
+  LPARAM          lCustData;
+  ACMFORMATCHOOSEHOOKPROC32W pfnHook;
+} ACMFORMATCHOOSE32W, *PACMFORMATCHOOSE32W;
+
+typedef struct _ACMFORMATCHOOSE16
+{
+  DWORD            cbStruct;
+  DWORD            fdwStyle;
+    
+  HWND16           hwndOwner;
+
+  LPWAVEFORMATEX16 pwfx;
+  DWORD            cbwfx;
+  LPCSTR           pszTitle;
+    
+  CHAR             szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+  CHAR             szFormat[ACMFORMATDETAILS_FORMAT_CHARS];    
+
+  LPSTR            pszName;
+  DWORD            cchName;
+
+  DWORD            fdwEnum;
+  LPWAVEFORMATEX16 pwfxEnum;
+    
+  HINSTANCE16      hInstance;
+  LPCSTR           pszTemplateName;
+  LPARAM           lCustData;
+  ACMFORMATCHOOSEHOOKPROC16 pfnHook;
+} ACMFORMATCHOOSE16, *NPACMFORMATCHOOSE16, *LPACMFORMATCHOOSE16;
+
+typedef struct _ACMFORMATDETAILS32A
+{
+  DWORD           cbStruct;
+  DWORD           dwFormatIndex;
+  DWORD           dwFormatTag;
+  DWORD           fdwSupport;
+  PWAVEFORMATEX32 pwfx;
+  DWORD           cbwfx;
+  CHAR            szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
+} ACMFORMATDETAILS32A, *PACMFORMATDETAILS32A;
+
+typedef struct _ACMFORMATDETAILS32W
+{
+    DWORD           cbStruct;
+    DWORD           dwFormatIndex;
+    DWORD           dwFormatTag;
+    DWORD           fdwSupport;
+    PWAVEFORMATEX32 pwfx;
+    DWORD           cbwfx;
+    WCHAR           szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
+} ACMFORMATDETAILS32W, *PACMFORMATDETAILS32W;
+
+typedef struct _ACMFORMATDETAILS16
+{
+    DWORD            cbStruct;
+    DWORD            dwFormatIndex;
+    DWORD            dwFormatTag;
+    DWORD            fdwSupport;
+    LPWAVEFORMATEX16 pwfx;
+    DWORD            cbwfx;
+    CHAR             szFormat[ACMFORMATDETAILS_FORMAT_CHARS];
+} ACMFORMATDETAILS16, *NPACMFORMATDETAILS16, *LPACMFORMATDETAILS16;
+
+typedef struct _ACMFORMATTAGDETAILS32A
+{
+  DWORD cbStruct;
+  DWORD dwFormatTagIndex;
+  DWORD dwFormatTag;
+  DWORD cbFormatSize;
+  DWORD fdwSupport;
+  DWORD cStandardFormats;
+  CHAR  szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+} ACMFORMATTAGDETAILS32A, *PACMFORMATTAGDETAILS32A;
+
+typedef struct _ACMFORMATTAGDETAILS32W
+{
+  DWORD cbStruct;
+  DWORD dwFormatTagIndex;
+  DWORD dwFormatTag;
+  DWORD cbFormatSize;
+  DWORD fdwSupport;
+  DWORD cStandardFormats;
+  WCHAR szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+} ACMFORMATTAGDETAILS32W, *PACMFORMATTAGDETAILS32W;
+
+typedef struct _ACMFORMATTAGDETAILS16
+{
+  DWORD cbStruct;
+  DWORD dwFormatTagIndex;
+  DWORD dwFormatTag;
+  DWORD cbFormatSize;
+  DWORD fdwSupport;
+  DWORD cStandardFormats;
+  CHAR  szFormatTag[ACMFORMATTAGDETAILS_FORMATTAG_CHARS];
+} ACMFORMATTAGDETAILS16, *NPACMFORMATTAGDETAILS16, *LPACMFORMATTAGDETAILS16;
+
+typedef struct _ACMSTREAMHEADER
+{
+  DWORD  cbStruct;
+  DWORD  fdwStatus;
+  DWORD  dwUser;
+  LPBYTE pbSrc;
+  DWORD  cbSrcLength;
+  DWORD  cbSrcLengthUsed;
+  DWORD  dwSrcUser;
+  LPBYTE pbDst;
+  DWORD  cbDstLength;
+  DWORD  cbDstLengthUsed;
+  DWORD  dwDstUser;
+  DWORD  dwReservedDriver[10];
+} ACMSTREAMHEADER16, *NPACMSTREAMHEADER16, *LPACMSTREAMHEADER16,
+  ACMSTREAMHEADER32, *PACMSTREAMHEADER32;
+
+/***********************************************************************
+ * Callbacks 2
+ */
+
+typedef BOOL32 (CALLBACK *ACMFILTERENUMCB32A)(
+  HACMDRIVERID32 hadid, PACMFILTERDETAILS32A pafd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFILTERENUMCB32W)(
+  HACMDRIVERID32 hadid, PACMFILTERDETAILS32W pafd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL16 (CALLBACK *ACMFILTERENUMCB16)(
+ HACMDRIVERID16 hadid, LPACMFILTERDETAILS16 pafd,
+ DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFILTERTAGENUMCB32A)(
+  HACMDRIVERID32 hadid, PACMFILTERTAGDETAILS32A paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFILTERTAGENUMCB32W)(
+  HACMDRIVERID32 hadid, PACMFILTERTAGDETAILS32W paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL16 (CALLBACK *ACMFILTERTAGENUMCB16)(
+  HACMDRIVERID16 hadid, LPACMFILTERTAGDETAILS16 paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFORMATENUMCB32A)(
+  HACMDRIVERID32 hadid, PACMFORMATDETAILS32A pafd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFORMATENUMCB32W)(
+  HACMDRIVERID32 hadid, PACMFORMATDETAILS32W pafd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL16 (CALLBACK *ACMFORMATENUMCB16)(
+  HACMDRIVERID16 hadid, LPACMFORMATDETAILS16 pafd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFORMATTAGENUMCB32A)(
+  HACMDRIVERID32 hadid, PACMFORMATTAGDETAILS32A paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL32 (CALLBACK *ACMFORMATTAGENUMCB32W)(
+  HACMDRIVERID32 hadid, PACMFORMATTAGDETAILS32W paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+typedef BOOL16 (CALLBACK *ACMFORMATTAGENUMCB16)(
+  HACMDRIVERID16 hadid, LPACMFORMATTAGDETAILS16 paftd,
+  DWORD dwInstance, DWORD fdwSupport
+);
+
+/***********************************************************************
+ * Functions - Win16
+ */
+
+DWORD WINAPI acmGetVersion16(
+);
+MMRESULT16 WINAPI acmMetrics16(
+  HACMOBJ16 hao, UINT16 uMetric, LPVOID pMetric
+);
+MMRESULT16 WINAPI acmDriverEnum16(
+  ACMDRIVERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT16 WINAPI acmDriverDetails16(
+  HACMDRIVERID16 hadid, LPACMDRIVERDETAILS16 padd, DWORD fdwDetails
+);
+MMRESULT16 WINAPI acmDriverAdd16(
+  LPHACMDRIVERID16 phadid, HINSTANCE16 hinstModule,
+  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
+);
+MMRESULT16 WINAPI acmDriverRemove16(
+  HACMDRIVERID16 hadid, DWORD fdwRemove
+);
+MMRESULT16 WINAPI acmDriverOpen16(
+  LPHACMDRIVER16 phad, HACMDRIVERID16 hadid, DWORD fdwOpen
+);
+MMRESULT16 WINAPI acmDriverClose16(
+  HACMDRIVER16 had, DWORD fdwClose
+);
+LRESULT WINAPI acmDriverMessage16(
+  HACMDRIVER16 had, UINT16 uMsg, LPARAM lParam1, LPARAM lParam2
+);
+MMRESULT16 WINAPI acmDriverID16(
+  HACMOBJ16 hao, LPHACMDRIVERID16 phadid, DWORD fdwDriverID
+);
+MMRESULT16 WINAPI acmDriverPriority16(
+ HACMDRIVERID16 hadid, DWORD dwPriority, DWORD fdwPriority
+);
+MMRESULT16 WINAPI acmFormatTagDetails16(
+  HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd, DWORD fdwDetails
+);
+MMRESULT16 WINAPI acmFormatTagEnum16(
+  HACMDRIVER16 had, LPACMFORMATTAGDETAILS16 paftd,
+  ACMFORMATTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT16 WINAPI acmFormatChoose16(
+  LPACMFORMATCHOOSE16 pafmtc
+);
+MMRESULT16 WINAPI acmFormatDetails16(
+  HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd, DWORD fdwDetails
+);
+MMRESULT16 WINAPI acmFormatEnum16(
+  HACMDRIVER16 had, LPACMFORMATDETAILS16 pafd,
+  ACMFORMATENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT16 WINAPI acmFormatSuggest16(
+  HACMDRIVER16 had, LPWAVEFORMATEX16 pwfxSrc, 
+  LPWAVEFORMATEX16 pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest
+);
+MMRESULT16 WINAPI acmFilterTagDetails16(
+  HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd, DWORD fdwDetails
+);
+MMRESULT16 WINAPI acmFilterTagEnum16(
+  HACMDRIVER16 had, LPACMFILTERTAGDETAILS16 paftd,
+  ACMFILTERTAGENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT16 WINAPI acmFilterChoose16(
+  LPACMFILTERCHOOSE16 pafltrc
+);
+MMRESULT16 WINAPI acmFilterDetails16(
+  HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd, DWORD fdwDetails
+);
+MMRESULT16 WINAPI acmFilterEnum16(
+  HACMDRIVER16 had, LPACMFILTERDETAILS16 pafd,
+  ACMFILTERENUMCB16 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT16 WINAPI acmStreamOpen16(
+  LPHACMSTREAM16 phas, HACMDRIVER16 had,
+  LPWAVEFORMATEX16 pwfxSrc, LPWAVEFORMATEX16 pwfxDst,
+  LPWAVEFILTER16 pwfltr, DWORD dwCallback,
+  DWORD dwInstance, DWORD fdwOpen
+);
+MMRESULT16 WINAPI acmStreamClose16(
+  HACMSTREAM16 has, DWORD fdwClose
+);
+MMRESULT16 WINAPI acmStreamSize16(
+  HACMSTREAM16 has, DWORD cbInput, 
+  LPDWORD pdwOutputBytes, DWORD fdwSize
+);
+MMRESULT16 WINAPI acmStreamConvert16(
+  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwConvert
+);
+MMRESULT16 WINAPI acmStreamReset16(
+  HACMSTREAM16 has, DWORD fdwReset
+);
+MMRESULT16 WINAPI acmStreamPrepareHeader16(
+  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwPrepare
+);
+MMRESULT16 WINAPI acmStreamUnprepareHeader16(
+  HACMSTREAM16 has, LPACMSTREAMHEADER16 pash, DWORD fdwUnprepare
+);
+
+/***********************************************************************
+ * Functions - Win32
+ */
+
+MMRESULT32 WINAPI acmDriverAdd32A(
+  PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule,
+  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
+);
+MMRESULT32 WINAPI acmDriverAdd32W(
+  PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule,
+  LPARAM lParam, DWORD dwPriority, DWORD fdwAdd
+);
+MMRESULT32 WINAPI acmDriverClose32(
+  HACMDRIVER32 had, DWORD fdwClose
+);
+MMRESULT32 WINAPI acmDriverDetails32A(
+  HACMDRIVERID32 hadid, PACMDRIVERDETAILS32A padd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmDriverDetails32W(
+  HACMDRIVERID32 hadid, PACMDRIVERDETAILS32W padd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmDriverEnum32(
+  ACMDRIVERENUMCB32 fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmDriverID32(
+  HACMOBJ32 hao, PHACMDRIVERID32 phadid, DWORD fdwDriverID
+);
+LRESULT WINAPI acmDriverMessage32(
+  HACMDRIVER32 had, UINT32 uMsg, LPARAM lParam1, LPARAM lParam2
+);
+MMRESULT32 WINAPI acmDriverOpen32(
+  PHACMDRIVER32 phad, HACMDRIVERID32 hadid, DWORD fdwOpen
+);
+MMRESULT32 WINAPI acmDriverPriority32(
+  HACMDRIVERID32 hadid, DWORD dwPriority, DWORD fdwPriority
+);
+MMRESULT32 WINAPI acmDriverRemove32(
+  HACMDRIVERID32 hadid, DWORD fdwRemove
+);
+MMRESULT32 WINAPI acmFilterChoose32A(
+  PACMFILTERCHOOSE32A pafltrc
+);
+MMRESULT32 WINAPI acmFilterChoose32W(
+  PACMFILTERCHOOSE32W pafltrc
+);
+MMRESULT32 WINAPI acmFilterDetails32A(
+  HACMDRIVER32 had, PACMFILTERDETAILS32A pafd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFilterDetails32W(
+  HACMDRIVER32 had, PACMFILTERDETAILS32W pafd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFilterEnum32A(
+  HACMDRIVER32 had, PACMFILTERDETAILS32A pafd, 
+  ACMFILTERENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFilterEnum32W(
+  HACMDRIVER32 had, PACMFILTERDETAILS32W pafd, 
+  ACMFILTERENUMCB32W fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFilterTagDetails32A(
+  HACMDRIVER32 had, PACMFILTERTAGDETAILS32A paftd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFilterTagDetails32W(
+  HACMDRIVER32 had, PACMFILTERTAGDETAILS32W paftd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFilterTagEnum32A(
+  HACMDRIVER32 had, PACMFILTERTAGDETAILS32A paftd,
+  ACMFILTERTAGENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFilterTagEnum32W(
+  HACMDRIVER32 had, PACMFILTERTAGDETAILS32W paftd,
+  ACMFILTERTAGENUMCB32W fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFormatChoose32A(
+  PACMFORMATCHOOSE32A pafmtc
+);
+MMRESULT32 WINAPI acmFormatChoose32W(
+  PACMFORMATCHOOSE32W pafmtc
+);
+MMRESULT32 WINAPI acmFormatDetails32A(
+  HACMDRIVER32 had, PACMFORMATDETAILS32A pafd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFormatDetails32W(
+  HACMDRIVER32 had, PACMFORMATDETAILS32W pafd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFormatEnum32A(
+  HACMDRIVER32 had, PACMFORMATDETAILS32A pafd,
+  ACMFORMATENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFormatEnum32W(
+  HACMDRIVER32 had, PACMFORMATDETAILS32W pafd,
+  ACMFORMATENUMCB32W fnCallback, DWORD dwInstance,  DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFormatSuggest32(
+  HACMDRIVER32 had, PWAVEFORMATEX32 pwfxSrc, PWAVEFORMATEX32 pwfxDst,
+  DWORD cbwfxDst, DWORD fdwSuggest
+);
+MMRESULT32 WINAPI acmFormatTagDetails32A(
+  HACMDRIVER32 had, PACMFORMATTAGDETAILS32A paftd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFormatTagDetails32W(
+  HACMDRIVER32 had, PACMFORMATTAGDETAILS32W paftd, DWORD fdwDetails
+);
+MMRESULT32 WINAPI acmFormatTagEnum32A(
+  HACMDRIVER32 had, PACMFORMATTAGDETAILS32A paftd,
+  ACMFORMATTAGENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+MMRESULT32 WINAPI acmFormatTagEnum32W(
+  HACMDRIVER32 had, PACMFORMATTAGDETAILS32W paftd,
+  ACMFORMATTAGENUMCB32W fnCallback, DWORD dwInstance, DWORD fdwEnum
+);
+DWORD WINAPI acmGetVersion32(
+);
+MMRESULT32 WINAPI acmMetrics32(
+  HACMOBJ32 hao, UINT32  uMetric, LPVOID  pMetric
+);
+MMRESULT32 WINAPI acmStreamClose32(
+  HACMSTREAM32 has, DWORD fdwClose
+);
+MMRESULT32 WINAPI acmStreamConvert32(
+  HACMSTREAM32 has, PACMSTREAMHEADER32 pash, DWORD fdwConvert
+);
+MMRESULT32 WINAPI acmStreamMessage32(
+  HACMSTREAM32 has, UINT32 uMsg, LPARAM lParam1, LPARAM lParam2
+);
+MMRESULT32 WINAPI acmStreamOpen32(
+  PHACMSTREAM32 phas, HACMDRIVER32 had, PWAVEFORMATEX32 pwfxSrc,
+  PWAVEFORMATEX32 pwfxDst, PWAVEFILTER32 pwfltr, DWORD dwCallback,
+  DWORD dwInstance, DWORD fdwOpen
+);
+MMRESULT32 WINAPI acmStreamPrepareHeader32(
+  HACMSTREAM32 has, PACMSTREAMHEADER32 pash, DWORD fdwPrepare
+);
+MMRESULT32 WINAPI acmStreamReset32(
+  HACMSTREAM32 has, DWORD fdwReset
+);
+MMRESULT32 WINAPI acmStreamSize32(
+  HACMSTREAM32 has, DWORD cbInput, 
+  LPDWORD pdwOutputBytes, DWORD fdwSize
+);
+MMRESULT32 WINAPI acmStreamUnprepareHeader32(
+  HACMSTREAM32 has, PACMSTREAMHEADER32 pash, DWORD fdwUnprepare
+);
+
+/***********************************************************************
+ * Wine specific - Win32
+ */
+typedef struct _WINE_ACMBUILTINDRIVER32
+{
+  LPSTR        pszDriverAlias;
+  DRIVERPROC32 pfnDriverProc;
+} WINE_ACMBUILTINDRIVER32, *PWINE_ACMBUILTINDRIVER32;
+
+typedef struct _WINE_ACMLOCALDRIVER32
+{
+  DRIVERPROC32 pfnDriverProc;
+} WINE_ACMLOCALDRIVER32, *PWINE_ACMLOCALDRIVER32;
+
+typedef struct _WINE_ACMDRIVERID32 *PWINE_ACMDRIVERID32;
+
+typedef struct _WINE_ACMOBJ32
+{
+  PWINE_ACMDRIVERID32 pACMDriverID;
+} WINE_ACMOBJ32, *PWINE_ACMOBJ32;
+
+typedef struct _WINE_ACMDRIVER32
+{
+  WINE_ACMOBJ32  obj;
+  HDRVR32        hDrvr;
+} WINE_ACMDRIVER32, *PWINE_ACMDRIVER32;
+
+typedef struct _WINE_ACMSTREAM32
+{
+  WINE_ACMOBJ32  obj;
+  /* FIME: More fields needed */
+} WINE_ACMSTREAM32, *PWINE_ACMSTREAM32;
+
+typedef struct _WINE_ACMDRIVERID32
+{
+  LPSTR                    pszDriverAlias;
+  LPSTR                    pszFileName;
+  PWINE_ACMLOCALDRIVER32   pACMLocalDriver;
+  BOOL32                   bEnabled;
+  PWINE_ACMDRIVER32        pACMDriver;           /* NULL if not open */
+  PWINE_ACMDRIVERID32      pNextACMDriverID;
+  PWINE_ACMDRIVERID32      pPreviousACMDriverID;
+} WINE_ACMDRIVERID32;
+
+/* From builtin.c */
+extern WINE_ACMBUILTINDRIVER32 MSACM_BuiltinDrivers32[];
+
+/* From interal.c */
+extern HANDLE32 MSACM_hHeap32;
+extern PWINE_ACMDRIVERID32 MSACM_pFirstACMDriverID32;
+extern PWINE_ACMDRIVERID32 MSACM_pLastACMDriverID32;
+PWINE_ACMDRIVERID32 MSACM_RegisterDriver32(
+  LPSTR pszDriverAlias, LPSTR pszFileName,
+  PWINE_ACMLOCALDRIVER32 pLocalDriver);
+void MSACM_RegisterAllDrivers32();
+PWINE_ACMDRIVERID32 MSACM_UnregisterDriver32(PWINE_ACMDRIVERID32 p);
+void MSACM_UnregisterAllDrivers32();
+PWINE_ACMDRIVERID32 MSACM_GetDriverID32(HACMDRIVERID32 hDriverID);
+PWINE_ACMDRIVER32 MSACM_GetDriver32(HACMDRIVER32 hDriver);
+PWINE_ACMOBJ32 MSACM_GetObj32(HACMOBJ32 hObj);
+HDRVR32 MSACM_OpenDriverProc32(DRIVERPROC32 pfnDriverProc);
+
+#endif  /* __WINE_MSACM_H */
+
+