1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
17 #include "debugtools.h"
25 DEFAULT_DEBUG_CHANNEL(msacm);
27 /***********************************************************************
28 * acmDriverAddA (MSACM32.2)
30 MMRESULT WINAPI acmDriverAddA(PHACMDRIVERID phadid, HINSTANCE hinstModule,
31 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
34 return MMSYSERR_INVALPARAM;
36 /* Check if any unknown flags */
38 ~(ACM_DRIVERADDF_FUNCTION|ACM_DRIVERADDF_NOTIFYHWND|
39 ACM_DRIVERADDF_GLOBAL))
40 return MMSYSERR_INVALFLAG;
42 /* Check if any incompatible flags */
43 if ((fdwAdd & ACM_DRIVERADDF_FUNCTION) &&
44 (fdwAdd & ACM_DRIVERADDF_NOTIFYHWND))
45 return MMSYSERR_INVALFLAG;
47 /* FIXME: in fact, should GetModuleFileName(hinstModule) and do a
48 * LoadDriver on it, to be sure we can call SendDriverMessage on the
51 *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL, hinstModule);
53 /* FIXME: lParam, dwPriority and fdwAdd ignored */
55 return MMSYSERR_NOERROR;
58 /***********************************************************************
59 * acmDriverAddW (MSACM32.3)
63 MMRESULT WINAPI acmDriverAddW(PHACMDRIVERID phadid, HINSTANCE hinstModule,
64 LPARAM lParam, DWORD dwPriority, DWORD fdwAdd)
66 FIXME("(%p, 0x%08x, %ld, %ld, %ld): stub\n",
67 phadid, hinstModule, lParam, dwPriority, fdwAdd);
69 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
70 return MMSYSERR_ERROR;
73 /***********************************************************************
74 * acmDriverClose (MSACM32.4)
76 MMRESULT WINAPI acmDriverClose(HACMDRIVER had, DWORD fdwClose)
79 PWINE_ACMDRIVERID padid;
80 PWINE_ACMDRIVER* tpad;
83 return MMSYSERR_INVALFLAG;
85 pad = MSACM_GetDriver(had);
87 return MMSYSERR_INVALHANDLE;
89 padid = pad->obj.pACMDriverID;
91 /* remove driver from list */
92 for (tpad = &(padid->pACMDriverList); *tpad; *tpad = (*tpad)->pNextACMDriver) {
94 *tpad = (*tpad)->pNextACMDriver;
99 /* close driver if it has been opened */
100 if (pad->hDrvr && !padid->hInstModule)
101 CloseDriver(pad->hDrvr, 0, 0);
103 HeapFree(MSACM_hHeap, 0, pad);
105 return MMSYSERR_NOERROR;
108 /***********************************************************************
109 * acmDriverDetailsA (MSACM32.5)
111 MMRESULT WINAPI acmDriverDetailsA(HACMDRIVERID hadid, PACMDRIVERDETAILSA padd, DWORD fdwDetails)
114 ACMDRIVERDETAILSW addw;
116 addw.cbStruct = sizeof(addw);
117 mmr = acmDriverDetailsW(hadid, &addw, fdwDetails);
119 padd->fccType = addw.fccType;
120 padd->fccComp = addw.fccComp;
121 padd->wMid = addw.wMid;
122 padd->wPid = addw.wPid;
123 padd->vdwACM = addw.vdwACM;
124 padd->vdwDriver = addw.vdwDriver;
125 padd->fdwSupport = addw.fdwSupport;
126 padd->cFormatTags = addw.cFormatTags;
127 padd->cFilterTags = addw.cFilterTags;
128 padd->hicon = addw.hicon;
129 WideCharToMultiByte( CP_ACP, 0, addw.szShortName, -1, padd->szShortName,
130 sizeof(padd->szShortName), NULL, NULL );
131 WideCharToMultiByte( CP_ACP, 0, addw.szLongName, -1, padd->szLongName,
132 sizeof(padd->szLongName), NULL, NULL );
133 WideCharToMultiByte( CP_ACP, 0, addw.szCopyright, -1, padd->szCopyright,
134 sizeof(padd->szCopyright), NULL, NULL );
135 WideCharToMultiByte( CP_ACP, 0, addw.szLicensing, -1, padd->szLicensing,
136 sizeof(padd->szLicensing), NULL, NULL );
137 WideCharToMultiByte( CP_ACP, 0, addw.szFeatures, -1, padd->szFeatures,
138 sizeof(padd->szFeatures), NULL, NULL );
143 /***********************************************************************
144 * acmDriverDetailsW (MSACM32.6)
146 MMRESULT WINAPI acmDriverDetailsW(HACMDRIVERID hadid, PACMDRIVERDETAILSW padd, DWORD fdwDetails)
152 return MMSYSERR_INVALFLAG;
154 mmr = acmDriverOpen(&acmDrvr, hadid, 0);
155 if (mmr == MMSYSERR_NOERROR) {
156 mmr = (MMRESULT)MSACM_Message(acmDrvr, ACMDM_DRIVER_DETAILS, (LPARAM)padd, 0);
158 acmDriverClose(acmDrvr, 0);
164 /***********************************************************************
165 * acmDriverEnum (MSACM32.7)
167 MMRESULT WINAPI acmDriverEnum(ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum)
170 ACMDRIVERDETAILSW add;
172 if (!fnCallback) return MMSYSERR_INVALPARAM;
174 if (fdwEnum && ~(ACM_DRIVERENUMF_NOLOCAL|ACM_DRIVERENUMF_DISABLED))
175 return MMSYSERR_INVALFLAG;
177 add.cbStruct = sizeof(add);
178 for (p = MSACM_pFirstACMDriverID; p; p = p->pNextACMDriverID) {
179 if (acmDriverDetailsW((HACMDRIVERID)p, &add, 0) != MMSYSERR_NOERROR)
182 if (fdwEnum & ACM_DRIVERENUMF_DISABLED)
183 add.fdwSupport |= ACMDRIVERDETAILS_SUPPORTF_DISABLED;
187 if (!(*fnCallback)((HACMDRIVERID)p, dwInstance, add.fdwSupport))
191 return MMSYSERR_NOERROR;
194 /***********************************************************************
195 * acmDriverID (MSACM32.8)
197 MMRESULT WINAPI acmDriverID(HACMOBJ hao, PHACMDRIVERID phadid, DWORD fdwDriverID)
202 return MMSYSERR_INVALPARAM;
205 return MMSYSERR_INVALFLAG;
207 pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
209 return MMSYSERR_INVALHANDLE;
211 *phadid = (HACMDRIVERID) pao->pACMDriverID;
213 return MMSYSERR_NOERROR;
216 /***********************************************************************
217 * acmDriverMessage (MSACM32.9)
220 LRESULT WINAPI acmDriverMessage(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
222 if ((uMsg >= ACMDM_USER && uMsg < ACMDM_RESERVED_LOW) ||
223 uMsg == ACMDM_DRIVER_ABOUT ||
224 uMsg == DRV_QUERYCONFIGURE ||
225 uMsg == DRV_CONFIGURE)
226 return MSACM_Message(had, uMsg, lParam1, lParam2);
227 return MMSYSERR_INVALPARAM;
231 /***********************************************************************
232 * acmDriverOpen (MSACM32.10)
234 MMRESULT WINAPI acmDriverOpen(PHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen)
236 PWINE_ACMDRIVERID padid;
239 TRACE("(%p, %x, %08lu)\n", phad, hadid, fdwOpen);
242 return MMSYSERR_INVALPARAM;
245 return MMSYSERR_INVALFLAG;
247 padid = MSACM_GetDriverID(hadid);
249 return MMSYSERR_INVALHANDLE;
251 pad = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVER));
252 if (!pad) return MMSYSERR_NOMEM;
254 pad->obj.dwType = WINE_ACMOBJ_DRIVER;
255 pad->obj.pACMDriverID = padid;
257 if (!(pad->hDrvr = padid->hInstModule) && padid->pszDriverAlias)
258 pad->hDrvr = OpenDriverA(padid->pszDriverAlias, NULL, 0);
260 HeapFree(MSACM_hHeap, 0, pad);
261 return MMSYSERR_ERROR;
264 /* insert new pad at beg of list */
265 pad->pNextACMDriver = padid->pACMDriverList;
266 padid->pACMDriverList = pad;
268 /* FIXME: Create a WINE_ACMDRIVER32 */
269 *phad = (HACMDRIVER)pad;
270 TRACE("'%s' => %08lx\n", padid->pszDriverAlias, (DWORD)pad);
271 return MMSYSERR_NOERROR;
274 /***********************************************************************
275 * acmDriverPriority (MSACM32.11)
277 MMRESULT WINAPI acmDriverPriority(HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority)
279 PWINE_ACMDRIVERID padid;
282 LONG lBufferLength = sizeof(szBuffer);
285 DWORD dwPriorityCounter;
287 padid = MSACM_GetDriverID(hadid);
289 return MMSYSERR_INVALHANDLE;
291 /* Check for unknown flags */
293 ~(ACM_DRIVERPRIORITYF_ENABLE|ACM_DRIVERPRIORITYF_DISABLE|
294 ACM_DRIVERPRIORITYF_BEGIN|ACM_DRIVERPRIORITYF_END))
295 return MMSYSERR_INVALFLAG;
297 /* Check for incompatible flags */
298 if ((fdwPriority & ACM_DRIVERPRIORITYF_ENABLE) &&
299 (fdwPriority & ACM_DRIVERPRIORITYF_DISABLE))
300 return MMSYSERR_INVALFLAG;
302 /* Check for incompatible flags */
303 if ((fdwPriority & ACM_DRIVERPRIORITYF_BEGIN) &&
304 (fdwPriority & ACM_DRIVERPRIORITYF_END))
305 return MMSYSERR_INVALFLAG;
307 lError = RegOpenKeyA(HKEY_CURRENT_USER,
308 "Software\\Microsoft\\Multimedia\\"
309 "Audio Compression Manager\\Priority v4.00",
312 /* FIXME: Create key */
313 if (lError != ERROR_SUCCESS)
314 return MMSYSERR_ERROR;
316 for (dwPriorityCounter = 1; ; dwPriorityCounter++) {
317 snprintf(szSubKey, 17, "Priorty%ld", dwPriorityCounter);
318 lError = RegQueryValueA(hPriorityKey, szSubKey, szBuffer, &lBufferLength);
319 if (lError != ERROR_SUCCESS)
322 FIXME("(0x%08x, %ld, %ld): stub (partial)\n",
323 hadid, dwPriority, fdwPriority);
327 RegCloseKey(hPriorityKey);
329 return MMSYSERR_ERROR;
332 /***********************************************************************
333 * acmDriverRemove (MSACM32.12)
335 MMRESULT WINAPI acmDriverRemove(HACMDRIVERID hadid, DWORD fdwRemove)
337 PWINE_ACMDRIVERID padid;
339 padid = MSACM_GetDriverID(hadid);
341 return MMSYSERR_INVALHANDLE;
344 return MMSYSERR_INVALFLAG;
346 MSACM_UnregisterDriver(padid);
348 return MMSYSERR_NOERROR;