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;