source: trunk/src/msacm32/driver.cpp@ 1884

Last change on this file since 1884 was 1607, checked in by sandervl, 26 years ago

Jens Weissner's update

File size: 9.1 KB
Line 
1/*
2 * MSACM32 library
3 *
4 * Copyright 1998 Patrik Stridvall
5 * 1999 Eric Pouech
6 */
7
8#include <os2win.h>
9#include "winbase.h"
10#include "winerror.h"
11#include "windef.h"
12#include "winuser.h"
13#include "debugtools.h"
14#include "driver.h"
15#include "heapstring.h"
16#include "mmsystem.h"
17#include "msacm.h"
18#include "msacmdrv.h"
19#include "wineacm.h"
20#include "winreg.h"
21
22DEFAULT_DEBUG_CHANNEL(msacm)
23
24/***********************************************************************
25 * acmDriverAddA (MSACM32.2)
26 */
27MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
28 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
29{
30 if (!phadid)
31 return MMSYSERR_INVALPARAM;
32
33 /* Check if any unknown flags */
34 if (fdwAdd &
35 ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
36 ACM_DRIVERADDF_GLOBAL))
37 return MMSYSERR_INVALFLAG;
38
39 /* Check if any incompatible flags */
40 if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
41 (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
42 return MMSYSERR_INVALFLAG;
43
44 /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
45 * LoadDriver on it, to be sure we can call SendDriverMessage on the
46 * hDrvr handle.
47 */
48 *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule);
49
50 /* FIXME: lParam, dwPriority and fdwAdd ignored */
51
52 return MMSYSERR_NOERROR;
53}
54
55/***********************************************************************
56 * acmDriverAddW (MSACM32.3)
57 * FIXME
58 * Not implemented
59 */
60MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule,
61 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
62{
63 FIXME("(%p, 0x%08x, %ld, %ld, %ld): stub\n",
64 phadid, hinstModule, lParam, dwPriority, fdwAdd);
65
66 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
67 return MMSYSERR_ERROR;
68}
69
70/***********************************************************************
71 * acmDriverClose (MSACM32.4)
72 */
73MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
74{
75 PWINE_ACMDRIVER p;
76
77 if (fdwClose)
78 return MMSYSERR_INVALFLAG;
79
80 p = MSACM_GetDriver(had);
81 if (!p)
82 return MMSYSERR_INVALHANDLE;
83
84 p->obj.pACMDriverID->pACMDriver = NULL;
85
86 if (p->hDrvr)
87 CloseDriver(p->hDrvr, 0, 0);
88
89 HeapFree(MSACM_hHeap, 0, p);
90
91 return MMSYSERR_NOERROR;
92}
93
94/***********************************************************************
95 * acmDriverDetailsA (MSACM32.5)
96 */
97MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails)
98{
99 MMRESULT mmr;
100 ACMDRIVERDETAILSW addw;
101
102 addw.cbStruct = sizeof(addw);
103 mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
104 if (mmr == 0) {
105 padd->fccType = addw.fccType;
106 padd->fccComp = addw.fccComp;
107 padd->wMid = addw.wMid;
108 padd->wPid = addw.wPid;
109 padd->vdwACM = addw.vdwACM;
110 padd->vdwDriver = addw.vdwDriver;
111 padd->fdwSupport = addw.fdwSupport;
112 padd->cFormatTags = addw.cFormatTags;
113 padd->cFilterTags = addw.cFilterTags;
114 padd->hicon = addw.hicon;
115 lstrcpyWtoA(padd->szShortName, addw.szShortName);
116 lstrcpyWtoA(padd->szLongName, addw.szLongName);
117 lstrcpyWtoA(padd->szCopyright, addw.szCopyright);
118 lstrcpyWtoA(padd->szLicensing, addw.szLicensing);
119 lstrcpyWtoA(padd->szFeatures, addw.szFeatures);
120 }
121 return mmr;
122}
123
124/***********************************************************************
125 * acmDriverDetailsW (MSACM32.6)
126 */
127MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails)
128{
129 PWINE_ACMDRIVERID p;
130 MMRESULT mmr;
131 BOOL bOpenTemporary;
132
133 p = MSACM_GetDriverID(hadid);
134 if (!p)
135 return MMSYSERR_INVALHANDLE;
136
137 if (fdwDetails)
138 return MMSYSERR_INVALFLAG;
139
140 bOpenTemporary = !p->pACMDriver;
141 if (bOpenTemporary) {
142 bOpenTemporary = TRUE;
143 acmDriverOpen((PHACMDRIVER) &p->pACMDriver, hadid, 0);
144 }
145
146 mmr = (MMRESULT) acmDriverMessage((HACMDRIVER) p->pACMDriver, ACMDM_DRIVER_DETAILS,
147 (LPARAM) padd, 0);
148
149 if (bOpenTemporary) {
150 acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
151 p->pACMDriver = NULL;
152 }
153
154 return mmr;
155}
156
157/***********************************************************************
158 * acmDriverEnum (MSACM32.7)
159 */
160MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
161{
162 PWINE_ACMDRIVERID p;
163
164 if (!fnCallback) {
165 return MMSYSERR_INVALPARAM;
166 }
167
168 if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) {
169 return MMSYSERR_INVALFLAG;
170 }
171
172 p = MSACM_pFirstACMDriverID;
173 while (p) {
174 (*fnCallback)((HACMDRIVERID) p, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC);
175 p = p->pNextACMDriverID;
176 }
177
178 return MMSYSERR_NOERROR;
179}
180
181/***********************************************************************
182 * acmDriverID (MSACM32.8)
183 */
184MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
185{
186 PWINE_ACMOBJ pao;
187
188 pao = MSACM_GetObj(hao);
189 if (!pao)
190 return MMSYSERR_INVALHANDLE;
191
192 if (!phadid)
193 return MMSYSERR_INVALPARAM;
194
195 if (fdwDriverID)
196 return MMSYSERR_INVALFLAG;
197
198 *phadid = (HACMDRIVERID) pao->pACMDriverID;
199
200 return MMSYSERR_NOERROR;
201}
202
203/***********************************************************************
204 * acmDriverMessage (MSACM32.9)
205 * FIXME
206 * Not implemented
207 */
208LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
209{
210 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
211 if (!pad)
212 return MMSYSERR_INVALPARAM;
213
214 /* FIXME: Check if uMsg legal */
215
216 if (!SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2))
217 return MMSYSERR_NOTSUPPORTED;
218
219 return MMSYSERR_NOERROR;
220}
221
222
223/***********************************************************************
224 * acmDriverOpen (MSACM32.10)
225 */
226MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
227{
228 PWINE_ACMDRIVERID padid;
229
230 TRACE("(%p, %x, %08lu\n", phad, hadid, fdwOpen);
231
232 if (!phad)
233 return MMSYSERR_INVALPARAM;
234
235 padid = MSACM_GetDriverID(hadid);
236 if (!padid)
237 return MMSYSERR_INVALHANDLE;
238
239 if (fdwOpen)
240 return MMSYSERR_INVALFLAG;
241
242 if (padid->pACMDriver) {
243 /* FIXME: Is it allowed? */
244 ERR("Can't open driver twice\n");
245 return MMSYSERR_ERROR;
246 }
247
248 padid->pACMDriver = PWINE_ACMDRIVER(HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)));
249 padid->pACMDriver->obj.pACMDriverID = padid;
250
251 if (!padid->hInstModule)
252 padid->pACMDriver->hDrvr = OpenDriverA(padid->pszDriverAlias, "drivers32", 0);
253 else
254 padid->pACMDriver->hDrvr = padid->hInstModule;
255
256 if (!padid->pACMDriver->hDrvr) {
257 HeapFree(MSACM_hHeap, 0, padid->pACMDriver);
258 padid->pACMDriver = NULL;
259 return MMSYSERR_ERROR;
260 }
261
262 /* FIXME-ICC: "FARPROC" cannot be converted to "extern "STDCALL" LRESULT(*)(DWORD,HDRVR,UINT,LPARAM,LPARAM)" */
263// padid->pACMDriver->pfnDriverProc = GetProcAddress(padid->pACMDriver->hDrvr, "DriverProc");
264
265 /* FIXME: Create a WINE_ACMDRIVER32 */
266 *phad = (HACMDRIVER) padid->pACMDriver;
267
268// return MMSYSERR_NOERROR;
269 return MMSYSERR_ERROR;
270}
271
272/***********************************************************************
273 * acmDriverPriority (MSACM32.11)
274 */
275MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority)
276{
277 PWINE_ACMDRIVERID padid;
278 CHAR szSubKey[17];
279 CHAR szBuffer[256];
280 LONG lBufferLength = sizeof(szBuffer);
281 LONG lError;
282 HKEY hPriorityKey;
283 DWORD dwPriorityCounter;
284
285 padid = MSACM_GetDriverID(hadid);
286 if (!padid)
287 return MMSYSERR_INVALHANDLE;
288
289 /* Check for unknown flags */
290 if (fdwPriority &
291 ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
292 ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
293 return MMSYSERR_INVALFLAG;
294
295 /* Check for incompatible flags */
296 if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
297 (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
298 return MMSYSERR_INVALFLAG;
299
300 /* Check for incompatible flags */
301 if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
302 (fdwPriority & ACM_DRIVERPRIORITYF_END))
303 return MMSYSERR_INVALFLAG;
304
305 lError = RegOpenKeyA(HKEY_CURRENT_USER,
306 "Software\\Microsoft\\Multimedia\\"
307 "Audio Compression Manager\\Priority v4.00",
308 &hPriorityKey
309 );
310 /* FIXME: Create key */
311 if (lError != ERROR_SUCCESS)
312 return MMSYSERR_ERROR;
313
314 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;
319
320 FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
321 hadid, dwPriority, fdwPriority);
322 break;
323 }
324
325 RegCloseKey(hPriorityKey);
326
327 return MMSYSERR_ERROR;
328}
329
330/***********************************************************************
331 * acmDriverRemove (MSACM32.12)
332 */
333MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
334{
335 PWINE_ACMDRIVERID padid;
336
337 padid = MSACM_GetDriverID(hadid);
338 if (!padid)
339 return MMSYSERR_INVALHANDLE;
340
341 if (fdwRemove)
342 return MMSYSERR_INVALFLAG;
343
344 MSACM_UnregisterDriver(padid);
345
346 return MMSYSERR_NOERROR;
347}
348
Note: See TracBrowser for help on using the repository browser.