Mimic more closely Windows' behavior (a MSACM driver is always opened
twice: first time for info gathering, subsequent openings for
conversions).
Added format suggestion for PCM.
Cleaned up internal structures.

diff --git a/dlls/msacm/msacm32_main.c b/dlls/msacm/msacm32_main.c
index 09ab89c..320caff 100644
--- a/dlls/msacm/msacm32_main.c
+++ b/dlls/msacm/msacm32_main.c
@@ -106,7 +106,7 @@
     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
-	    if (padid->bEnabled && CheckLocal(padid))
+	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
 	*(LPDWORD)pMetric = val;
 	break;
@@ -117,8 +117,9 @@
     case ACM_METRIC_COUNT_LOCAL_CODECS:
 	if (hao) return MMSYSERR_INVALHANDLE;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
-	    if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC)
-		&& CheckLocal(padid))
+	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && 
+		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
+		CheckLocal(padid))
 		val++;
 	*(LPDWORD)pMetric = val;
 	break;
@@ -129,8 +130,9 @@
     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
-	    if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER)
-		&& CheckLocal(padid))
+	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && 
+		 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
+		CheckLocal(padid))
 		val++;
 	*(LPDWORD)pMetric = val;
 	break;
@@ -141,8 +143,9 @@
     case ACM_METRIC_COUNT_LOCAL_FILTERS:
 	if (hao) return MMSYSERR_INVALHANDLE;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
-	    if (padid->bEnabled && (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER)
-		&& CheckLocal(padid))
+	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && 
+		(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) && 
+		CheckLocal(padid))
 		val++;
 	*(LPDWORD)pMetric = val;
 	break;
@@ -153,7 +156,7 @@
     case ACM_METRIC_COUNT_LOCAL_DISABLED:
 	if (hao) return MMSYSERR_INVALHANDLE;
 	for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
-	    if (!padid->bEnabled && CheckLocal(padid))
+	    if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
 		val++;
 	*(LPDWORD)pMetric = val;
 	break;
@@ -161,7 +164,7 @@
     case ACM_METRIC_MAX_SIZE_FORMAT:
 	if (hao == (HACMOBJ)NULL) {
 	    for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
-		if (padid->bEnabled) {
+		if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
 		    for (i = 0; i < padid->cFormatTags; i++) {
 			if (val < padid->aFormatTag[i].cbwfx)
 			    val = padid->aFormatTag[i].cbwfx;
@@ -177,7 +180,7 @@
 	    default:
 		return MMSYSERR_INVALHANDLE;
 	    }
-	    if (padid->bEnabled) {
+	    if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
 		for (i = 0; i < padid->cFormatTags; i++) {
 		    if (val < padid->aFormatTag[i].cbwfx)
 			val = padid->aFormatTag[i].cbwfx;