4 * Copyright 1998 Patrik Stridvall
11 #include "debugtools.h"
19 DEFAULT_DEBUG_CHANNEL(msacm
)
21 /***********************************************************************
22 * acmDriverAddA (MSACM32.2)
24 MMRESULT WINAPI
acmDriverAddA(
25 PHACMDRIVERID phadid
, HINSTANCE hinstModule
,
26 LPARAM lParam
, DWORD dwPriority
, DWORD fdwAdd
)
28 PWINE_ACMLOCALDRIVER pld
;
30 return MMSYSERR_INVALPARAM
;
32 /* Check if any unknown flags */
34 ~(ACM_DRIVERADDF_FUNCTION
|ACM_DRIVERADDF_NOTIFYHWND
|
35 ACM_DRIVERADDF_GLOBAL
))
36 return MMSYSERR_INVALFLAG
;
38 /* Check if any incompatible flags */
39 if((fdwAdd
& ACM_DRIVERADDF_FUNCTION
) &&
40 (fdwAdd
& ACM_DRIVERADDF_NOTIFYHWND
))
41 return MMSYSERR_INVALFLAG
;
43 pld
= HeapAlloc(MSACM_hHeap
, 0, sizeof(WINE_ACMLOCALDRIVER
));
44 pld
->pfnDriverProc
= (DRIVERPROC
)
45 GetProcAddress(hinstModule
, "DriverProc");
46 *phadid
= (HACMDRIVERID
) MSACM_RegisterDriver(NULL
, NULL
, pld
);
48 /* FIXME: lParam, dwPriority and fdwAdd ignored */
50 return MMSYSERR_NOERROR
;
53 /***********************************************************************
54 * acmDriverAddW (MSACM32.3)
58 MMRESULT WINAPI
acmDriverAddW(
59 PHACMDRIVERID phadid
, HINSTANCE hinstModule
,
60 LPARAM lParam
, DWORD dwPriority
, DWORD fdwAdd
)
62 FIXME("(%p, 0x%08x, %ld, %ld, %ld): stub\n",
63 phadid
, hinstModule
, lParam
, dwPriority
, fdwAdd
65 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
66 return MMSYSERR_ERROR
;
69 /***********************************************************************
70 * acmDriverClose (MSACM32.4)
72 MMRESULT WINAPI
acmDriverClose(
73 HACMDRIVER had
, DWORD fdwClose
)
78 return MMSYSERR_INVALFLAG
;
80 p
= MSACM_GetDriver(had
);
82 return MMSYSERR_INVALHANDLE
;
84 p
->obj
.pACMDriverID
->pACMDriver
= NULL
;
86 /* FIXME: CloseDriver32 not implemented */
89 CloseDriver(p
->hDrvr
, 0, 0);
92 HeapFree(MSACM_hHeap
, 0, p
);
94 return MMSYSERR_NOERROR
;
97 /***********************************************************************
98 * acmDriverDetailsA (MSACM32.5)
100 MMRESULT WINAPI
acmDriverDetailsA(
101 HACMDRIVERID hadid
, PACMDRIVERDETAILSA padd
, DWORD fdwDetails
)
107 p
= MSACM_GetDriverID(hadid
);
109 return MMSYSERR_INVALHANDLE
;
112 return MMSYSERR_INVALFLAG
;
114 bOpenTemporary
= !p
->pACMDriver
;
116 bOpenTemporary
= TRUE
;
117 acmDriverOpen((PHACMDRIVER
) &p
->pACMDriver
, hadid
, 0);
121 * How does the driver know if the ANSI or
122 * the UNICODE variant of PACMDRIVERDETAILS is used?
123 * It might check cbStruct or does it only accept ANSI.
125 mmr
= (MMRESULT
) acmDriverMessage(
126 (HACMDRIVER
) p
->pACMDriver
, ACMDM_DRIVER_DETAILS
,
131 acmDriverClose((HACMDRIVER
) p
->pACMDriver
, 0);
132 p
->pACMDriver
= NULL
;
138 /***********************************************************************
139 * acmDriverDetailsW (MSACM32.6)
143 MMRESULT WINAPI
acmDriverDetailsW(
144 HACMDRIVERID hadid
, PACMDRIVERDETAILSW padd
, DWORD fdwDetails
)
146 FIXME("(0x%08x, %p, %ld): stub\n", hadid
, padd
, fdwDetails
);
147 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
148 return MMSYSERR_ERROR
;
151 /***********************************************************************
152 * acmDriverEnum (MSACM32.7)
154 MMRESULT WINAPI
acmDriverEnum(
155 ACMDRIVERENUMCB fnCallback
, DWORD dwInstance
, DWORD fdwEnum
)
161 return MMSYSERR_INVALPARAM
;
164 if(fdwEnum
&& ~(ACM_DRIVERENUMF_NOLOCAL
|ACM_DRIVERENUMF_DISABLED
))
166 return MMSYSERR_INVALFLAG
;
169 p
= MSACM_pFirstACMDriverID
;
172 (*fnCallback
)((HACMDRIVERID
) p
, dwInstance
, ACMDRIVERDETAILS_SUPPORTF_CODEC
);
173 p
= p
->pNextACMDriverID
;
176 return MMSYSERR_NOERROR
;
179 /***********************************************************************
180 * acmDriverID (MSACM32.8)
182 MMRESULT WINAPI
acmDriverID(
183 HACMOBJ hao
, PHACMDRIVERID phadid
, DWORD fdwDriverID
)
187 pao
= MSACM_GetObj(hao
);
189 return MMSYSERR_INVALHANDLE
;
192 return MMSYSERR_INVALPARAM
;
195 return MMSYSERR_INVALFLAG
;
197 *phadid
= (HACMDRIVERID
) pao
->pACMDriverID
;
199 return MMSYSERR_NOERROR
;
202 /***********************************************************************
203 * acmDriverMessage (MSACM32.9)
207 LRESULT WINAPI
acmDriverMessage(
208 HACMDRIVER had
, UINT uMsg
, LPARAM lParam1
, LPARAM lParam2
)
210 PWINE_ACMDRIVER pad
= MSACM_GetDriver(had
);
212 return MMSYSERR_INVALPARAM
;
214 /* FIXME: Check if uMsg legal */
216 if(!SendDriverMessage(pad
->hDrvr
, uMsg
, lParam1
, lParam2
))
217 return MMSYSERR_NOTSUPPORTED
;
219 return MMSYSERR_NOERROR
;
223 /***********************************************************************
224 * acmDriverOpen (MSACM32.10)
226 MMRESULT WINAPI
acmDriverOpen(
227 PHACMDRIVER phad
, HACMDRIVERID hadid
, DWORD fdwOpen
)
229 PWINE_ACMDRIVERID padid
;
232 return MMSYSERR_INVALPARAM
;
234 padid
= MSACM_GetDriverID(hadid
);
236 return MMSYSERR_INVALHANDLE
;
239 return MMSYSERR_INVALFLAG
;
241 if(padid
->pACMDriver
)
243 /* FIXME: Is it allowed? */
244 ERR("Can't open driver twice\n");
245 return MMSYSERR_ERROR
;
248 padid
->pACMDriver
= HeapAlloc(
249 MSACM_hHeap
, 0, sizeof(WINE_ACMDRIVER
)
251 padid
->pACMDriver
->obj
.pACMDriverID
= padid
;
253 if(!padid
->pACMLocalDriver
)
254 padid
->pACMDriver
->hDrvr
=
255 OpenDriverA(padid
->pszDriverAlias
, "drivers32", 0);
258 padid
->pACMDriver
->hDrvr
= MSACM_OpenDriverProc(
259 padid
->pACMLocalDriver
->pfnDriverProc
263 if(!padid
->pACMDriver
->hDrvr
)
264 return MMSYSERR_ERROR
;
266 /* FIXME: Create a WINE_ACMDRIVER32 */
267 *phad
= (HACMDRIVER
) NULL
;
269 return MMSYSERR_ERROR
;
272 /***********************************************************************
273 * acmDriverPriority (MSACM32.11)
275 MMRESULT WINAPI
acmDriverPriority(
276 HACMDRIVERID hadid
, DWORD dwPriority
, DWORD fdwPriority
)
278 PWINE_ACMDRIVERID padid
;
281 LONG lBufferLength
= sizeof(szBuffer
);
284 DWORD dwPriorityCounter
;
286 padid
= MSACM_GetDriverID(hadid
);
288 return MMSYSERR_INVALHANDLE
;
290 /* Check for unknown flags */
292 ~(ACM_DRIVERPRIORITYF_ENABLE
|ACM_DRIVERPRIORITYF_DISABLE
|
293 ACM_DRIVERPRIORITYF_BEGIN
|ACM_DRIVERPRIORITYF_END
))
294 return MMSYSERR_INVALFLAG
;
296 /* Check for incompatible flags */
297 if((fdwPriority
& ACM_DRIVERPRIORITYF_ENABLE
) &&
298 (fdwPriority
& ACM_DRIVERPRIORITYF_DISABLE
))
299 return MMSYSERR_INVALFLAG
;
301 /* Check for incompatible flags */
302 if((fdwPriority
& ACM_DRIVERPRIORITYF_BEGIN
) &&
303 (fdwPriority
& ACM_DRIVERPRIORITYF_END
))
304 return MMSYSERR_INVALFLAG
;
306 lError
= RegOpenKeyA(HKEY_CURRENT_USER
,
307 "Software\\Microsoft\\Multimedia\\"
308 "Audio Compression Manager\\Priority v4.00",
311 /* FIXME: Create key */
312 if(lError
!= ERROR_SUCCESS
)
313 return MMSYSERR_ERROR
;
315 for(dwPriorityCounter
= 1; ; dwPriorityCounter
++)
317 wsnprintfA(szSubKey
, 17, "Priorty%ld", dwPriorityCounter
);
318 lError
= RegQueryValueA(hPriorityKey
, szSubKey
, szBuffer
, &lBufferLength
);
319 if(lError
!= ERROR_SUCCESS
)
322 FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
323 hadid
, dwPriority
, fdwPriority
328 RegCloseKey(hPriorityKey
);
330 return MMSYSERR_ERROR
;
333 /***********************************************************************
334 * acmDriverRemove (MSACM32.12)
336 MMRESULT WINAPI
acmDriverRemove(
337 HACMDRIVERID hadid
, DWORD fdwRemove
)
339 PWINE_ACMDRIVERID padid
;
341 padid
= MSACM_GetDriverID(hadid
);
343 return MMSYSERR_INVALHANDLE
;
346 return MMSYSERR_INVALFLAG
;
348 MSACM_UnregisterDriver(padid
);
350 return MMSYSERR_NOERROR
;