Changed CBGetDroppedControlRect to be compliant with Windows API.
[wine/testsucceed.git] / dlls / msacm32 / driver.c
blob43f39e6169ee29463951ab1653043ba88b83ed3e
1 /*
2 * MSACM32 library
4 * Copyright 1998 Patrik Stridvall
5 */
7 #include "winbase.h"
8 #include "winerror.h"
9 #include "windef.h"
10 #include "winuser.h"
11 #include "debugtools.h"
12 #include "driver.h"
13 #include "heap.h"
14 #include "mmsystem.h"
15 #include "msacm.h"
16 #include "msacmdrv.h"
17 #include "winreg.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;
29 if(!phadid)
30 return MMSYSERR_INVALPARAM;
32 /* Check if any unknown flags */
33 if(fdwAdd &
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)
55 * FIXME
56 * Not implemented
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)
75 PWINE_ACMDRIVER p;
77 if(fdwClose)
78 return MMSYSERR_INVALFLAG;
80 p = MSACM_GetDriver(had);
81 if(!p)
82 return MMSYSERR_INVALHANDLE;
84 p->obj.pACMDriverID->pACMDriver = NULL;
86 /* FIXME: CloseDriver32 not implemented */
87 #if 0
88 if(p->hDrvr)
89 CloseDriver(p->hDrvr, 0, 0);
90 #endif
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)
103 PWINE_ACMDRIVERID p;
104 MMRESULT mmr;
105 BOOL bOpenTemporary;
107 p = MSACM_GetDriverID(hadid);
108 if(!p)
109 return MMSYSERR_INVALHANDLE;
111 if(fdwDetails)
112 return MMSYSERR_INVALFLAG;
114 bOpenTemporary = !p->pACMDriver;
115 if(bOpenTemporary) {
116 bOpenTemporary = TRUE;
117 acmDriverOpen((PHACMDRIVER) &p->pACMDriver, hadid, 0);
120 /* FIXME
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,
127 (LPARAM) padd, 0
130 if(bOpenTemporary) {
131 acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
132 p->pACMDriver = NULL;
135 return mmr;
138 /***********************************************************************
139 * acmDriverDetailsW (MSACM32.6)
140 * FIXME
141 * Not implemented
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)
157 PWINE_ACMDRIVERID p;
159 if(!fnCallback)
161 return MMSYSERR_INVALPARAM;
164 if(fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED))
166 return MMSYSERR_INVALFLAG;
169 p = MSACM_pFirstACMDriverID;
170 while(p)
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)
185 PWINE_ACMOBJ pao;
187 pao = MSACM_GetObj(hao);
188 if(!pao)
189 return MMSYSERR_INVALHANDLE;
191 if(!phadid)
192 return MMSYSERR_INVALPARAM;
194 if(fdwDriverID)
195 return MMSYSERR_INVALFLAG;
197 *phadid = (HACMDRIVERID) pao->pACMDriverID;
199 return MMSYSERR_NOERROR;
202 /***********************************************************************
203 * acmDriverMessage (MSACM32.9)
204 * FIXME
205 * Not implemented
207 LRESULT WINAPI acmDriverMessage(
208 HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
210 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
211 if(!pad)
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;
231 if(!phad)
232 return MMSYSERR_INVALPARAM;
234 padid = MSACM_GetDriverID(hadid);
235 if(!padid)
236 return MMSYSERR_INVALHANDLE;
238 if(fdwOpen)
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);
256 else
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;
279 CHAR szSubKey[17];
280 CHAR szBuffer[256];
281 LONG lBufferLength = sizeof(szBuffer);
282 LONG lError;
283 HKEY hPriorityKey;
284 DWORD dwPriorityCounter;
286 padid = MSACM_GetDriverID(hadid);
287 if(!padid)
288 return MMSYSERR_INVALHANDLE;
290 /* Check for unknown flags */
291 if(fdwPriority &
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",
309 &hPriorityKey
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)
320 break;
322 FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
323 hadid, dwPriority, fdwPriority
325 break;
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);
342 if(!padid)
343 return MMSYSERR_INVALHANDLE;
345 if(fdwRemove)
346 return MMSYSERR_INVALFLAG;
348 MSACM_UnregisterDriver(padid);
350 return MMSYSERR_NOERROR;