Renamed wintypes.h to windef.h.
[wine/hacks.git] / dlls / msacm32 / driver.c
blob0843a058ab5246546025723600b8e737cb95f1d4
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 "debug.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 /***********************************************************************
20 * acmDriverAddA (MSACM32.2)
22 MMRESULT WINAPI acmDriverAddA(
23 PHACMDRIVERID phadid, HINSTANCE hinstModule,
24 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
26 PWINE_ACMLOCALDRIVER pld;
27 if(!phadid)
28 return MMSYSERR_INVALPARAM;
30 /* Check if any unknown flags */
31 if(fdwAdd &
32 ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
33 ACM_DRIVERADDF_GLOBAL))
34 return MMSYSERR_INVALFLAG;
36 /* Check if any incompatible flags */
37 if((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
38 (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
39 return MMSYSERR_INVALFLAG;
41 pld = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER));
42 pld->pfnDriverProc = (DRIVERPROC)
43 GetProcAddress(hinstModule, "DriverProc");
44 *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, pld);
46 /* FIXME: lParam, dwPriority and fdwAdd ignored */
48 return MMSYSERR_NOERROR;
51 /***********************************************************************
52 * acmDriverAddW (MSACM32.3)
53 * FIXME
54 * Not implemented
56 MMRESULT WINAPI acmDriverAddW(
57 PHACMDRIVERID phadid, HINSTANCE hinstModule,
58 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
60 FIXME(msacm, "(%p, 0x%08x, %ld, %ld, %ld): stub\n",
61 phadid, hinstModule, lParam, dwPriority, fdwAdd
63 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
64 return MMSYSERR_ERROR;
67 /***********************************************************************
68 * acmDriverClose (MSACM32.4)
70 MMRESULT WINAPI acmDriverClose(
71 HACMDRIVER had, DWORD fdwClose)
73 PWINE_ACMDRIVER p;
75 if(fdwClose)
76 return MMSYSERR_INVALFLAG;
78 p = MSACM_GetDriver(had);
79 if(!p)
80 return MMSYSERR_INVALHANDLE;
82 p->obj.pACMDriverID->pACMDriver = NULL;
84 /* FIXME: CloseDriver32 not implemented */
85 #if 0
86 if(p->hDrvr)
87 CloseDriver(p->hDrvr, 0, 0);
88 #endif
90 HeapFree(MSACM_hHeap, 0, p);
92 return MMSYSERR_NOERROR;
95 /***********************************************************************
96 * acmDriverDetailsA (MSACM32.5)
98 MMRESULT WINAPI acmDriverDetailsA(
99 HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails)
101 PWINE_ACMDRIVERID p;
102 MMRESULT mmr;
103 BOOL bOpenTemporary;
105 p = MSACM_GetDriverID(hadid);
106 if(!p)
107 return MMSYSERR_INVALHANDLE;
109 if(fdwDetails)
110 return MMSYSERR_INVALFLAG;
112 bOpenTemporary = !p->pACMDriver;
113 if(bOpenTemporary) {
114 bOpenTemporary = TRUE;
115 acmDriverOpen((PHACMDRIVER) &p->pACMDriver, hadid, 0);
118 /* FIXME
119 * How does the driver know if the ANSI or
120 * the UNICODE variant of PACMDRIVERDETAILS is used?
121 * It might check cbStruct or does it only accept ANSI.
123 mmr = (MMRESULT) acmDriverMessage(
124 (HACMDRIVER) p->pACMDriver, ACMDM_DRIVER_DETAILS,
125 (LPARAM) padd, 0
128 if(bOpenTemporary) {
129 acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
130 p->pACMDriver = NULL;
133 return mmr;
136 /***********************************************************************
137 * acmDriverDetailsW (MSACM32.6)
138 * FIXME
139 * Not implemented
141 MMRESULT WINAPI acmDriverDetailsW(
142 HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails)
144 FIXME(msacm, "(0x%08x, %p, %ld): stub\n", hadid, padd, fdwDetails);
145 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
146 return MMSYSERR_ERROR;
149 /***********************************************************************
150 * acmDriverEnum (MSACM32.7)
152 MMRESULT WINAPI acmDriverEnum(
153 ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
155 PWINE_ACMDRIVERID p;
157 if(!fnCallback)
159 return MMSYSERR_INVALPARAM;
162 if(fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED))
164 return MMSYSERR_INVALFLAG;
167 p = MSACM_pFirstACMDriverID;
168 while(p)
170 (*fnCallback)((HACMDRIVERID) p, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC);
171 p = p->pNextACMDriverID;
174 return MMSYSERR_NOERROR;
177 /***********************************************************************
178 * acmDriverID (MSACM32.8)
180 MMRESULT WINAPI acmDriverID(
181 HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
183 PWINE_ACMOBJ pao;
185 pao = MSACM_GetObj(hao);
186 if(!pao)
187 return MMSYSERR_INVALHANDLE;
189 if(!phadid)
190 return MMSYSERR_INVALPARAM;
192 if(fdwDriverID)
193 return MMSYSERR_INVALFLAG;
195 *phadid = (HACMDRIVERID) pao->pACMDriverID;
197 return MMSYSERR_NOERROR;
200 /***********************************************************************
201 * acmDriverMessage (MSACM32.9)
202 * FIXME
203 * Not implemented
205 LRESULT WINAPI acmDriverMessage(
206 HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
208 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
209 if(!pad)
210 return MMSYSERR_INVALPARAM;
212 /* FIXME: Check if uMsg legal */
214 if(!SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2))
215 return MMSYSERR_NOTSUPPORTED;
217 return MMSYSERR_NOERROR;
221 /***********************************************************************
222 * acmDriverOpen (MSACM32.10)
224 MMRESULT WINAPI acmDriverOpen(
225 PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
227 PWINE_ACMDRIVERID padid;
229 if(!phad)
230 return MMSYSERR_INVALPARAM;
232 padid = MSACM_GetDriverID(hadid);
233 if(!padid)
234 return MMSYSERR_INVALHANDLE;
236 if(fdwOpen)
237 return MMSYSERR_INVALFLAG;
239 if(padid->pACMDriver)
241 /* FIXME: Is it allowed? */
242 ERR(msacm, "Can't open driver twice\n");
243 return MMSYSERR_ERROR;
246 padid->pACMDriver = HeapAlloc(
247 MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)
249 padid->pACMDriver->obj.pACMDriverID = padid;
251 if(!padid->pACMLocalDriver)
252 padid->pACMDriver->hDrvr =
253 OpenDriverA(padid->pszDriverAlias, "drivers32", 0);
254 else
256 padid->pACMDriver->hDrvr = MSACM_OpenDriverProc(
257 padid->pACMLocalDriver->pfnDriverProc
261 if(!padid->pACMDriver->hDrvr)
262 return MMSYSERR_ERROR;
264 /* FIXME: Create a WINE_ACMDRIVER32 */
265 *phad = (HACMDRIVER) NULL;
267 return MMSYSERR_ERROR;
270 /***********************************************************************
271 * acmDriverPriority (MSACM32.11)
273 MMRESULT WINAPI acmDriverPriority(
274 HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority)
276 PWINE_ACMDRIVERID padid;
277 CHAR szSubKey[17];
278 CHAR szBuffer[256];
279 LONG lBufferLength = sizeof(szBuffer);
280 LONG lError;
281 HKEY hPriorityKey;
282 DWORD dwPriorityCounter;
284 padid = MSACM_GetDriverID(hadid);
285 if(!padid)
286 return MMSYSERR_INVALHANDLE;
288 /* Check for unknown flags */
289 if(fdwPriority &
290 ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
291 ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
292 return MMSYSERR_INVALFLAG;
294 /* Check for incompatible flags */
295 if((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
296 (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
297 return MMSYSERR_INVALFLAG;
299 /* Check for incompatible flags */
300 if((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
301 (fdwPriority & ACM_DRIVERPRIORITYF_END))
302 return MMSYSERR_INVALFLAG;
304 lError = RegOpenKeyA(HKEY_CURRENT_USER,
305 "Software\\Microsoft\\Multimedia\\"
306 "Audio Compression Manager\\Priority v4.00",
307 &hPriorityKey
309 /* FIXME: Create key */
310 if(lError != ERROR_SUCCESS)
311 return MMSYSERR_ERROR;
313 for(dwPriorityCounter = 1; ; dwPriorityCounter++)
315 wsnprintfA(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
316 lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
317 if(lError != ERROR_SUCCESS)
318 break;
320 FIXME(msacm, "(0x%08x, %ld, %ld): stub (partial)\n",
321 hadid, dwPriority, fdwPriority
323 break;
326 RegCloseKey(hPriorityKey);
328 return MMSYSERR_ERROR;
331 /***********************************************************************
332 * acmDriverRemove (MSACM32.12)
334 MMRESULT WINAPI acmDriverRemove(
335 HACMDRIVERID hadid, DWORD fdwRemove)
337 PWINE_ACMDRIVERID padid;
339 padid = MSACM_GetDriverID(hadid);
340 if(!padid)
341 return MMSYSERR_INVALHANDLE;
343 if(fdwRemove)
344 return MMSYSERR_INVALFLAG;
346 MSACM_UnregisterDriver(padid);
348 return MMSYSERR_NOERROR;