1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
14 #include "debugtools.h"
23 DEFAULT_DEBUG_CHANNEL(msacm)
25 /***********************************************************************
26 * acmDriverAddA (MSACM32.2)
28 MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
29 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
32 return MMSYSERR_INVALPARAM;
34 /* Check if any unknown flags */
36 ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
37 ACM_DRIVERADDF_GLOBAL))
38 return MMSYSERR_INVALFLAG;
40 /* Check if any incompatible flags */
41 if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
42 (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
43 return MMSYSERR_INVALFLAG;
45 /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
46 * LoadDriver on it, to be sure we can call SendDriverMessage on the
49 *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule);
51 /* FIXME: lParam, dwPriority and fdwAdd ignored */
53 return MMSYSERR_NOERROR;
56 /***********************************************************************
57 * acmDriverAddW (MSACM32.3)
61 MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule,
62 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
64 FIXME("(%p, 0x%08x, %ld, %ld, %ld): stub\n",
65 phadid, hinstModule, lParam, dwPriority, fdwAdd);
67 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
68 return MMSYSERR_ERROR;
71 /***********************************************************************
72 * acmDriverClose (MSACM32.4)
74 MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
79 return MMSYSERR_INVALFLAG;
81 p = MSACM_GetDriver(had);
83 return MMSYSERR_INVALHANDLE;
85 p->obj.pACMDriverID->pACMDriver = NULL;
88 CloseDriver(p->hDrvr, 0, 0);
90 HeapFree(MSACM_hHeap, 0, p);
92 return MMSYSERR_NOERROR;
95 /***********************************************************************
96 * acmDriverDetailsA (MSACM32.5)
98 MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails)
101 ACMDRIVERDETAILSW addw;
103 addw.cbStruct = sizeof(addw);
104 mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
106 padd->fccType = addw.fccType;
107 padd->fccComp = addw.fccComp;
108 padd->wMid = addw.wMid;
109 padd->wPid = addw.wPid;
110 padd->vdwACM = addw.vdwACM;
111 padd->vdwDriver = addw.vdwDriver;
112 padd->fdwSupport = addw.fdwSupport;
113 padd->cFormatTags = addw.cFormatTags;
114 padd->cFilterTags = addw.cFilterTags;
115 padd->hicon = addw.hicon;
116 lstrcpyWtoA(padd->szShortName, addw.szShortName);
117 lstrcpyWtoA(padd->szLongName, addw.szLongName);
118 lstrcpyWtoA(padd->szCopyright, addw.szCopyright);
119 lstrcpyWtoA(padd->szLicensing, addw.szLicensing);
120 lstrcpyWtoA(padd->szFeatures, addw.szFeatures);
125 /***********************************************************************
126 * acmDriverDetailsW (MSACM32.6)
128 MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails)
134 p = MSACM_GetDriverID(hadid);
136 return MMSYSERR_INVALHANDLE;
139 return MMSYSERR_INVALFLAG;
141 bOpenTemporary = !p->pACMDriver;
142 if (bOpenTemporary) {
143 bOpenTemporary = TRUE;
144 acmDriverOpen((PHACMDRIVER) &p->pACMDriver, hadid, 0);
147 mmr = (MMRESULT) acmDriverMessage((HACMDRIVER) p->pACMDriver, ACMDM_DRIVER_DETAILS,
150 if (bOpenTemporary) {
151 acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
152 p->pACMDriver = NULL;
158 /***********************************************************************
159 * acmDriverEnum (MSACM32.7)
161 MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
166 return MMSYSERR_INVALPARAM;
169 if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED)) {
170 return MMSYSERR_INVALFLAG;
173 p = MSACM_pFirstACMDriverID;
175 (*fnCallback)((HACMDRIVERID) p, dwInstance, ACMDRIVERDETAILS_SUPPORTF_CODEC);
176 p = p->pNextACMDriverID;
179 return MMSYSERR_NOERROR;
182 /***********************************************************************
183 * acmDriverID (MSACM32.8)
185 MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
189 pao = MSACM_GetObj(hao);
191 return MMSYSERR_INVALHANDLE;
194 return MMSYSERR_INVALPARAM;
197 return MMSYSERR_INVALFLAG;
199 *phadid = (HACMDRIVERID) pao->pACMDriverID;
201 return MMSYSERR_NOERROR;
204 /***********************************************************************
205 * acmDriverMessage (MSACM32.9)
209 LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
211 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
213 return MMSYSERR_INVALPARAM;
215 /* FIXME: Check if uMsg legal */
217 if (!SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2))
218 return MMSYSERR_NOTSUPPORTED;
220 return MMSYSERR_NOERROR;
224 /***********************************************************************
225 * acmDriverOpen (MSACM32.10)
227 MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
229 PWINE_ACMDRIVERID padid;
231 TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);
234 return MMSYSERR_INVALPARAM;
236 padid = MSACM_GetDriverID(hadid);
238 return MMSYSERR_INVALHANDLE;
241 return MMSYSERR_INVALFLAG;
243 if (padid->pACMDriver) {
244 /* FIXME: Is it allowed? */
245 ERR("Can't open driver '%s' twice\n", padid->pszDriverAlias);
246 return MMSYSERR_ERROR;
249 padid->pACMDriver = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
250 padid->pACMDriver->obj.pACMDriverID = padid;
252 if (!padid->hInstModule)
253 padid->pACMDriver->hDrvr = OpenDriverA(padid->pszDriverAlias, "drivers32", 0);
255 padid->pACMDriver->hDrvr = padid->hInstModule;
257 if (!padid->pACMDriver->hDrvr) {
258 HeapFree(MSACM_hHeap, 0, padid->pACMDriver);
259 padid->pACMDriver = NULL;
260 return MMSYSERR_ERROR;
263 padid->pACMDriver->pfnDriverProc = GetProcAddress(padid->pACMDriver->hDrvr, "DriverProc");
265 /* FIXME: Create a WINE_ACMDRIVER32 */
266 *phad = (HACMDRIVER) padid->pACMDriver;
268 return MMSYSERR_NOERROR;
271 /***********************************************************************
272 * acmDriverPriority (MSACM32.11)
274 MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority)
276 PWINE_ACMDRIVERID padid;
279 LONG lBufferLength = sizeof(szBuffer);
282 DWORD dwPriorityCounter;
284 padid = MSACM_GetDriverID(hadid);
286 return MMSYSERR_INVALHANDLE;
288 /* Check for unknown flags */
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",
309 /* FIXME: Create key */
310 if (lError != ERROR_SUCCESS)
311 return MMSYSERR_ERROR;
313 for (dwPriorityCounter = 1; ; dwPriorityCounter++) {
314 wsnprintfA(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
315 lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
316 if (lError != ERROR_SUCCESS)
319 FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
320 hadid, dwPriority, fdwPriority);
324 RegCloseKey(hPriorityKey);
326 return MMSYSERR_ERROR;
329 /***********************************************************************
330 * acmDriverRemove (MSACM32.12)
332 MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
334 PWINE_ACMDRIVERID padid;
336 padid = MSACM_GetDriverID(hadid);
338 return MMSYSERR_INVALHANDLE;
341 return MMSYSERR_INVALFLAG;
343 MSACM_UnregisterDriver(padid);
345 return MMSYSERR_NOERROR;