Started the implementation of MSACM.DLL and MSACM32.DLL.
diff --git a/dlls/msacm32/filter.c b/dlls/msacm32/filter.c
new file mode 100644
index 0000000..45dc02c
--- /dev/null
+++ b/dlls/msacm32/filter.c
@@ -0,0 +1,155 @@
+/*
+ * MSACM32 library
+ *
+ * Copyright 1998 Patrik Stridvall
+ */
+
+#include "windows.h"
+#include "winerror.h"
+#include "wintypes.h"
+#include "debug.h"
+#include "mmsystem.h"
+#include "msacm.h"
+#include "msacmdrv.h"
+
+/***********************************************************************
+ * acmFilterChooseA (MSACM32.13)
+ */
+MMRESULT32 WINAPI acmFilterChoose32A(
+ PACMFILTERCHOOSE32A pafltrc)
+{
+ FIXME(msacm, "(%p): stub\n", pafltrc);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterChooseW (MSACM32.14)
+ */
+MMRESULT32 WINAPI acmFilterChoose32W(
+ PACMFILTERCHOOSE32W pafltrc)
+{
+ FIXME(msacm, "(%p): stub\n", pafltrc);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterDetailsA (MSACM32.15)
+ */
+MMRESULT32 WINAPI acmFilterDetails32A(
+ HACMDRIVER32 had, PACMFILTERDETAILS32A pafd, DWORD fdwDetails)
+{
+ if(fdwDetails & ~(ACM_FILTERDETAILSF_FILTER))
+ return MMSYSERR_INVALFLAG;
+
+ /* FIXME
+ * How does the driver know if the ANSI or
+ * the UNICODE variant of PACMFILTERDETAILS is used?
+ * It might check cbStruct or does it only accept ANSI.
+ */
+ return (MMRESULT32) acmDriverMessage32(
+ had, ACMDM_FILTER_DETAILS,
+ (LPARAM) pafd, (LPARAM) fdwDetails
+ );
+}
+
+/***********************************************************************
+ * acmFilterDetailsW (MSACM32.16)
+ */
+MMRESULT32 WINAPI acmFilterDetails32W(
+ HACMDRIVER32 had, PACMFILTERDETAILS32W pafd, DWORD fdwDetails)
+{
+ FIXME(msacm, "(0x%08x, %p, %ld): stub\n", had, pafd, fdwDetails);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterEnumA (MSACM32.17)
+ */
+MMRESULT32 WINAPI acmFilterEnum32A(
+ HACMDRIVER32 had, PACMFILTERDETAILS32A pafd,
+ ACMFILTERENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum)
+{
+ FIXME(msacm, "(0x%08x, %p, %p, %ld, %ld): stub\n",
+ had, pafd, fnCallback, dwInstance, fdwEnum
+ );
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterEnumW (MSACM32.18)
+ */
+MMRESULT32 WINAPI acmFilterEnum32W(
+ HACMDRIVER32 had, PACMFILTERDETAILS32W pafd,
+ ACMFILTERENUMCB32W fnCallback, DWORD dwInstance, DWORD fdwEnum)
+{
+ FIXME(msacm, "(0x%08x, %p, %p, %ld, %ld): stub\n",
+ had, pafd, fnCallback, dwInstance, fdwEnum
+ );
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterTagDetailsA (MSACM32.19)
+ */
+MMRESULT32 WINAPI acmFilterTagDetails32A(
+ HACMDRIVER32 had, PACMFILTERTAGDETAILS32A paftd, DWORD fdwDetails)
+{
+ if(fdwDetails &
+ ~(ACM_FILTERTAGDETAILSF_FILTERTAG|
+ ACM_FILTERTAGDETAILSF_LARGESTSIZE))
+ return MMSYSERR_INVALFLAG;
+
+ /* FIXME
+ * How does the driver know if the ANSI or
+ * the UNICODE variant of PACMFILTERTAGDETAILS is used?
+ * It might check cbStruct or does it only accept ANSI.
+ */
+ return (MMRESULT32) acmDriverMessage32(
+ had, ACMDM_FILTERTAG_DETAILS,
+ (LPARAM) paftd, (LPARAM) fdwDetails
+ );
+}
+
+/***********************************************************************
+ * acmFilterTagDetailsW (MSACM32.20)
+ */
+MMRESULT32 WINAPI acmFilterTagDetails32W(
+ HACMDRIVER32 had, PACMFILTERTAGDETAILS32W paftd, DWORD fdwDetails)
+{
+ FIXME(msacm, "(0x%08x, %p, %ld): stub\n", had, paftd, fdwDetails);
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterTagEnumA (MSACM32.21)
+ */
+MMRESULT32 WINAPI acmFilterTagEnum32A(
+ HACMDRIVER32 had, PACMFILTERTAGDETAILS32A paftd,
+ ACMFILTERTAGENUMCB32A fnCallback, DWORD dwInstance, DWORD fdwEnum)
+{
+ FIXME(msacm, "(0x%08x, %p, %p, %ld, %ld): stub\n",
+ had, paftd, fnCallback, dwInstance, fdwEnum
+ );
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}
+
+/***********************************************************************
+ * acmFilterTagEnumW (MSACM32.22)
+ */
+MMRESULT32 WINAPI acmFilterTagEnum32W(
+ HACMDRIVER32 had, PACMFILTERTAGDETAILS32W paftd,
+ ACMFILTERTAGENUMCB32W fnCallback, DWORD dwInstance, DWORD fdwEnum)
+{
+ FIXME(msacm, "(0x%08x, %p, %p, %ld, %ld): stub\n",
+ had, paftd, fnCallback, dwInstance, fdwEnum
+ );
+ SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+ return MMSYSERR_ERROR;
+}