Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 1 | /* -*- tab-width: 8; c-basic-offset: 4 -*- */ |
| 2 | |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 3 | /* |
| 4 | * MSACM32 library |
| 5 | * |
| 6 | * Copyright 1998 Patrik Stridvall |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 7 | * 1999 Eric Pouech |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 8 | * |
| 9 | * This library is free software; you can redistribute it and/or |
| 10 | * modify it under the terms of the GNU Lesser General Public |
| 11 | * License as published by the Free Software Foundation; either |
| 12 | * version 2.1 of the License, or (at your option) any later version. |
| 13 | * |
| 14 | * This library is distributed in the hope that it will be useful, |
| 15 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 17 | * Lesser General Public License for more details. |
| 18 | * |
| 19 | * You should have received a copy of the GNU Lesser General Public |
| 20 | * License along with this library; if not, write to the Free Software |
| 21 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 22 | */ |
| 23 | |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 24 | #include <stdarg.h> |
Patrik Stridvall | f4fca7c | 1999-09-11 16:27:20 +0000 | [diff] [blame] | 25 | #include <string.h> |
| 26 | |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 27 | #include "windef.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 28 | #include "winbase.h" |
Jeremy White | d3e22d9 | 2000-02-10 19:03:02 +0000 | [diff] [blame] | 29 | #include "wingdi.h" |
Marcus Meissner | 317af32 | 1999-02-17 13:51:06 +0000 | [diff] [blame] | 30 | #include "winuser.h" |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 31 | #include "winerror.h" |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 32 | #include "winreg.h" |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 33 | #include "mmsystem.h" |
Alexandre Julliard | e37c6e1 | 2003-09-05 23:08:26 +0000 | [diff] [blame] | 34 | #include "mmreg.h" |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 35 | #include "msacm.h" |
| 36 | #include "msacmdrv.h" |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 37 | #include "wineacm.h" |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 38 | #include "wine/debug.h" |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 39 | #include "wine/unicode.h" |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 40 | |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 41 | WINE_DEFAULT_DEBUG_CHANNEL(msacm); |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 42 | |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 43 | /**********************************************************************/ |
| 44 | |
Francois Gouget | 9b0b1e0 | 2003-01-14 23:43:41 +0000 | [diff] [blame] | 45 | HANDLE MSACM_hHeap = NULL; |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 46 | PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = NULL; |
| 47 | PWINE_ACMDRIVERID MSACM_pLastACMDriverID = NULL; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 48 | |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 49 | #if 0 |
| 50 | /*********************************************************************** |
| 51 | * MSACM_DumpCache |
| 52 | */ |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 53 | static void MSACM_DumpCache(PWINE_ACMDRIVERID padid) |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 54 | { |
| 55 | unsigned i; |
| 56 | |
| 57 | TRACE("cFilterTags=%lu cFormatTags=%lu fdwSupport=%08lx\n", |
| 58 | padid->cFilterTags, padid->cFormatTags, padid->fdwSupport); |
| 59 | for (i = 0; i < padid->cache->cFormatTags; i++) { |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 60 | TRACE("\tdwFormatTag=%lu cbwfx=%lu\n", |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 61 | padid->aFormatTag[i].dwFormatTag, padid->aFormatTag[i].cbwfx); |
| 62 | } |
| 63 | } |
| 64 | #endif |
| 65 | |
| 66 | /*********************************************************************** |
| 67 | * MSACM_FindFormatTagInCache [internal] |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 68 | * |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 69 | * Returns TRUE is the format tag fmtTag is present in the cache. |
| 70 | * If so, idx is set to its index. |
| 71 | */ |
| 72 | BOOL MSACM_FindFormatTagInCache(WINE_ACMDRIVERID* padid, DWORD fmtTag, LPDWORD idx) |
| 73 | { |
| 74 | unsigned i; |
| 75 | |
| 76 | for (i = 0; i < padid->cFormatTags; i++) { |
| 77 | if (padid->aFormatTag[i].dwFormatTag == fmtTag) { |
| 78 | if (idx) *idx = i; |
| 79 | return TRUE; |
| 80 | } |
| 81 | } |
| 82 | return FALSE; |
| 83 | } |
| 84 | |
| 85 | /*********************************************************************** |
| 86 | * MSACM_FillCache |
| 87 | */ |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 88 | static BOOL MSACM_FillCache(PWINE_ACMDRIVERID padid) |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 89 | { |
Eric Pouech | 91f3fc7 | 2002-02-08 17:11:22 +0000 | [diff] [blame] | 90 | HACMDRIVER had = 0; |
| 91 | int ntag; |
| 92 | ACMDRIVERDETAILSW add; |
| 93 | ACMFORMATTAGDETAILSW aftd; |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 94 | |
| 95 | if (acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != 0) |
| 96 | return FALSE; |
| 97 | |
| 98 | padid->aFormatTag = NULL; |
| 99 | add.cbStruct = sizeof(add); |
| 100 | if (MSACM_Message(had, ACMDM_DRIVER_DETAILS, (LPARAM)&add, 0)) |
| 101 | goto errCleanUp; |
| 102 | |
| 103 | if (add.cFormatTags > 0) { |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 104 | padid->aFormatTag = HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 105 | add.cFormatTags * sizeof(padid->aFormatTag[0])); |
| 106 | if (!padid->aFormatTag) goto errCleanUp; |
| 107 | } |
| 108 | |
| 109 | padid->cFormatTags = add.cFormatTags; |
| 110 | padid->cFilterTags = add.cFilterTags; |
| 111 | padid->fdwSupport = add.fdwSupport; |
| 112 | |
| 113 | aftd.cbStruct = sizeof(aftd); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 114 | |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 115 | for (ntag = 0; ntag < add.cFormatTags; ntag++) { |
Eric Pouech | 91f3fc7 | 2002-02-08 17:11:22 +0000 | [diff] [blame] | 116 | aftd.dwFormatTagIndex = ntag; |
| 117 | if (MSACM_Message(had, ACMDM_FORMATTAG_DETAILS, (LPARAM)&aftd, ACM_FORMATTAGDETAILSF_INDEX)) { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 118 | TRACE("IIOs (%s)\n", debugstr_w(padid->pszDriverAlias)); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 119 | goto errCleanUp; |
| 120 | } |
| 121 | padid->aFormatTag[ntag].dwFormatTag = aftd.dwFormatTag; |
Eric Pouech | 91f3fc7 | 2002-02-08 17:11:22 +0000 | [diff] [blame] | 122 | padid->aFormatTag[ntag].cbwfx = aftd.cbFormatSize; |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 123 | } |
Eric Pouech | 91f3fc7 | 2002-02-08 17:11:22 +0000 | [diff] [blame] | 124 | |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 125 | acmDriverClose(had, 0); |
| 126 | |
| 127 | return TRUE; |
| 128 | |
| 129 | errCleanUp: |
| 130 | if (had) acmDriverClose(had, 0); |
| 131 | HeapFree(MSACM_hHeap, 0, padid->aFormatTag); |
| 132 | padid->aFormatTag = NULL; |
| 133 | return FALSE; |
| 134 | } |
| 135 | |
| 136 | /*********************************************************************** |
| 137 | * MSACM_GetRegistryKey |
| 138 | */ |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 139 | static LPWSTR MSACM_GetRegistryKey(const WINE_ACMDRIVERID* padid) |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 140 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 141 | static const WCHAR baseKey[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o','s','o','f','t','\\', |
| 142 | 'A','u','d','i','o','C','o','m','p','r','e','s','s','i','o','n','M','a','n','a','g','e','r','\\', |
| 143 | 'D','r','i','v','e','r','C','a','c','h','e','\\','\0'}; |
| 144 | LPWSTR ret; |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 145 | int len; |
| 146 | |
| 147 | if (!padid->pszDriverAlias) { |
| 148 | ERR("No alias needed for registry entry\n"); |
| 149 | return NULL; |
| 150 | } |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 151 | len = strlenW(baseKey); |
| 152 | ret = HeapAlloc(MSACM_hHeap, 0, (len + strlenW(padid->pszDriverAlias) + 1) * sizeof(WCHAR)); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 153 | if (!ret) return NULL; |
| 154 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 155 | strcpyW(ret, baseKey); |
| 156 | strcpyW(ret + len, padid->pszDriverAlias); |
| 157 | CharLowerW(ret + len); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 158 | return ret; |
| 159 | } |
| 160 | |
| 161 | /*********************************************************************** |
| 162 | * MSACM_ReadCache |
| 163 | */ |
| 164 | static BOOL MSACM_ReadCache(PWINE_ACMDRIVERID padid) |
| 165 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 166 | LPWSTR key = MSACM_GetRegistryKey(padid); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 167 | HKEY hKey; |
| 168 | DWORD type, size; |
| 169 | |
| 170 | if (!key) return FALSE; |
| 171 | |
| 172 | padid->aFormatTag = NULL; |
| 173 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 174 | if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey)) |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 175 | goto errCleanUp; |
| 176 | |
| 177 | size = sizeof(padid->cFormatTags); |
| 178 | if (RegQueryValueExA(hKey, "cFormatTags", 0, &type, (void*)&padid->cFormatTags, &size)) |
| 179 | goto errCleanUp; |
| 180 | size = sizeof(padid->cFilterTags); |
| 181 | if (RegQueryValueExA(hKey, "cFilterTags", 0, &type, (void*)&padid->cFilterTags, &size)) |
| 182 | goto errCleanUp; |
| 183 | size = sizeof(padid->fdwSupport); |
| 184 | if (RegQueryValueExA(hKey, "fdwSupport", 0, &type, (void*)&padid->fdwSupport, &size)) |
| 185 | goto errCleanUp; |
| 186 | |
| 187 | if (padid->cFormatTags > 0) { |
| 188 | size = padid->cFormatTags * sizeof(padid->aFormatTag[0]); |
| 189 | padid->aFormatTag = HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, size); |
| 190 | if (!padid->aFormatTag) goto errCleanUp; |
| 191 | if (RegQueryValueExA(hKey, "aFormatTagCache", 0, &type, (void*)padid->aFormatTag, &size)) |
| 192 | goto errCleanUp; |
| 193 | } |
| 194 | HeapFree(MSACM_hHeap, 0, key); |
| 195 | return TRUE; |
| 196 | |
| 197 | errCleanUp: |
| 198 | HeapFree(MSACM_hHeap, 0, key); |
| 199 | HeapFree(MSACM_hHeap, 0, padid->aFormatTag); |
| 200 | padid->aFormatTag = NULL; |
| 201 | RegCloseKey(hKey); |
| 202 | return FALSE; |
| 203 | } |
| 204 | |
| 205 | /*********************************************************************** |
| 206 | * MSACM_WriteCache |
| 207 | */ |
| 208 | static BOOL MSACM_WriteCache(PWINE_ACMDRIVERID padid) |
| 209 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 210 | LPWSTR key = MSACM_GetRegistryKey(padid); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 211 | HKEY hKey; |
| 212 | |
| 213 | if (!key) return FALSE; |
| 214 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 215 | if (RegCreateKeyW(HKEY_LOCAL_MACHINE, key, &hKey)) |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 216 | goto errCleanUp; |
| 217 | |
| 218 | if (RegSetValueExA(hKey, "cFormatTags", 0, REG_DWORD, (void*)&padid->cFormatTags, sizeof(DWORD))) |
| 219 | goto errCleanUp; |
| 220 | if (RegSetValueExA(hKey, "cFilterTags", 0, REG_DWORD, (void*)&padid->cFilterTags, sizeof(DWORD))) |
| 221 | goto errCleanUp; |
| 222 | if (RegSetValueExA(hKey, "fdwSupport", 0, REG_DWORD, (void*)&padid->fdwSupport, sizeof(DWORD))) |
| 223 | goto errCleanUp; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 224 | if (RegSetValueExA(hKey, "aFormatTagCache", 0, REG_BINARY, |
| 225 | (void*)padid->aFormatTag, |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 226 | padid->cFormatTags * sizeof(padid->aFormatTag[0]))) |
| 227 | goto errCleanUp; |
| 228 | HeapFree(MSACM_hHeap, 0, key); |
| 229 | return TRUE; |
| 230 | |
| 231 | errCleanUp: |
| 232 | HeapFree(MSACM_hHeap, 0, key); |
| 233 | return FALSE; |
| 234 | } |
| 235 | |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 236 | /*********************************************************************** |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 237 | * MSACM_RegisterDriver() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 238 | */ |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 239 | PWINE_ACMDRIVERID MSACM_RegisterDriver(LPWSTR pszDriverAlias, LPWSTR pszFileName, |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 240 | HINSTANCE hinstModule) |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 241 | { |
Eric Pouech | f051db3 | 2001-05-22 19:21:16 +0000 | [diff] [blame] | 242 | PWINE_ACMDRIVERID padid; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 243 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 244 | TRACE("(%s, %s, %p)\n", |
| 245 | debugstr_w(pszDriverAlias), debugstr_w(pszFileName), hinstModule); |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 246 | |
| 247 | padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)); |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 248 | padid->obj.dwType = WINE_ACMOBJ_DRIVERID; |
| 249 | padid->obj.pACMDriverID = padid; |
Alexandre Julliard | 8c540c6 | 2000-11-13 04:16:05 +0000 | [diff] [blame] | 250 | padid->pszDriverAlias = NULL; |
| 251 | if (pszDriverAlias) |
| 252 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 253 | padid->pszDriverAlias = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszDriverAlias)+1) * sizeof(WCHAR) ); |
| 254 | strcpyW( padid->pszDriverAlias, pszDriverAlias ); |
Alexandre Julliard | 8c540c6 | 2000-11-13 04:16:05 +0000 | [diff] [blame] | 255 | } |
| 256 | padid->pszFileName = NULL; |
| 257 | if (pszFileName) |
| 258 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 259 | padid->pszFileName = HeapAlloc( MSACM_hHeap, 0, (strlenW(pszFileName)+1) * sizeof(WCHAR) ); |
| 260 | strcpyW( padid->pszFileName, pszFileName ); |
Alexandre Julliard | 8c540c6 | 2000-11-13 04:16:05 +0000 | [diff] [blame] | 261 | } |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 262 | padid->hInstModule = hinstModule; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 263 | |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 264 | padid->pACMDriverList = NULL; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 265 | padid->pNextACMDriverID = NULL; |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 266 | padid->pPrevACMDriverID = MSACM_pLastACMDriverID; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 267 | if (MSACM_pLastACMDriverID) |
| 268 | MSACM_pLastACMDriverID->pNextACMDriverID = padid; |
| 269 | MSACM_pLastACMDriverID = padid; |
| 270 | if (!MSACM_pFirstACMDriverID) |
| 271 | MSACM_pFirstACMDriverID = padid; |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 272 | /* disable the driver if we cannot load the cache */ |
| 273 | if (!MSACM_ReadCache(padid) && !MSACM_FillCache(padid)) { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 274 | WARN("Couldn't load cache for ACM driver (%s)\n", debugstr_w(pszFileName)); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 275 | MSACM_UnregisterDriver(padid); |
| 276 | return NULL; |
| 277 | } |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 278 | return padid; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 279 | } |
| 280 | |
| 281 | /*********************************************************************** |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 282 | * MSACM_RegisterAllDrivers() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 283 | */ |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 284 | void MSACM_RegisterAllDrivers(void) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 285 | { |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 286 | LPWSTR pszBuffer; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 287 | DWORD dwBufferLength; |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 288 | static WCHAR msacm32[] = {'m','s','a','c','m','3','2','.','d','l','l','\0'}; |
| 289 | static WCHAR msacmW[] = {'M','S','A','C','M','.'}; |
| 290 | static WCHAR drv32[] = {'d','r','i','v','e','r','s','3','2','\0'}; |
| 291 | static WCHAR sys[] = {'s','y','s','t','e','m','.','i','n','i','\0'}; |
Eric Pouech | 140d8cd | 2000-10-12 20:46:49 +0000 | [diff] [blame] | 292 | |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 293 | /* FIXME |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 294 | * What if the user edits system.ini while the program is running? |
| 295 | * Does Windows handle that? |
| 296 | */ |
| 297 | if (MSACM_pFirstACMDriverID) |
| 298 | return; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 299 | |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 300 | /* FIXME: Does not work! How do I determine the section length? */ |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 301 | dwBufferLength = 1024; |
| 302 | /* EPP GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */ |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 303 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 304 | pszBuffer = (LPWSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength * sizeof(WCHAR)); |
| 305 | if (GetPrivateProfileSectionW(drv32, pszBuffer, dwBufferLength, sys)) |
| 306 | { |
| 307 | LPWSTR s = pszBuffer, s2; |
| 308 | |
| 309 | while (*s) |
| 310 | { |
| 311 | CharUpperBuffW(s, 6); |
| 312 | if (memcmp(s, msacmW, 6 * sizeof(WCHAR)) == 0) |
| 313 | { |
| 314 | s2 = s; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 315 | while (*s2 != '\0' && *s2 != '=') s2++; |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 316 | if (*s2) |
| 317 | { |
Eric Pouech | 140d8cd | 2000-10-12 20:46:49 +0000 | [diff] [blame] | 318 | *s2 = '\0'; |
| 319 | MSACM_RegisterDriver(s, s2 + 1, 0); |
| 320 | *s2 = '='; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 321 | } |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 322 | } |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 323 | s += strlenW(s) + 1; /* Either next char or \0 */ |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 324 | } |
| 325 | } |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 326 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 327 | HeapFree(MSACM_hHeap, 0, pszBuffer); |
Eric Pouech | 140d8cd | 2000-10-12 20:46:49 +0000 | [diff] [blame] | 328 | |
Eric Pouech | 5061d3a | 2003-07-02 00:40:14 +0000 | [diff] [blame] | 329 | MSACM_RegisterDriver(msacm32, msacm32, 0); |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 330 | } |
| 331 | |
| 332 | /*********************************************************************** |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 333 | * MSACM_UnregisterDriver() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 334 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 335 | PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 336 | { |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 337 | PWINE_ACMDRIVERID pNextACMDriverID; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 338 | |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 339 | while (p->pACMDriverList) |
| 340 | acmDriverClose((HACMDRIVER) p->pACMDriverList, 0); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 341 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 342 | if (p->pszDriverAlias) |
| 343 | HeapFree(MSACM_hHeap, 0, p->pszDriverAlias); |
| 344 | if (p->pszFileName) |
| 345 | HeapFree(MSACM_hHeap, 0, p->pszFileName); |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 346 | HeapFree(MSACM_hHeap, 0, p->aFormatTag); |
| 347 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 348 | if (p == MSACM_pFirstACMDriverID) |
| 349 | MSACM_pFirstACMDriverID = p->pNextACMDriverID; |
| 350 | if (p == MSACM_pLastACMDriverID) |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 351 | MSACM_pLastACMDriverID = p->pPrevACMDriverID; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 352 | |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 353 | if (p->pPrevACMDriverID) |
| 354 | p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 355 | if (p->pNextACMDriverID) |
Eric Pouech | 5c7f1ab | 1999-12-12 21:28:09 +0000 | [diff] [blame] | 356 | p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 357 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 358 | pNextACMDriverID = p->pNextACMDriverID; |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 359 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 360 | HeapFree(MSACM_hHeap, 0, p); |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 361 | |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 362 | return pNextACMDriverID; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 363 | } |
| 364 | |
| 365 | /*********************************************************************** |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 366 | * MSACM_UnregisterAllDrivers() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 367 | */ |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 368 | void MSACM_UnregisterAllDrivers(void) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 369 | { |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 370 | PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID; |
Eric Pouech | 1ddce71 | 1999-10-31 18:29:16 +0000 | [diff] [blame] | 371 | |
Eric Pouech | faa3594 | 2001-04-23 18:14:41 +0000 | [diff] [blame] | 372 | while (p) { |
| 373 | MSACM_WriteCache(p); |
| 374 | p = MSACM_UnregisterDriver(p); |
| 375 | } |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 376 | } |
| 377 | |
| 378 | /*********************************************************************** |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 379 | * MSACM_GetObj() |
| 380 | */ |
| 381 | PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type) |
| 382 | { |
| 383 | PWINE_ACMOBJ pao = (PWINE_ACMOBJ)hObj; |
| 384 | |
James Hatheway | 23b320e | 2000-10-02 03:33:20 +0000 | [diff] [blame] | 385 | if (pao == NULL || IsBadReadPtr(pao, sizeof(WINE_ACMOBJ)) || |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 386 | ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType))) |
| 387 | return NULL; |
| 388 | return pao; |
| 389 | } |
| 390 | |
| 391 | /*********************************************************************** |
Vincent Béron | 9a62491 | 2002-05-31 23:06:46 +0000 | [diff] [blame] | 392 | * MSACM_GetDriverID() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 393 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 394 | PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 395 | { |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 396 | return (PWINE_ACMDRIVERID)MSACM_GetObj((HACMOBJ)hDriverID, WINE_ACMOBJ_DRIVERID); |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 397 | } |
| 398 | |
| 399 | /*********************************************************************** |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 400 | * MSACM_GetDriver() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 401 | */ |
Alexandre Julliard | a396029 | 1999-02-26 11:11:13 +0000 | [diff] [blame] | 402 | PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 403 | { |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 404 | return (PWINE_ACMDRIVER)MSACM_GetObj((HACMOBJ)hDriver, WINE_ACMOBJ_DRIVER); |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 405 | } |
| 406 | |
| 407 | /*********************************************************************** |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 408 | * MSACM_Message() |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 409 | */ |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 410 | MMRESULT MSACM_Message(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2) |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 411 | { |
Eric Pouech | b8ba845 | 2000-08-26 04:33:00 +0000 | [diff] [blame] | 412 | PWINE_ACMDRIVER pad = MSACM_GetDriver(had); |
| 413 | |
| 414 | return pad ? SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2) : MMSYSERR_INVALHANDLE; |
Patrik Stridvall | 29c08dd | 1998-10-11 17:00:29 +0000 | [diff] [blame] | 415 | } |