1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
13 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(msacm);
20 /**********************************************************************/
22 static DWORD MSACM_dwProcessesAttached = 0;
23 HINSTANCE MSACM_hInstance32 = 0;
25 /***********************************************************************
26 * MSACM_LibMain (MSACM32.init)
28 BOOL WINAPI MSACM32_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
30 TRACE("0x%x 0x%lx %p\n", hInstDLL, fdwReason, lpvReserved);
33 case DLL_PROCESS_ATTACH:
34 if (MSACM_dwProcessesAttached == 0) {
35 MSACM_hHeap = HeapCreate(0, 0x10000, 0);
36 MSACM_hInstance32 = hInstDLL;
37 MSACM_RegisterAllDrivers();
39 MSACM_dwProcessesAttached++;
41 case DLL_PROCESS_DETACH:
42 MSACM_dwProcessesAttached--;
43 if (MSACM_dwProcessesAttached == 0) {
44 MSACM_UnregisterAllDrivers();
45 HeapDestroy(MSACM_hHeap);
46 MSACM_hHeap = (HANDLE) NULL;
47 MSACM_hInstance32 = (HINSTANCE)NULL;
50 case DLL_THREAD_ATTACH:
52 case DLL_THREAD_DETACH:
60 /***********************************************************************
61 * XRegThunkEntry (MSACM32.1)
63 * No documentation found.
66 /***********************************************************************
67 * acmGetVersion (MSACM32.34)
69 DWORD WINAPI acmGetVersion(void)
71 OSVERSIONINFOA version;
72 GetVersionExA( &version );
73 switch(version.dwPlatformId)
75 case VER_PLATFORM_WIN32_NT:
76 return 0x04000565; /* 4.0.1381 */
78 FIXME("%ld not supported",version.dwPlatformId);
79 case VER_PLATFORM_WIN32_WINDOWS:
80 return 0x04000000; /* 4.0.0 */
84 /***********************************************************************
85 * acmMessage32 (MSACM32.35)
87 * No documentation found.
90 /***********************************************************************
91 * acmMetrics (MSACM32.36)
93 MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
95 PWINE_ACMOBJ pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
97 PWINE_ACMDRIVERID padid;
99 MMRESULT mmr = MMSYSERR_NOERROR;
101 TRACE("(0x%08x, %d, %p);\n", hao, uMetric, pMetric);
104 case ACM_METRIC_COUNT_DRIVERS:
107 case ACM_METRIC_COUNT_LOCAL_DRIVERS:
109 return MMSYSERR_INVALHANDLE;
110 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
111 if (padid->bEnabled /* && (local(padid) || !bLocal) */)
113 *(LPDWORD)pMetric = val;
116 case ACM_METRIC_COUNT_CODECS:
118 return MMSYSERR_INVALHANDLE;
121 case ACM_METRIC_COUNT_LOCAL_CODECS:
122 /* FIXME: don't know how to differentiate codec, converters & filters yet */
123 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
124 if (padid->bEnabled /* && (local(padid) || !bLocal) */)
126 *(LPDWORD)pMetric = val;
129 case ACM_METRIC_COUNT_CONVERTERS:
132 case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
133 /* FIXME: don't know how to differentiate codec, converters & filters yet */
134 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
135 if (padid->bEnabled /* && (local(padid) || !bLocal) */)
137 *(LPDWORD)pMetric = val;
140 case ACM_METRIC_COUNT_FILTERS:
143 case ACM_METRIC_COUNT_LOCAL_FILTERS:
144 /* FIXME: don't know how to differentiate codec, converters & filters yet */
145 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
146 if (padid->bEnabled /* && (local(padid) || !bLocal) */)
148 *(LPDWORD)pMetric = val;
151 case ACM_METRIC_COUNT_DISABLED:
154 case ACM_METRIC_COUNT_LOCAL_DISABLED:
156 return MMSYSERR_INVALHANDLE;
157 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
158 if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
160 *(LPDWORD)pMetric = val;
163 case ACM_METRIC_MAX_SIZE_FORMAT:
165 ACMFORMATTAGDETAILSW aftd;
167 aftd.cbStruct = sizeof(aftd);
168 aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
170 if (hao == (HACMOBJ)NULL) {
171 mmr = acmFormatTagDetailsW((HACMDRIVER)NULL, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
172 } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVER)) {
173 mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
174 } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVERID)) {
177 if (acmDriverOpen(&had, (HACMDRIVERID)hao, 0) == 0) {
178 mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
179 acmDriverClose(had, 0);
182 mmr = MMSYSERR_INVALHANDLE;
184 if (mmr == MMSYSERR_NOERROR) *(LPDWORD)pMetric = aftd.cbFormatSize;
188 case ACM_METRIC_COUNT_HARDWARE:
189 case ACM_METRIC_HARDWARE_WAVE_INPUT:
190 case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
191 case ACM_METRIC_MAX_SIZE_FILTER:
192 case ACM_METRIC_DRIVER_SUPPORT:
193 case ACM_METRIC_DRIVER_PRIORITY:
195 FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
196 mmr = MMSYSERR_NOTSUPPORTED;