Added stub for VMM PM API AH=026[de] (never say 'safe mode').
[wine.git] / dlls / msacm32 / driver.c
blob06fe045744a1a8fc27e8b70cdbe059916978d1be
1 /*
2 * MSACM32 library
4 * Copyright 1998 Patrik Stridvall
5 */
7 #include "windows.h"
8 #include "winerror.h"
9 #include "wintypes.h"
10 #include "debug.h"
11 #include "driver.h"
12 #include "heap.h"
13 #include "mmsystem.h"
14 #include "msacm.h"
15 #include "msacmdrv.h"
16 #include "winreg.h"
18 /***********************************************************************
19 * acmDriverAddA (MSACM32.2)
21 MMRESULT32 WINAPI acmDriverAdd32A(
22 PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule,
23 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
25 PWINE_ACMLOCALDRIVER32 pld;
26 if(!phadid)
27 return MMSYSERR_INVALPARAM;
29 /* Check if any unknown flags */
30 if(fdwAdd &
31 ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
32 ACM_DRIVERADDF_GLOBAL))
33 return MMSYSERR_INVALFLAG;
35 /* Check if any incompatible flags */
36 if((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
37 (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
38 return MMSYSERR_INVALFLAG;
40 pld = HeapAlloc(MSACM_hHeap32, 0, sizeof(WINE_ACMLOCALDRIVER32));
41 pld->pfnDriverProc = (DRIVERPROC32)
42 GetProcAddress32(hinstModule, "DriverProc");
43 *phadid = (HACMDRIVERID32) MSACM_RegisterDriver32(NULL, NULL, pld);
45 /* FIXME: lParam, dwPriority and fdwAdd ignored */
47 return MMSYSERR_NOERROR;
50 /***********************************************************************
51 * acmDriverAddW (MSACM32.3)
52 * FIXME
53 * Not implemented
55 MMRESULT32 WINAPI acmDriverAdd32W(
56 PHACMDRIVERID32 phadid, HINSTANCE32 hinstModule,
57 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
59 FIXME(msacm, "(%p, 0x%08x, %ld, %ld, %ld): stub\n",
60 phadid, hinstModule, lParam, dwPriority, fdwAdd
62 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
63 return MMSYSERR_ERROR;
66 /***********************************************************************
67 * acmDriverClose (MSACM32.4)
69 MMRESULT32 WINAPI acmDriverClose32(
70 HACMDRIVER32 had, DWORD fdwClose)
72 PWINE_ACMDRIVER32 p;
74 if(fdwClose)
75 return MMSYSERR_INVALFLAG;
77 p = MSACM_GetDriver32(had);
78 if(!p)
79 return MMSYSERR_INVALHANDLE;
81 p->obj.pACMDriverID->pACMDriver = NULL;
83 /* FIXME: CloseDriver32 not implemented */
84 #if 0
85 if(p->hDrvr)
86 CloseDriver32(p->hDrvr, 0, 0);
87 #endif
89 HeapFree(MSACM_hHeap32, 0, p);
91 return MMSYSERR_NOERROR;
94 /***********************************************************************
95 * acmDriverDetailsA (MSACM32.5)
97 MMRESULT32 WINAPI acmDriverDetails32A(
98 HACMDRIVERID32 hadid, PACMDRIVERDETAILS32A padd, DWORD fdwDetails)
100 PWINE_ACMDRIVERID32 p;
101 MMRESULT32 mmr;
102 BOOL32 bOpenTemporary;
104 p = MSACM_GetDriverID32(hadid);
105 if(!p)
106 return MMSYSERR_INVALHANDLE;
108 if(fdwDetails)
109 return MMSYSERR_INVALFLAG;
111 bOpenTemporary = !p->pACMDriver;
112 if(bOpenTemporary) {
113 bOpenTemporary = TRUE;
114 acmDriverOpen32((PHACMDRIVER32) &p->pACMDriver, hadid, 0);
117 /* FIXME
118 * How does the driver know if the ANSI or
119 * the UNICODE variant of PACMDRIVERDETAILS is used?
120 * It might check cbStruct or does it only accept ANSI.
122 mmr = (MMRESULT32) acmDriverMessage32(
123 (HACMDRIVER32) p->pACMDriver, ACMDM_DRIVER_DETAILS,
124 (LPARAM) padd, 0
127 if(bOpenTemporary) {
128 acmDriverClose32((HACMDRIVER32) p->pACMDriver, 0);
129 p->pACMDriver = NULL;
132 return mmr;
135 /***********************************************************************
136 * acmDriverDetailsW (MSACM32.6)
137 * FIXME
138 * Not implemented
140 MMRESULT32 WINAPI acmDriverDetails32W(
141 HACMDRIVERID32 hadid, PACMDRIVERDETAILS32W padd, DWORD fdwDetails)
143 FIXME(msacm, "(0x%08x, %p, %ld): stub\n", hadid, padd, fdwDetails);
144 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
145 return MMSYSERR_ERROR;
148 /***********************************************************************
149 * acmDriverEnum (MSACM32.7)
151 MMRESULT32 WINAPI acmDriverEnum32(
152 ACMDRIVERENUMCB32 fnCallback, DWORD dwInstance, DWORD fdwEnum)
154 PWINE_ACMDRIVERID32 p;
156 if(!fnCallback)
158 return MMSYSERR_INVALPARAM;
161 if(fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED))
163 return MMSYSERR_INVALFLAG;
166 p = MSACM_pFirstACMDriverID32;
167 while(p)
169 (*fnCallback)((HACMDRIVERID32) p, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC);
170 p = p->pNextACMDriverID;
173 return MMSYSERR_NOERROR;
176 /***********************************************************************
177 * acmDriverID (MSACM32.8)
179 MMRESULT32 WINAPI acmDriverID32(
180 HACMOBJ32 hao, PHACMDRIVERID32 phadid, DWORD fdwDriverID)
182 PWINE_ACMOBJ32 pao;
184 pao = MSACM_GetObj32(hao);
185 if(!pao)
186 return MMSYSERR_INVALHANDLE;
188 if(!phadid)
189 return MMSYSERR_INVALPARAM;
191 if(fdwDriverID)
192 return MMSYSERR_INVALFLAG;
194 *phadid = (HACMDRIVERID32) pao->pACMDriverID;
196 return MMSYSERR_NOERROR;
199 /***********************************************************************
200 * acmDriverMessage (MSACM32.9)
201 * FIXME
202 * Not implemented
204 LRESULT WINAPI acmDriverMessage32(
205 HACMDRIVER32 had, UINT32 uMsg, LPARAM lParam1, LPARAM lParam2)
207 PWINE_ACMDRIVER32 pad = MSACM_GetDriver32(had);
208 if(!pad)
209 return MMSYSERR_INVALPARAM;
211 /* FIXME: Check if uMsg legal */
213 if(!SendDriverMessage32(pad->hDrvr, uMsg, lParam1, lParam2))
214 return MMSYSERR_NOTSUPPORTED;
216 return MMSYSERR_NOERROR;
220 /***********************************************************************
221 * acmDriverOpen (MSACM32.10)
223 MMRESULT32 WINAPI acmDriverOpen32(
224 PHACMDRIVER32 phad, HACMDRIVERID32 hadid, DWORD fdwOpen)
226 PWINE_ACMDRIVERID32 padid;
228 if(!phad)
229 return MMSYSERR_INVALPARAM;
231 padid = MSACM_GetDriverID32(hadid);
232 if(!padid)
233 return MMSYSERR_INVALHANDLE;
235 if(fdwOpen)
236 return MMSYSERR_INVALFLAG;
238 if(padid->pACMDriver)
240 /* FIXME: Is it allowed? */
241 ERR(msacm, "Can't open driver twice\n");
242 return MMSYSERR_ERROR;
245 padid->pACMDriver = HeapAlloc(
246 MSACM_hHeap32, 0, sizeof(WINE_ACMDRIVER32)
248 padid->pACMDriver->obj.pACMDriverID = padid;
250 if(!padid->pACMLocalDriver)
251 padid->pACMDriver->hDrvr =
252 OpenDriver32A(padid->pszDriverAlias, "drivers32", 0);
253 else
255 padid->pACMDriver->hDrvr = MSACM_OpenDriverProc32(
256 padid->pACMLocalDriver->pfnDriverProc
260 if(!padid->pACMDriver->hDrvr)
261 return MMSYSERR_ERROR;
263 /* FIXME: Create a WINE_ACMDRIVER32 */
264 *phad = (HACMDRIVER32) NULL;
266 return MMSYSERR_ERROR;
269 /***********************************************************************
270 * acmDriverPriority (MSACM32.11)
272 MMRESULT32 WINAPI acmDriverPriority32(
273 HACMDRIVERID32 hadid, DWORD dwPriority, DWORD fdwPriority)
275 PWINE_ACMDRIVERID32 padid;
276 CHAR szSubKey[17];
277 CHAR szBuffer[256];
278 LONG lBufferLength = sizeof(szBuffer);
279 LONG lError;
280 HKEY hPriorityKey;
281 DWORD dwPriorityCounter;
283 padid = MSACM_GetDriverID32(hadid);
284 if(!padid)
285 return MMSYSERR_INVALHANDLE;
287 /* Check for unknown flags */
288 if(fdwPriority &
289 ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
290 ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
291 return MMSYSERR_INVALFLAG;
293 /* Check for incompatible flags */
294 if((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
295 (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
296 return MMSYSERR_INVALFLAG;
298 /* Check for incompatible flags */
299 if((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
300 (fdwPriority & ACM_DRIVERPRIORITYF_END))
301 return MMSYSERR_INVALFLAG;
303 lError = RegOpenKey32A(HKEY_CURRENT_USER,
304 "Software\\Microsoft\\Multimedia\\"
305 "Audio Compression Manager\\Priority v4.00",
306 &hPriorityKey
308 /* FIXME: Create key */
309 if(lError != ERROR_SUCCESS)
310 return MMSYSERR_ERROR;
312 for(dwPriorityCounter = 1; ; dwPriorityCounter++)
314 snprintf(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
315 lError = RegQueryValue32A(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
316 if(lError != ERROR_SUCCESS)
317 break;
319 FIXME(msacm, "(0x%08x, %ld, %ld): stub (partial)\n",
320 hadid, dwPriority, fdwPriority
322 break;
325 RegCloseKey(hPriorityKey);
327 return MMSYSERR_ERROR;
330 /***********************************************************************
331 * acmDriverRemove (MSACM32.12)
333 MMRESULT32 WINAPI acmDriverRemove32(
334 HACMDRIVERID32 hadid, DWORD fdwRemove)
336 PWINE_ACMDRIVERID32 padid;
338 padid = MSACM_GetDriverID32(hadid);
339 if(!padid)
340 return MMSYSERR_INVALHANDLE;
342 if(fdwRemove)
343 return MMSYSERR_INVALFLAG;
345 MSACM_UnregisterDriver32(padid);
347 return MMSYSERR_NOERROR;