#pragma pack(?) changed to #include "*pack*.h"
[wine] / dlls / msacm32 / internal.c
1 /*
2  *      MSACM32 library
3  *
4  *      Copyright 1998  Patrik Stridvall
5  */
6
7 #include "winbase.h"
8 #include "winuser.h"
9 #include "winerror.h"
10 #include "driver.h"
11 #include "heap.h"
12 #include "mmsystem.h"
13 #include "msacm.h"
14 #include "msacmdrv.h"
15 #include "debug.h"
16
17 /**********************************************************************/
18
19 HANDLE MSACM_hHeap = (HANDLE) NULL;
20 PWINE_ACMDRIVERID MSACM_pFirstACMDriverID = NULL;
21 PWINE_ACMDRIVERID MSACM_pLastACMDriverID = NULL;
22
23 /***********************************************************************
24  *           MSACM_RegisterDriver32() 
25  */
26 PWINE_ACMDRIVERID MSACM_RegisterDriver(
27   LPSTR pszDriverAlias, LPSTR pszFileName,
28   PWINE_ACMLOCALDRIVER pLocalDriver)
29 {
30   PWINE_ACMDRIVERID padid;
31   padid = (PWINE_ACMDRIVERID) HeapAlloc(
32     MSACM_hHeap, 0, sizeof(WINE_ACMDRIVERID)
33   );
34   padid->pszDriverAlias = 
35     HEAP_strdupA(MSACM_hHeap, 0, pszDriverAlias);
36   padid->pszFileName = 
37     HEAP_strdupA(MSACM_hHeap, 0, pszFileName);
38   padid->pACMLocalDriver = pLocalDriver; 
39   padid->bEnabled = TRUE;
40   padid->pACMDriver = NULL;
41   padid->pNextACMDriverID = NULL;
42   padid->pPreviousACMDriverID = 
43     MSACM_pLastACMDriverID;
44   MSACM_pLastACMDriverID = padid;
45   if(!MSACM_pFirstACMDriverID)
46     MSACM_pFirstACMDriverID = padid;
47
48   return padid;
49 }
50
51 /***********************************************************************
52  *           MSACM_RegisterAllDrivers32() 
53  */
54 void MSACM_RegisterAllDrivers()
55 {
56   PWINE_ACMBUILTINDRIVER pbd;
57   LPSTR pszBuffer;
58   DWORD dwBufferLength;
59
60   /* FIXME 
61    *  What if the user edits system.ini while the program is running?
62    *  Does Windows handle that?
63    */
64   if(!MSACM_pFirstACMDriverID)
65     return;
66
67   /* FIXME: Do not work! How do I determine the section length? */
68   dwBufferLength = 
69     GetPrivateProfileSectionA("drivers32", NULL, 0, "system.ini");
70
71   pszBuffer = (LPSTR) HeapAlloc(
72     MSACM_hHeap, 0, dwBufferLength
73   );
74   if(GetPrivateProfileSectionA(
75     "drivers32", pszBuffer, dwBufferLength, "system.ini"))
76     {
77       char *s = pszBuffer;
78       while(*s)
79         {
80           if(!lstrncmpiA("MSACM.", s, 6))
81             {
82               char *s2 = s;
83               while(*s2 != '\0' && *s2 != '=') s2++;
84               if(*s2)
85                 {
86                   *s2++='\0';
87                   MSACM_RegisterDriver(s, s2, NULL);
88                 }
89             }  
90           s += lstrlenA(s) + 1; /* Either next char or \0 */
91         }
92     }
93
94   /* FIXME
95    *   Check if any of the builtin driver was added
96    *   when the external drivers was. 
97    */
98
99   pbd = MSACM_BuiltinDrivers;
100   while(pbd->pszDriverAlias)
101     {
102       PWINE_ACMLOCALDRIVER pld;
103       pld = HeapAlloc(MSACM_hHeap, 0, sizeof(WINE_ACMLOCALDRIVER));
104       pld->pfnDriverProc = pbd->pfnDriverProc;
105       MSACM_RegisterDriver(pbd->pszDriverAlias, NULL, pld);
106       pbd++;
107     }
108    HeapFree(MSACM_hHeap, 0, pszBuffer);
109 }
110
111 /***********************************************************************
112  *           MSACM_UnregisterDriver32()
113  */
114 PWINE_ACMDRIVERID MSACM_UnregisterDriver(PWINE_ACMDRIVERID p)
115 {
116   PWINE_ACMDRIVERID pNextACMDriverID;
117
118   if(p->pACMDriver)
119     acmDriverClose((HACMDRIVER) p->pACMDriver, 0);
120
121   if(p->pszDriverAlias)
122     HeapFree(MSACM_hHeap, 0, p->pszDriverAlias);
123   if(p->pszFileName)
124     HeapFree(MSACM_hHeap, 0, p->pszFileName);
125   if(p->pACMLocalDriver)
126     HeapFree(MSACM_hHeap, 0, p->pACMLocalDriver);
127
128   if(p->pPreviousACMDriverID)
129     p->pPreviousACMDriverID->pNextACMDriverID = p->pNextACMDriverID;
130   if(p->pNextACMDriverID)
131     p->pNextACMDriverID->pPreviousACMDriverID = p->pPreviousACMDriverID;
132
133   pNextACMDriverID = p->pNextACMDriverID;
134
135   HeapFree(MSACM_hHeap, 0, p);
136
137   return pNextACMDriverID;
138 }
139
140 /***********************************************************************
141  *           MSACM_UnregisterAllDrivers32()
142  * FIXME
143  *   Where should this function be called?
144  */
145 void MSACM_UnregisterAllDrivers()
146 {
147   PWINE_ACMDRIVERID p = MSACM_pFirstACMDriverID;
148   while(p) p = MSACM_UnregisterDriver(p);
149 }
150
151 /***********************************************************************
152  *           MSACM_GetDriverID32() 
153  */
154 PWINE_ACMDRIVERID MSACM_GetDriverID(HACMDRIVERID hDriverID)
155 {
156   return (PWINE_ACMDRIVERID) hDriverID;
157 }
158
159 /***********************************************************************
160  *           MSACM_GetDriver32()
161  */
162 PWINE_ACMDRIVER MSACM_GetDriver(HACMDRIVER hDriver)
163 {
164   return (PWINE_ACMDRIVER) hDriver;
165 }
166
167 /***********************************************************************
168  *           MSACM_GetObj32()
169  */
170 PWINE_ACMOBJ MSACM_GetObj(HACMOBJ hObj)
171 {
172   return (PWINE_ACMOBJ) hObj;
173 }
174
175 /***********************************************************************
176  *           MSACM_OpenDriverProc32
177  * FIXME
178  *  This function should be integrated with OpenDriver,
179  *  renamed and moved there.
180  */
181 HDRVR MSACM_OpenDriverProc(DRIVERPROC pfnDriverProc)
182 {
183 #if 0
184   LPDRIVERITEMA pDrvr;
185
186   /* FIXME: This is a very bad solution */
187   pDrvr = (LPDRIVERITEMA) HeapAlloc(MSACM_hHeap, HEAP_ZERO_MEMORY, sizeof(DRIVERITEMA));
188   pDrvr->count = 1;
189   pDrvr->driverproc = pfnDriverProc;
190   
191   /* FIXME: Send DRV_OPEN among others to DriverProc */
192
193   return (HDRVR) pDrvr;
194 #else
195   return (HDRVR) 0;
196 #endif
197 }
198
199
200