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