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

Last change on this file since 3690 was 2103, checked in by sandervl, 26 years ago

JW's update (wine 991212)

File size: 9.0 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 dprintf(("(%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 PWINE_ACMDRIVER* tp;
77
78 if (fdwClose)
79 return MMSYSERR_INVALFLAG;
80
81 p = MSACM_GetDriver(had);
82 if (!p)
83 return MMSYSERR_INVALHANDLE;
84
85 for (tp = &(p->obj.pACMDriverID->pACMDriverList); *tp; *tp = (*tp)->pNextACMDriver) {
86 if (*tp == p) {
87 *tp = (*tp)->pNextACMDriver;
88 break;
89 }
90 }
91
92 if (p->hDrvr && !p->obj.pACMDriverID->pACMDriverList)
93 CloseDriver(p->hDrvr, 0, 0);
94
95 HeapFree(MSACM_hHeap, 0, p);
96
97 return MMSYSERR_NOERROR;
98}
99
100/***********************************************************************
101 * acmDriverDetailsA (MSACM32.5)
102 */
103MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails)
104{
105 MMRESULT mmr;
106 ACMDRIVERDETAILSW addw;
107
108 addw.cbStruct = sizeof(addw);
109 mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
110 if (mmr == 0) {
111 padd->fccType = addw.fccType;
112 padd->fccComp = addw.fccComp;
113 padd->wMid = addw.wMid;
114 padd->wPid = addw.wPid;
115 padd->vdwACM = addw.vdwACM;
116 padd->vdwDriver = addw.vdwDriver;
117 padd->fdwSupport = addw.fdwSupport;
118 padd->cFormatTags = addw.cFormatTags;
119 padd->cFilterTags = addw.cFilterTags;
120 padd->hicon = addw.hicon;
121 lstrcpyWtoA(padd->szShortName, addw.szShortName);
122 lstrcpyWtoA(padd->szLongName, addw.szLongName);
123 lstrcpyWtoA(padd->szCopyright, addw.szCopyright);
124 lstrcpyWtoA(padd->szLicensing, addw.szLicensing);
125 lstrcpyWtoA(padd->szFeatures, addw.szFeatures);
126 }
127 return mmr;
128}
129
130/***********************************************************************
131 * acmDriverDetailsW (MSACM32.6)
132 */
133MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails)
134{
135 HACMDRIVER acmDrvr;
136 MMRESULT mmr;
137
138 if (fdwDetails)
139 return MMSYSERR_INVALFLAG;
140
141 mmr = acmDriverOpen(&acmDrvr, hadid, 0);
142 if (mmr == 0) {
143 mmr = (MMRESULT)acmDriverMessage(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM) padd, 0);
144
145 acmDriverClose(acmDrvr, 0);
146 }
147
148 return mmr;
149}
150
151/***********************************************************************
152 * acmDriverEnum (MSACM32.7)
153 */
154MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
155{
156 PWINE_ACMDRIVERID p;
157 DWORD fdwSupport;
158
159 if (!fnCallback) {
160 return MMSYSERR_INVALPARAM;
161 }
162
163 if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) {
164 return MMSYSERR_INVALFLAG;
165 }
166
167 for (p = MSACM_pFirstACMDriverID; p; p = p->pNextACMDriverID) {
168 fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
169 if (!p->bEnabled) {
170 if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
171 fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
172 else
173 continue;
174 }
175 (*fnCallback)((HACMDRIVERID) p, dwInstance, fdwSupport);
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 PWINE_ACMDRIVER pad;
230
231 dprintf(("(%p, %x, %08lu)\n", phad, hadid, fdwOpen));
232
233 if (!phad)
234 return MMSYSERR_INVALPARAM;
235
236 padid = MSACM_GetDriverID(hadid);
237 if (!padid)
238 return MMSYSERR_INVALHANDLE;
239
240 if (fdwOpen)
241 return MMSYSERR_INVALFLAG;
242
243 pad = PWINE_ACMDRIVER(HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER)));
244 if (!pad) return MMSYSERR_NOMEM;
245
246 pad->obj.pACMDriverID = padid;
247
248 if (!padid->hInstModule)
249 pad->hDrvr = OpenDriverA(padid->pszDriverAlias, "drivers32", 0);
250 else
251 pad->hDrvr = padid->hInstModule;
252
253 if (!pad->hDrvr) {
254 HeapFree(MSACM_hHeap, 0, pad);
255 return MMSYSERR_ERROR;
256 }
257
258// pad->pfnDriverProc = GetProcAddress(pad->hDrvr, "DriverProc");
259
260 /* insert new pad at beg of list */
261 pad->pNextACMDriver = padid->pACMDriverList;
262 padid->pACMDriverList = pad;
263
264 /* FIXME: Create a WINE_ACMDRIVER32 */
265 *phad = (HACMDRIVER)pad;
266
267// return MMSYSERR_NOERROR;
268 return MMSYSERR_ERROR;
269}
270
271/***********************************************************************
272 * acmDriverPriority (MSACM32.11)
273 */
274MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority)
275{
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;
283
284 padid = MSACM_GetDriverID(hadid);
285 if (!padid)
286 return MMSYSERR_INVALHANDLE;
287
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;
293
294 /* Check for incompatible flags */
295 if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
296 (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
297 return MMSYSERR_INVALFLAG;
298
299 /* Check for incompatible flags */
300 if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
301 (fdwPriority & ACM_DRIVERPRIORITYF_END))
302 return MMSYSERR_INVALFLAG;
303
304 lError = RegOpenKeyA(HKEY_CURRENT_USER,
305 "Software\\Microsoft\\Multimedia\\"
306 "Audio Compression Manager\\Priority v4.00",
307 &hPriorityKey
308 );
309 /* FIXME: Create key */
310 if (lError != ERROR_SUCCESS)
311 return MMSYSERR_ERROR;
312
313 for (dwPriorityCounter = 1; ; dwPriorityCounter++) {
314 wsnprintfA(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
315 lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
316 if (lError != ERROR_SUCCESS)
317 break;
318
319 dprintf(("(0x%08x, %ld, %ld): stub (partial)\n",
320 hadid, dwPriority, fdwPriority));
321 break;
322 }
323
324 RegCloseKey(hPriorityKey);
325
326 return MMSYSERR_ERROR;
327}
328
329/***********************************************************************
330 * acmDriverRemove (MSACM32.12)
331 */
332MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
333{
334 PWINE_ACMDRIVERID padid;
335
336 padid = MSACM_GetDriverID(hadid);
337 if (!padid)
338 return MMSYSERR_INVALHANDLE;
339
340 if (fdwRemove)
341 return MMSYSERR_INVALFLAG;
342
343 MSACM_UnregisterDriver(padid);
344
345 return MMSYSERR_NOERROR;
346}
347
Note: See TracBrowser for help on using the repository browser.