msacm patch with tests

Robert Reif reif at earthlink.net
Sat May 1 08:18:09 CDT 2004


Adds test program.
Fixes some function parameter checking.

This is the beginning of a test program that I
want to develop to find a nasty off by one bug
in the PCM converter.  I found the bug because
it would crash when running off the end of
an array.  I fixed the crash by not going past the
end but now it sometimes doesn't convert all
the data.

-------------- next part --------------
Index: configure.ac
===================================================================
RCS file: /home/wine/wine/configure.ac,v
retrieving revision 1.271
diff -u -r1.271 configure.ac
--- configure.ac	29 Apr 2004 20:04:48 -0000	1.271
+++ configure.ac	1 May 2004 12:57:39 -0000
@@ -1567,6 +1567,7 @@
 dlls/msacm/msadp32/Makefile
 dlls/msacm/msg711/Makefile
 dlls/msacm/winemp3/Makefile
+dlls/msacm/tests/Makefile
 dlls/msdmo/Makefile
 dlls/mshtml/Makefile
 dlls/msi/Makefile
Index: dlls/msacm/Makefile.in
===================================================================
RCS file: /home/wine/wine/dlls/msacm/Makefile.in,v
retrieving revision 1.24
diff -u -r1.24 Makefile.in
--- dlls/msacm/Makefile.in	11 Oct 2003 01:09:19 -0000	1.24
+++ dlls/msacm/Makefile.in	1 May 2004 12:57:43 -0000
@@ -22,6 +22,8 @@
 
 RC_SRCS = msacm.rc
 
+SUBDIRS = tests
+
 @MAKE_DLL_RULES@
 
 ### Dependencies:
Index: dlls/msacm/driver.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/driver.c,v
retrieving revision 1.23
diff -u -r1.23 driver.c
--- dlls/msacm/driver.c	5 Sep 2003 23:08:36 -0000	1.23
+++ dlls/msacm/driver.c	1 May 2004 12:57:43 -0000
@@ -132,6 +132,12 @@
     MMRESULT mmr;
     ACMDRIVERDETAILSW	addw;
 
+    if (!padd)
+        return MMSYSERR_INVALPARAM;
+
+    if (padd->cbStruct < sizeof(*padd))
+        return MMSYSERR_INVALPARAM;
+
     addw.cbStruct = sizeof(addw);
     mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
     if (mmr == 0) {
@@ -166,6 +172,12 @@
 {
     HACMDRIVER acmDrvr;
     MMRESULT mmr;
+
+    if (!padd)
+        return MMSYSERR_INVALPARAM;
+
+    if (padd->cbStruct < sizeof(*padd))
+        return MMSYSERR_INVALPARAM;
 
     if (fdwDetails)
 	return MMSYSERR_INVALFLAG;
Index: dlls/msacm/format.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/format.c,v
retrieving revision 1.24
diff -u -r1.24 format.c
--- dlls/msacm/format.c	20 Apr 2004 00:34:53 -0000	1.24
+++ dlls/msacm/format.c	1 May 2004 12:57:44 -0000
@@ -411,6 +411,12 @@
     ACMFORMATDETAILSW		afdw;
     struct MSACM_FormatEnumWtoA_Instance afei;
 
+    if (!pafda)
+        return MMSYSERR_INVALPARAM;
+
+    if (pafda->cbStruct < sizeof(*pafda))
+        return MMSYSERR_INVALPARAM;
+
     memset(&afdw, 0, sizeof(afdw));
     afdw.cbStruct = sizeof(afdw);
     afdw.dwFormatIndex = pafda->dwFormatIndex;
@@ -489,7 +495,11 @@
     TRACE("(%p, %p, %p, %ld, %ld)\n",
 	  had, pafd, fnCallback, dwInstance, fdwEnum);
 
-    if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
+    if (!pafd)
+        return MMSYSERR_INVALPARAM;
+
+    if (pafd->cbStruct < sizeof(*pafd))
+        return MMSYSERR_INVALPARAM;
 
     if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS|
 		   ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
Index: dlls/msacm/msacm32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/msacm/msacm32_main.c,v
retrieving revision 1.17
diff -u -r1.17 msacm32_main.c
--- dlls/msacm/msacm32_main.c	5 Sep 2003 23:08:36 -0000	1.17
+++ dlls/msacm/msacm32_main.c	1 May 2004 12:57:44 -0000
@@ -120,6 +120,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
@@ -131,6 +132,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_CODECS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
@@ -144,6 +146,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
@@ -157,6 +160,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_FILTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
 		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) &&
@@ -170,6 +174,7 @@
 	/* fall through */
     case ACM_METRIC_COUNT_LOCAL_DISABLED:
 	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
 	    if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
@@ -204,10 +209,17 @@
 	} else {
 	    return MMSYSERR_INVALHANDLE;
 	}
+        if (!pMetric) return MMSYSERR_INVALPARAM;
 	*(LPDWORD)pMetric = val;
         break;
 
     case ACM_METRIC_COUNT_HARDWARE:
+	if (hao) return MMSYSERR_INVALHANDLE;
+        if (!pMetric) return MMSYSERR_INVALPARAM;
+	*(LPDWORD)pMetric = 0;
+        FIXME("ACM_METRIC_COUNT_HARDWARE not implemented\n");
+	break;
+
     case ACM_METRIC_HARDWARE_WAVE_INPUT:
     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
     case ACM_METRIC_MAX_SIZE_FILTER:
-------------- next part --------------
diff -u -N -r wine.cvs/dlls/msacm/tests/.cvsignore wine/dlls/msacm/tests/.cvsignore
--- wine.cvs/dlls/msacm/tests/.cvsignore	1969-12-31 19:00:00.000000000 -0500
+++ wine/dlls/msacm/tests/.cvsignore	2004-05-01 08:43:46.000000000 -0400
@@ -0,0 +1,3 @@
+Makefile
+testlist.c
+msacm.ok
diff -u -N -r wine.cvs/dlls/msacm/tests/Makefile.in wine/dlls/msacm/tests/Makefile.in
--- wine.cvs/dlls/msacm/tests/Makefile.in	1969-12-31 19:00:00.000000000 -0500
+++ wine/dlls/msacm/tests/Makefile.in	2004-04-30 18:17:13.000000000 -0400
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+TESTDLL   = msacm32.dll
+IMPORTS   = msacm32
+EXTRALIBS = 
+
+CTESTS = \
+	msacm.c
+
+ at MAKE_TEST_RULES@
+
+### Dependencies:
diff -u -N -r wine.cvs/dlls/msacm/tests/msacm.c wine/dlls/msacm/tests/msacm.c
--- wine.cvs/dlls/msacm/tests/msacm.c	1969-12-31 19:00:00.000000000 -0500
+++ wine/dlls/msacm/tests/msacm.c	2004-05-01 08:41:04.000000000 -0400
@@ -0,0 +1,327 @@
+/*
+ * Unit tests for msacm functions
+ *
+ * Copyright (c) 2004 Robert Reif
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+
+#include "wine/test.h"
+#include "windef.h"
+#include "winbase.h"
+#include "winnls.h"
+#include "mmsystem.h"
+#include "mmreg.h"
+#include "msacm.h"
+
+static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid,
+                                    LPACMFORMATDETAILS pafd,
+                                    DWORD dwInstance,
+                                    DWORD fd)
+{
+    trace("   0x%04lx, %s\n", pafd->dwFormatTag, pafd->szFormat);
+
+    return TRUE;
+}
+
+static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
+                                    DWORD dwInstance,
+                                    DWORD fdwSupport)
+{
+    MMRESULT rc;
+    ACMDRIVERDETAILS dd;
+    HACMDRIVER had;
+
+    trace("id: %p\n", hadid);
+    trace("  Supports:\n");
+    if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_ASYNC)
+        trace("    async conversions\n");
+    if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)
+        trace("    different format conversions\n");
+    if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER)
+        trace("    same format conversions\n");
+    if (fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER)
+        trace("    filtering\n");
+
+    /* try an invalid pointer */
+    rc = acmDriverDetails(hadid, 0, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALPARAM);
+
+    /* try an invalid structure size */
+    ZeroMemory(&dd, sizeof(dd));
+    rc = acmDriverDetails(hadid, &dd, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALPARAM);
+
+    dd.cbStruct = sizeof(dd) - 1;
+    rc = acmDriverDetails(hadid, &dd, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALPARAM);
+
+    /* try an invalid handle */
+    dd.cbStruct = sizeof(dd);
+    rc = acmDriverDetails((HACMDRIVERID)1, &dd, 0);
+    ok(rc == MMSYSERR_INVALHANDLE,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALHANDLE);
+
+    /* try an invalid handle and pointer */
+    rc = acmDriverDetails((HACMDRIVERID)1, 0, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALPARAM);
+
+    /* try invalid details */
+    rc = acmDriverDetails(hadid, &dd, -1);
+    ok(rc == MMSYSERR_INVALFLAG,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALFLAG);
+
+    /* try valid parameters */
+    rc = acmDriverDetails(hadid, &dd, 0);
+    ok(rc == MMSYSERR_NOERROR,
+       "acmDriverDetails(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_NOERROR);
+
+    if (rc == MMSYSERR_NOERROR) {
+        trace("  Short name: %s\n", dd.szShortName);
+        trace("  Long name: %s\n", dd.szLongName);
+        trace("  Copyright: %s\n", dd.szCopyright);
+        trace("  Licensing: %s\n", dd.szLicensing);
+        trace("  Features: %s\n", dd.szFeatures);
+        trace("  Supports %lu formats\n", dd.cFormatTags);
+        trace("  Supports %lu filter formats\n", dd.cFilterTags);
+    }
+
+    /* try invalid pointer */
+    rc = acmDriverOpen(0, hadid, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmDriverOpen(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALPARAM);
+
+    /* try invalid handle */
+    rc = acmDriverOpen(&had, (HACMDRIVERID)1, 0);
+    ok(rc == MMSYSERR_INVALHANDLE,
+       "acmDriverOpen(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALHANDLE);
+
+    /* try invalid open */
+    rc = acmDriverOpen(&had, hadid, -1);
+    ok(rc == MMSYSERR_INVALFLAG,
+       "acmDriverOpen(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_INVALFLAG);
+
+    /* try valid parameters */
+    rc = acmDriverOpen(&had, hadid, 0);
+    ok(rc == MMSYSERR_NOERROR,
+       "acmDriverOpen(): rc = %08x, should be %08x\n",
+       rc, MMSYSERR_NOERROR);
+
+    if (rc == MMSYSERR_NOERROR) {
+        DWORD dwSize;
+        WAVEFORMATEX * pwfx;
+        ACMFORMATDETAILS fd;
+
+        /* try bad pointer */
+        rc = acmMetrics((HACMOBJ)had, ACM_METRIC_MAX_SIZE_FORMAT, 0);
+        ok(rc == MMSYSERR_INVALPARAM,
+           "acmMetrics(): rc = %08x, should be %08x\n",
+           rc, MMSYSERR_INVALPARAM);
+
+        /* try bad pointer */
+        rc = acmMetrics((HACMOBJ)1, ACM_METRIC_MAX_SIZE_FORMAT, &dwSize);
+        ok(rc == MMSYSERR_INVALHANDLE,
+           "acmMetrics(): rc = %08x, should be %08x\n",
+           rc, MMSYSERR_INVALHANDLE);
+
+        /* try bad pointer and handle */
+        rc = acmMetrics((HACMOBJ)1, ACM_METRIC_MAX_SIZE_FORMAT, 0);
+        ok(rc == MMSYSERR_INVALHANDLE,
+           "acmMetrics(): rc = %08x, should be %08x\n",
+           rc, MMSYSERR_INVALHANDLE);
+
+        /* try valid parameters */
+        rc = acmMetrics((HACMOBJ)had, ACM_METRIC_MAX_SIZE_FORMAT, &dwSize);
+        ok(rc == MMSYSERR_NOERROR,
+           "acmMetrics(): rc = %08x, should be %08x\n",
+           rc, MMSYSERR_NOERROR);
+        if (rc == MMSYSERR_NOERROR) {
+            /* try bad pointer */
+            rc = acmFormatEnum(had, 0, FormatEnumProc, 0, 0);
+            ok(rc == MMSYSERR_INVALPARAM,
+               "acmFormatEnum(): rc = %08x, should be %08x\n",
+                rc, MMSYSERR_INVALPARAM);
+
+            /* try bad structure size */
+            ZeroMemory(&fd, sizeof(fd));
+            rc = acmFormatEnum(had, &fd, FormatEnumProc, 0, 0);
+            ok(rc == MMSYSERR_INVALPARAM,
+               "acmFormatEnum(): rc = %08x, should be %08x\n",
+               rc, MMSYSERR_INVALPARAM);
+
+            fd.cbStruct = sizeof(fd) - 1;
+            rc = acmFormatEnum(had, &fd, FormatEnumProc, 0, 0);
+            ok(rc == MMSYSERR_INVALPARAM,
+               "acmFormatEnum(): rc = %08x, should be %08x\n",
+               rc, MMSYSERR_INVALPARAM);
+
+            if (dwSize < sizeof(WAVEFORMATEX))
+                dwSize = sizeof(WAVEFORMATEX);
+
+            pwfx = (WAVEFORMATEX *) malloc(dwSize);
+
+            ZeroMemory(pwfx, dwSize);
+            pwfx->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);
+            pwfx->wFormatTag = WAVE_FORMAT_UNKNOWN;
+
+            fd.cbStruct = sizeof(fd);
+            fd.pwfx = pwfx;
+            fd.cbwfx = dwSize;
+            fd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
+
+            /* try valid parameters */
+            rc = acmFormatEnum(had, &fd, FormatEnumProc, 0, 0);
+            ok(rc == MMSYSERR_NOERROR,
+               "acmFormatEnum(): rc = %08x, should be %08x\n",
+               rc, MMSYSERR_NOERROR);
+
+            free(pwfx);
+
+            acmDriverClose(had, 0);
+        }
+    }
+
+    return TRUE;
+}
+
+static const char * get_metric(UINT uMetric)
+{
+    switch (uMetric) {
+    case ACM_METRIC_COUNT_CODECS:
+        return "ACM_METRIC_COUNT_CODECS";
+    case ACM_METRIC_COUNT_CONVERTERS:
+        return "ACM_METRIC_COUNT_CONVERTERS";
+    case ACM_METRIC_COUNT_DISABLED:
+        return "ACM_METRIC_COUNT_DISABLED";
+    case ACM_METRIC_COUNT_DRIVERS:
+        return "ACM_METRIC_COUNT_DRIVERS";
+    case ACM_METRIC_COUNT_FILTERS:
+        return "ACM_METRIC_COUNT_FILTERS";
+    case ACM_METRIC_COUNT_HARDWARE:
+        return "ACM_METRIC_COUNT_HARDWARE";
+    case ACM_METRIC_COUNT_LOCAL_CODECS:
+        return "ACM_METRIC_COUNT_LOCAL_CODECS";
+    case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
+        return "ACM_METRIC_COUNT_LOCAL_CONVERTERS";
+    case ACM_METRIC_COUNT_LOCAL_DISABLED:
+        return "ACM_METRIC_COUNT_LOCAL_DISABLED";
+    case ACM_METRIC_COUNT_LOCAL_DRIVERS:
+        return "ACM_METRIC_COUNT_LOCAL_DRIVERS";
+    case ACM_METRIC_COUNT_LOCAL_FILTERS:
+        return "ACM_METRIC_COUNT_LOCAL_FILTERS";
+    case ACM_METRIC_DRIVER_PRIORITY:
+        return "ACM_METRIC_DRIVER_PRIORITY";
+    case ACM_METRIC_DRIVER_SUPPORT:
+        return "ACM_METRIC_DRIVER_SUPPORT";
+    case ACM_METRIC_HARDWARE_WAVE_INPUT:
+        return "ACM_METRIC_HARDWARE_WAVE_INPUT";
+    case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
+        return "ACM_METRIC_HARDWARE_WAVE_OUTPUT";
+    case ACM_METRIC_MAX_SIZE_FILTER:
+        return "ACM_METRIC_MAX_SIZE_FILTER";
+    case ACM_METRIC_MAX_SIZE_FORMAT:
+        return "ACM_METRIC_MAX_SIZE_FORMAT";
+    }
+
+    return "UNKNOWN";
+}
+
+static DWORD check_count(UINT uMetric)
+{
+    DWORD dwMetric;
+    MMRESULT rc;
+
+    /* try invalid result pointer */
+    rc = acmMetrics(NULL, uMetric, 0);
+    ok(rc == MMSYSERR_INVALPARAM,
+       "acmMetrics(NULL, %s, 0): rc = 0x%08x, should be 0x%08x\n",
+       get_metric(uMetric), rc, MMSYSERR_INVALPARAM);
+
+    /* try invalid handle */
+    rc = acmMetrics((HACMOBJ)1, uMetric, &dwMetric);
+    ok(rc == MMSYSERR_INVALHANDLE,
+       "acmMetrics(1, %s, %p): rc = 0x%08x, should be 0x%08x\n",
+       get_metric(uMetric), &dwMetric,  rc, MMSYSERR_INVALHANDLE);
+
+    /* try invalid result pointer and handle */
+    rc = acmMetrics((HACMOBJ)1, uMetric, 0);
+    ok(rc == MMSYSERR_INVALHANDLE,
+       "acmMetrics(1, %s, 0): rc = 0x%08x, should be 0x%08x\n",
+       get_metric(uMetric), rc, MMSYSERR_INVALHANDLE);
+
+    /* try valid parameters */
+    rc = acmMetrics(NULL, uMetric, &dwMetric);
+    ok(rc == MMSYSERR_NOERROR, "acmMetrics() failed: rc = 0x%08x\n", rc);
+
+    if (rc == MMSYSERR_NOERROR)
+        trace("%s: %lu\n", get_metric(uMetric), dwMetric);
+
+    return dwMetric;
+}
+
+static void msacm_tests()
+{
+    MMRESULT rc;
+    DWORD dwCount;
+    DWORD dwACMVersion = acmGetVersion();
+
+    trace("ACM version = %u.%02u build %u%s\n",
+        HIWORD(dwACMVersion) >> 8,
+        HIWORD(dwACMVersion) & 0xff,
+        LOWORD(dwACMVersion),
+        LOWORD(dwACMVersion)  ==  0 ? " (Retail)" : "");
+
+    dwCount = check_count(ACM_METRIC_COUNT_CODECS);
+    dwCount = check_count(ACM_METRIC_COUNT_CONVERTERS);
+    dwCount = check_count(ACM_METRIC_COUNT_DISABLED);
+    dwCount = check_count(ACM_METRIC_COUNT_DRIVERS);
+    dwCount = check_count(ACM_METRIC_COUNT_FILTERS);
+    dwCount = check_count(ACM_METRIC_COUNT_HARDWARE);
+    dwCount = check_count(ACM_METRIC_COUNT_LOCAL_CODECS);
+    dwCount = check_count(ACM_METRIC_COUNT_LOCAL_CONVERTERS);
+    dwCount = check_count(ACM_METRIC_COUNT_LOCAL_DISABLED);
+    dwCount = check_count(ACM_METRIC_COUNT_LOCAL_DRIVERS);
+    dwCount = check_count(ACM_METRIC_COUNT_LOCAL_FILTERS);
+
+    trace("enabled drivers:\n");
+    rc = acmDriverEnum(DriverEnumProc, 0, 0);
+    ok(rc == MMSYSERR_NOERROR,
+      "acmDriverEnum() failed, rc=%08x, should be 0x%08x\n",
+      rc, MMSYSERR_NOERROR);
+}
+
+START_TEST(msacm)
+{
+    msacm_tests();
+}


More information about the wine-patches mailing list