1 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
6 * Copyright 1998 Patrik Stridvall
22 #include "debugtools.h"
24 DEFAULT_DEBUG_CHANNEL(msacm)
26 /**********************************************************************/
28 HANDLE MSACM_hHeap = (HANDLE) NULL;
29 PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = NULL;
30 PWINE_ACMDRIVERID MSACM_pLastACMDriverID = NULL;
32 /***********************************************************************
33 * MSACM_RegisterDriver()
35 PWINE_ACMDRIVERID MSACM_RegisterDriver(LPSTR pszDriverAlias, LPSTR pszFileName,
36 HINSTANCE hinstModule)
38 PWINE_ACMDRIVERID padid;
40 TRACE("('%s', '%s', 0x%08x)\n", pszDriverAlias, pszFileName, hinstModule);
42 padid = (PWINE_ACMDRIVERID) HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID));
43 padid->obj.dwType = WINE_ACMOBJ_DRIVERID;
44 padid->obj.pACMDriverID = padid;
45 padid->pszDriverAlias = pszDriverAlias ? HEAP_strdupA(MSACM_hHeap, 0, pszDriverAlias) : NULL;
46 padid->pszFileName = pszFileName ? HEAP_strdupA(MSACM_hHeap, 0, pszFileName) : NULL;
47 padid->hInstModule = hinstModule;
48 padid->bEnabled = TRUE;
49 padid->pACMDriverList = NULL;
50 padid->pNextACMDriverID = NULL;
51 padid->pPrevACMDriverID = MSACM_pLastACMDriverID;
52 if (MSACM_pLastACMDriverID)
53 MSACM_pLastACMDriverID->pNextACMDriverID = padid;
54 MSACM_pLastACMDriverID = padid;
55 if (!MSACM_pFirstACMDriverID)
56 MSACM_pFirstACMDriverID = padid;
61 /***********************************************************************
62 * MSACM_RegisterAllDrivers()
64 void MSACM_RegisterAllDrivers(void)
70 * What if the user edits system.ini while the program is running?
71 * Does Windows handle that?
73 if (MSACM_pFirstACMDriverID)
76 /* FIXME: Do not work! How do I determine the section length? */
77 dwBufferLength = 1024;
78 /* EPP GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini"); */
80 pszBuffer = (LPSTR) HeapAlloc(MSACM_hHeap, 0, dwBufferLength);
81 if (GetPrivateProfileSectionA("drivers32", pszBuffer, dwBufferLength, "system.ini")) {
84 if (!strncasecmp("MSACM.", s, 6)) {
86 while (*s2 != '\0' && *s2 != '=') s2++;
89 MSACM_RegisterDriver(s, s2 + 1, 0);
93 s += strlen(s) + 1; /* Either next char or \0 */
97 HeapFree(MSACM_hHeap, 0, pszBuffer);
99 MSACM_RegisterDriver("msacm32.dll", "msacm32.dll", 0);
102 /***********************************************************************
103 * MSACM_UnregisterDriver()
105 PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
107 PWINE_ACMDRIVERID pNextACMDriverID;
109 while (p->pACMDriverList)
110 acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
112 if (p->pszDriverAlias)
113 HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
115 HeapFree(MSACM_hHeap, 0, p->pszFileName);
117 if (p == MSACM_pFirstACMDriverID)
118 MSACM_pFirstACMDriverID = p->pNextACMDriverID;
119 if (p == MSACM_pLastACMDriverID)
120 MSACM_pLastACMDriverID = p->pPrevACMDriverID;
122 if (p->pPrevACMDriverID)
123 p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
124 if (p->pNextACMDriverID)
125 p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
127 pNextACMDriverID = p->pNextACMDriverID;
129 HeapFree(MSACM_hHeap, 0, p);
131 return pNextACMDriverID;
134 /***********************************************************************
135 * MSACM_UnregisterAllDrivers()
137 * Where should this function be called?
139 void MSACM_UnregisterAllDrivers(void)
143 for (p = MSACM_pFirstACMDriverID; p; p = MSACM_UnregisterDriver(p));
146 /***********************************************************************
149 PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type)
151 PWINE_ACMOBJ pao = (PWINE_ACMOBJ)hObj;
153 if (pao == NULL || IsBadReadPtr(pao, sizeof(WINE_ACMOBJ)) ||
154 ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType)))
159 /***********************************************************************
160 * MSACM_GetDriverID()
162 PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
164 return (PWINE_ACMDRIVERID)MSACM_GetObj((HACMOBJ)hDriverID, WINE_ACMOBJ_DRIVERID);
167 /***********************************************************************
170 PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver)
172 return (PWINE_ACMDRIVER)MSACM_GetObj((HACMOBJ)hDriver, WINE_ACMOBJ_DRIVER);
175 /***********************************************************************
178 MMRESULT MSACM_Message(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
180 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
182 return pad ? SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2) : MMSYSERR_INVALHANDLE;