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 = HEAP_strdupA(MSACM_hHeap, 0, pszDriverAlias);
46 padid->pszFileName = HEAP_strdupA(MSACM_hHeap, 0, pszFileName);
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, 0);
92 s += strlen(s) + 1; /* Either next char or \0 */
96 HeapFree(MSACM_hHeap, 0, pszBuffer);
99 /***********************************************************************
100 * MSACM_UnregisterDriver()
102 PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
104 PWINE_ACMDRIVERID pNextACMDriverID;
106 while (p->pACMDriverList)
107 acmDriverClose((HACMDRIVER) p->pACMDriverList, 0);
109 if (p->pszDriverAlias)
110 HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
112 HeapFree(MSACM_hHeap, 0, p->pszFileName);
114 if (p == MSACM_pFirstACMDriverID)
115 MSACM_pFirstACMDriverID = p->pNextACMDriverID;
116 if (p == MSACM_pLastACMDriverID)
117 MSACM_pLastACMDriverID = p->pPrevACMDriverID;
119 if (p->pPrevACMDriverID)
120 p->pPrevACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
121 if (p->pNextACMDriverID)
122 p->pNextACMDriverID->pPrevACMDriverID = p->pPrevACMDriverID;
124 pNextACMDriverID = p->pNextACMDriverID;
126 HeapFree(MSACM_hHeap, 0, p);
128 return pNextACMDriverID;
131 /***********************************************************************
132 * MSACM_UnregisterAllDrivers()
134 * Where should this function be called?
136 void MSACM_UnregisterAllDrivers(void)
140 for (p = MSACM_pFirstACMDriverID; p; p = MSACM_UnregisterDriver(p));
143 /***********************************************************************
146 PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj, DWORD type)
148 PWINE_ACMOBJ pao = (PWINE_ACMOBJ)hObj;
150 if (IsBadReadPtr(pao, sizeof(WINE_ACMOBJ)) ||
151 ((type != WINE_ACMOBJ_DONTCARE) && (type != pao->dwType)))
156 /***********************************************************************
157 * MSACM_GetDriverID()
159 PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
161 return (PWINE_ACMDRIVERID)MSACM_GetObj((HACMOBJ)hDriverID, WINE_ACMOBJ_DRIVERID);
164 /***********************************************************************
167 PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver)
169 return (PWINE_ACMDRIVER)MSACM_GetObj((HACMOBJ)hDriver, WINE_ACMOBJ_DRIVER);
172 /***********************************************************************
175 MMRESULT MSACM_Message(HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2)
177 PWINE_ACMDRIVER pad = MSACM_GetDriver(had);
179 return pad ? SendDriverMessage(pad->hDrvr, uMsg, lParam1, lParam2) : MMSYSERR_INVALHANDLE;