1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
26 /**********************************************************************/
28 HINSTANCE MSACM_hInstance32
= 0;
30 /***********************************************************************
31 * DllMain (MSACM32.init)
33 BOOL WINAPI
DllMain(HINSTANCE hInstDLL
, DWORD fdwReason
, LPVOID lpvReserved
)
35 TRACE("%p 0x%x %p\n", hInstDLL
, fdwReason
, lpvReserved
);
38 case DLL_PROCESS_ATTACH
:
39 DisableThreadLibraryCalls(hInstDLL
);
40 MSACM_hHeap
= HeapCreate(0, 0x10000, 0);
41 MSACM_hInstance32
= hInstDLL
;
42 MSACM_RegisterAllDrivers();
44 case DLL_PROCESS_DETACH
:
45 MSACM_UnregisterAllDrivers();
46 if (lpvReserved
) break;
47 HeapDestroy(MSACM_hHeap
);
55 /***********************************************************************
56 * XRegThunkEntry (MSACM32.1)
58 * No documentation found.
61 /***********************************************************************
62 * acmGetVersion (MSACM32.@)
64 DWORD WINAPI
acmGetVersion(void)
66 OSVERSIONINFOA version
;
68 version
.dwOSVersionInfoSize
= sizeof(OSVERSIONINFOA
);
69 if (!GetVersionExA( &version
))
72 switch (version
.dwPlatformId
) {
73 case VER_PLATFORM_WIN32_NT
:
74 return 0x04000565; /* 4.0.1381 */
75 case VER_PLATFORM_WIN32s
:
76 return 0x02010000; /* 2.1 */
78 FIXME("%x not supported\n", version
.dwPlatformId
);
80 case VER_PLATFORM_WIN32_WINDOWS
:
81 return 0x04030000; /* 4.3.0 */
85 /***********************************************************************
86 * acmMessage32 (MSACM32.35)
88 * No documentation found.
91 /***********************************************************************
92 * acmMetrics (MSACM32.@)
94 MMRESULT WINAPI
acmMetrics(HACMOBJ hao
, UINT uMetric
, LPVOID pMetric
)
96 PWINE_ACMOBJ pao
= MSACM_GetObj(hao
, WINE_ACMOBJ_DONTCARE
);
98 PWINE_ACMDRIVERID padid
;
101 MMRESULT mmr
= MMSYSERR_NOERROR
;
103 TRACE("(%p, %d, %p);\n", hao
, uMetric
, pMetric
);
105 #define CheckLocal(padid) (!bLocal || ((padid)->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_LOCAL))
108 case ACM_METRIC_COUNT_DRIVERS
:
111 case ACM_METRIC_COUNT_LOCAL_DRIVERS
:
112 if (hao
) return MMSYSERR_INVALHANDLE
;
113 if (!pMetric
) return MMSYSERR_INVALPARAM
;
114 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
115 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) && CheckLocal(padid
))
117 *(LPDWORD
)pMetric
= val
;
120 case ACM_METRIC_COUNT_CODECS
:
123 case ACM_METRIC_COUNT_LOCAL_CODECS
:
124 if (hao
) return MMSYSERR_INVALHANDLE
;
125 if (!pMetric
) return MMSYSERR_INVALPARAM
;
126 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
127 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
128 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_CODEC
) &&
131 *(LPDWORD
)pMetric
= val
;
134 case ACM_METRIC_COUNT_CONVERTERS
:
137 case ACM_METRIC_COUNT_LOCAL_CONVERTERS
:
138 if (hao
) return MMSYSERR_INVALHANDLE
;
139 if (!pMetric
) return MMSYSERR_INVALPARAM
;
140 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
141 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
142 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_CONVERTER
) &&
145 *(LPDWORD
)pMetric
= val
;
148 case ACM_METRIC_COUNT_FILTERS
:
151 case ACM_METRIC_COUNT_LOCAL_FILTERS
:
152 if (hao
) return MMSYSERR_INVALHANDLE
;
153 if (!pMetric
) return MMSYSERR_INVALPARAM
;
154 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
155 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) &&
156 (padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_FILTER
) &&
159 *(LPDWORD
)pMetric
= val
;
162 case ACM_METRIC_COUNT_DISABLED
:
165 case ACM_METRIC_COUNT_LOCAL_DISABLED
:
166 if (hao
) return MMSYSERR_INVALHANDLE
;
167 if (!pMetric
) return MMSYSERR_INVALPARAM
;
168 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
)
169 if ((padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
) && CheckLocal(padid
))
171 *(LPDWORD
)pMetric
= val
;
174 case ACM_METRIC_MAX_SIZE_FORMAT
:
176 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
) {
177 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
)) {
178 for (i
= 0; i
< padid
->cFormatTags
; i
++) {
179 if (val
< padid
->aFormatTag
[i
].cbwfx
)
180 val
= padid
->aFormatTag
[i
].cbwfx
;
184 } else if (pao
!= NULL
) {
185 switch (pao
->dwType
) {
186 case WINE_ACMOBJ_DRIVER
:
187 case WINE_ACMOBJ_DRIVERID
:
188 padid
= pao
->pACMDriverID
;
191 return MMSYSERR_INVALHANDLE
;
193 if (!(padid
->fdwSupport
& ACMDRIVERDETAILS_SUPPORTF_DISABLED
)) {
194 for (i
= 0; i
< padid
->cFormatTags
; i
++) {
195 if (val
< padid
->aFormatTag
[i
].cbwfx
)
196 val
= padid
->aFormatTag
[i
].cbwfx
;
200 return MMSYSERR_INVALHANDLE
;
202 if (!pMetric
) return MMSYSERR_INVALPARAM
;
203 *(LPDWORD
)pMetric
= val
;
206 case ACM_METRIC_COUNT_HARDWARE
:
207 if (hao
) return MMSYSERR_INVALHANDLE
;
208 if (!pMetric
) return MMSYSERR_INVALPARAM
;
209 *(LPDWORD
)pMetric
= 0;
210 FIXME("ACM_METRIC_COUNT_HARDWARE not implemented\n");
213 case ACM_METRIC_DRIVER_PRIORITY
:
214 /* Return current list position of driver */
215 if (!hao
) return MMSYSERR_INVALHANDLE
;
216 mmr
= MMSYSERR_INVALHANDLE
;
217 for (i
= 1, padid
= MSACM_pFirstACMDriverID
; padid
; i
++, padid
= padid
->pNextACMDriverID
) {
218 if (padid
== (PWINE_ACMDRIVERID
)hao
) {
220 *(LPDWORD
)pMetric
= i
;
221 mmr
= MMSYSERR_NOERROR
;
223 mmr
= MMSYSERR_INVALPARAM
;
230 case ACM_METRIC_DRIVER_SUPPORT
:
231 /* Return fdwSupport for driver */
232 if (!hao
) return MMSYSERR_INVALHANDLE
;
233 mmr
= MMSYSERR_INVALHANDLE
;
234 for (padid
= MSACM_pFirstACMDriverID
; padid
; padid
= padid
->pNextACMDriverID
) {
235 if (padid
== (PWINE_ACMDRIVERID
)hao
) {
237 *(LPDWORD
)pMetric
= padid
->fdwSupport
;
238 mmr
= MMSYSERR_NOERROR
;
240 mmr
= MMSYSERR_INVALPARAM
;
247 case ACM_METRIC_HARDWARE_WAVE_INPUT
:
248 case ACM_METRIC_HARDWARE_WAVE_OUTPUT
:
249 case ACM_METRIC_MAX_SIZE_FILTER
:
251 FIXME("(%p, %d, %p): stub\n", hao
, uMetric
, pMetric
);
252 mmr
= MMSYSERR_NOTSUPPORTED
;