1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
13 #include "debugtools.h"
18 DEFAULT_DEBUG_CHANNEL(msacm
);
20 /**********************************************************************/
22 HINSTANCE MSACM_hInstance32
= 0;
24 /***********************************************************************
25 * MSACM_LibMain (MSACM32.init)
27 BOOL WINAPI
MSACM32_LibMain(HINSTANCE hInstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
29 TRACE("0x%x 0x%lx %p\n", hInstDLL
, fdwReason
, lpvReserved
);
32 case DLL_PROCESS_ATTACH
:
33 MSACM_hHeap
= HeapCreate(0, 0x10000, 0);
34 MSACM_hInstance32
= hInstDLL
;
35 MSACM_RegisterAllDrivers();
37 case DLL_PROCESS_DETACH
:
38 MSACM_UnregisterAllDrivers();
39 HeapDestroy(MSACM_hHeap
);
40 MSACM_hHeap
= (HANDLE
)NULL
;
41 MSACM_hInstance32
= (HINSTANCE
)NULL
;
43 case DLL_THREAD_ATTACH
:
45 case DLL_THREAD_DETACH
:
53 /***********************************************************************
54 * XRegThunkEntry (MSACM32.1)
56 * No documentation found.
59 /***********************************************************************
60 * acmGetVersion (MSACM32.@)
62 DWORD WINAPI
acmGetVersion(void)
64 OSVERSIONINFOA version
;
66 version
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOA
);
67 if (!GetVersionExA( &version
))
70 switch (version
.dwPlatformId
) {
71 case VER_PLATFORM_WIN32_NT
:
72 return 0x04000565; /* 4.0.1381 */
74 FIXME("%lx not supported\n", version
.dwPlatformId
);
75 case VER_PLATFORM_WIN32_WINDOWS
:
76 return 0x04030000; /* 4.3.0 */
80 /***********************************************************************
81 * acmMessage32 (MSACM32.35)
83 * No documentation found.
86 /***********************************************************************
87 * acmMetrics (MSACM32.@)
89 MMRESULT WINAPI
acmMetrics(HACMOBJ hao
, UINT uMetric
, LPVOID pMetric
)
91 PWINE_ACMOBJ pao
= MSACM_GetObj(hao
, WINE_ACMOBJ_DONTCARE
);
93 PWINE_ACMDRIVERID padid
;
96 MMRESULT mmr
= MMSYSERR_NOERROR
;
98 TRACE("(0x%08x, %d, %p);\n", hao
, uMetric
, pMetric
);
100 #define CheckLocal(padid) (!bLocal || ((padid)->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_LOCAL))
103 case ACM_METRIC_COUNT_DRIVERS
:
106 case ACM_METRIC_COUNT_LOCAL_DRIVERS
:
107 if (hao
) return MMSYSERR_INVALHANDLE
;
108 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
109 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) && CheckLocal(padid
))
111 *(LPDWORD
)pMetric
= val
;
114 case ACM_METRIC_COUNT_CODECS
:
117 case ACM_METRIC_COUNT_LOCAL_CODECS
:
118 if (hao
) return MMSYSERR_INVALHANDLE
;
119 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
120 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
121 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_CODEC
) &&
124 *(LPDWORD
)pMetric
= val
;
127 case ACM_METRIC_COUNT_CONVERTERS
:
130 case ACM_METRIC_COUNT_LOCAL_CONVERTERS
:
131 if (hao
) return MMSYSERR_INVALHANDLE
;
132 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
133 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
134 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_CONVERTER
) &&
137 *(LPDWORD
)pMetric
= val
;
140 case ACM_METRIC_COUNT_FILTERS
:
143 case ACM_METRIC_COUNT_LOCAL_FILTERS
:
144 if (hao
) return MMSYSERR_INVALHANDLE
;
145 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
146 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
147 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_FILTER
) &&
150 *(LPDWORD
)pMetric
= val
;
153 case ACM_METRIC_COUNT_DISABLED
:
156 case ACM_METRIC_COUNT_LOCAL_DISABLED
:
157 if (hao
) return MMSYSERR_INVALHANDLE
;
158 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
159 if ((padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) && CheckLocal(padid
))
161 *(LPDWORD
)pMetric
= val
;
164 case ACM_METRIC_MAX_SIZE_FORMAT
:
165 if (hao
== (HACMOBJ
)NULL
) {
166 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
) {
167 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
)) {
168 for (i
= 0; i
< padid
->cFormatTags
; i
++) {
169 if (val
< padid
->aFormatTag
[i
].cbwfx
)
170 val
= padid
->aFormatTag
[i
].cbwfx
;
174 } else if (pao
!= NULL
) {
175 switch (pao
->dwType
) {
176 case WINE_ACMOBJ_DRIVER
:
177 case WINE_ACMOBJ_DRIVERID
:
178 padid
= pao
->pACMDriverID
;
181 return MMSYSERR_INVALHANDLE
;
183 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
)) {
184 for (i
= 0; i
< padid
->cFormatTags
; i
++) {
185 if (val
< padid
->aFormatTag
[i
].cbwfx
)
186 val
= padid
->aFormatTag
[i
].cbwfx
;
190 return MMSYSERR_INVALHANDLE
;
192 *(LPDWORD
)pMetric
= val
;
195 case ACM_METRIC_COUNT_HARDWARE
:
196 case ACM_METRIC_HARDWARE_WAVE_INPUT
:
197 case ACM_METRIC_HARDWARE_WAVE_OUTPUT
:
198 case ACM_METRIC_MAX_SIZE_FILTER
:
199 case ACM_METRIC_DRIVER_SUPPORT
:
200 case ACM_METRIC_DRIVER_PRIORITY
:
202 FIXME("(0x%08x, %d, %p): stub\n", hao
, uMetric
, pMetric
);
203 mmr
= MMSYSERR_NOTSUPPORTED
;