Implemented most of '*Format*' API.
Improved internal object and messages handling.
Started some '*Filter*' functions.
Fixed standard headers for Winelib.
Fixed acmMetrics.

diff --git a/dlls/msacm/msacm32_main.c b/dlls/msacm/msacm32_main.c
index 6a9b834..274f9d5 100644
--- a/dlls/msacm/msacm32_main.c
+++ b/dlls/msacm/msacm32_main.c
@@ -20,6 +20,7 @@
 /**********************************************************************/
 	
 static DWORD MSACM_dwProcessesAttached = 0;
+HINSTANCE	MSACM_hInstance32 = 0;
 
 /***********************************************************************
  *           MSACM_LibMain (MSACM32.init) 
@@ -32,6 +33,7 @@
     case DLL_PROCESS_ATTACH:
 	if (MSACM_dwProcessesAttached == 0) {
 	    MSACM_hHeap = HeapCreate(0, 0x10000, 0);
+	    MSACM_hInstance32 = hInstDLL;
 	    MSACM_RegisterAllDrivers();
 	}
 	MSACM_dwProcessesAttached++;
@@ -42,6 +44,7 @@
 	    MSACM_UnregisterAllDrivers();
 	    HeapDestroy(MSACM_hHeap);
 	    MSACM_hHeap = (HANDLE) NULL;
+	    MSACM_hInstance32 = (HINSTANCE)NULL;
 	}
 	break;
     case DLL_THREAD_ATTACH:
@@ -87,14 +90,15 @@
 /***********************************************************************
  *           acmMetrics (MSACM32.36)
  */
-MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID  pMetric)
+MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
 {
-    PWINE_ACMOBJ 	pao = MSACM_GetObj(hao);
+    PWINE_ACMOBJ 	pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
     BOOL 		bLocal = TRUE;
     PWINE_ACMDRIVERID	padid;
     DWORD		val = 0;
+    MMRESULT		mmr = MMSYSERR_NOERROR;
 
-    FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
+    TRACE("(0x%08x, %d, %p);\n", hao, uMetric, pMetric);
     
     switch (uMetric) {
     case ACM_METRIC_COUNT_DRIVERS:
@@ -107,7 +111,7 @@
 	    if (padid->bEnabled /* && (local(padid) || !bLocal) */)
 		val++;
 	*(LPDWORD)pMetric = val;
-	return 0;
+	break;
 
     case ACM_METRIC_COUNT_CODECS:
 	if (!pao)
@@ -120,7 +124,7 @@
 	    if (padid->bEnabled /* && (local(padid) || !bLocal) */)
 		val++;
 	*(LPDWORD)pMetric = val;
-	return 0;
+	break;
 
     case ACM_METRIC_COUNT_CONVERTERS:
 	bLocal = FALSE;
@@ -131,7 +135,7 @@
 	    if (padid->bEnabled /* && (local(padid) || !bLocal) */)
 		val++;
 	*(LPDWORD)pMetric = val;
-	return 0;
+	break;
 
     case ACM_METRIC_COUNT_FILTERS:
 	bLocal = FALSE;
@@ -142,7 +146,7 @@
 	    if (padid->bEnabled /* && (local(padid) || !bLocal) */)
 		val++;
 	*(LPDWORD)pMetric = val;
-	return 0;
+	break;
 
     case ACM_METRIC_COUNT_DISABLED:
 	bLocal = FALSE;
@@ -154,14 +158,33 @@
 	    if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
 		val++;
 	*(LPDWORD)pMetric = val;
-	return 0;
+	break;
     
     case ACM_METRIC_MAX_SIZE_FORMAT:
-        /* FIXME: According to MSDN, this should return the size of the largest WAVEFORMATEX
-           structure in the system. How is this calculated? */
-        *(LPDWORD)pMetric = sizeof (WAVEFORMATEX);   
-        return 0;
-        
+	{
+	    ACMFORMATTAGDETAILSW	aftd;
+
+	    aftd.cbStruct = sizeof(aftd);
+	    aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
+
+	    if (hao == (HACMOBJ)NULL) {
+		mmr = acmFormatTagDetailsW((HACMDRIVER)NULL, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
+	    } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVER)) {
+		mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
+	    } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVERID)) {
+		HACMDRIVER	had;
+		
+		if (acmDriverOpen(&had, (HACMDRIVERID)hao, 0) == 0) {
+		    mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
+		    acmDriverClose(had, 0);
+		}
+	    } else {
+		mmr = MMSYSERR_INVALHANDLE;
+	    }
+	    if (mmr == MMSYSERR_NOERROR) *(LPDWORD)pMetric = aftd.cbFormatSize;
+	}
+        break;
+
     case ACM_METRIC_COUNT_HARDWARE:
     case ACM_METRIC_HARDWARE_WAVE_INPUT:
     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
@@ -169,7 +192,8 @@
     case ACM_METRIC_DRIVER_SUPPORT:
     case ACM_METRIC_DRIVER_PRIORITY:
     default:
-	return MMSYSERR_NOTSUPPORTED;
+	FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
+	mmr = MMSYSERR_NOTSUPPORTED;
     }
-    return MMSYSERR_NOERROR;
+    return mmr;
 }