Free the debug info when making a critical section global.
[wine] / dlls / msacm / msacm32_main.c
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  * 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
22  */
23
24 #include "winbase.h"
25 #include "winerror.h"
26 #include "windef.h"
27 #include "wine/debug.h"
28 #include "msacm.h"
29 #include "msacmdrv.h"
30 #include "wineacm.h"
31
32 WINE_DEFAULT_DEBUG_CHANNEL(msacm);
33
34 /**********************************************************************/
35
36 HINSTANCE       MSACM_hInstance32 = 0;
37
38 /***********************************************************************
39  *           DllMain (MSACM32.init)
40  */
41 BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
42 {
43     TRACE("%p 0x%lx %p\n", hInstDLL, fdwReason, lpvReserved);
44
45     switch (fdwReason) {
46     case DLL_PROCESS_ATTACH:
47         DisableThreadLibraryCalls(hInstDLL);
48         MSACM_hHeap = HeapCreate(0, 0x10000, 0);
49         MSACM_hInstance32 = hInstDLL;
50         MSACM_RegisterAllDrivers();
51         break;
52     case DLL_PROCESS_DETACH:
53         MSACM_UnregisterAllDrivers();
54         HeapDestroy(MSACM_hHeap);
55         MSACM_hHeap = NULL;
56         MSACM_hInstance32 = NULL;
57         break;
58     default:
59         break;
60     }
61     return TRUE;
62 }
63
64 /***********************************************************************
65  *           XRegThunkEntry (MSACM32.1)
66  * FIXME
67  *   No documentation found.
68  */
69
70 /***********************************************************************
71  *           acmGetVersion (MSACM32.@)
72  */
73 DWORD WINAPI acmGetVersion(void)
74 {
75     OSVERSIONINFOA version;
76
77     version.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
78     if (!GetVersionExA( &version ))
79         return 0x04030000;
80
81     switch (version.dwPlatformId) {
82     case VER_PLATFORM_WIN32_NT:
83         return 0x04000565; /* 4.0.1381 */
84     default:
85         FIXME("%lx not supported\n", version.dwPlatformId);
86     case VER_PLATFORM_WIN32_WINDOWS:
87         return 0x04030000; /* 4.3.0 */
88     }
89 }
90
91 /***********************************************************************
92  *           acmMessage32 (MSACM32.35)
93  * FIXME
94  *   No documentation found.
95  */
96
97 /***********************************************************************
98  *           acmMetrics (MSACM32.@)
99  */
100 MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
101 {
102     PWINE_ACMOBJ        pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
103     BOOL                bLocal = TRUE;
104     PWINE_ACMDRIVERID   padid;
105     DWORD               val = 0;
106     int                 i;
107     MMRESULT            mmr = MMSYSERR_NOERROR;
108
109     TRACE("(%p, %d, %p);\n", hao, uMetric, pMetric);
110
111 #define CheckLocal(padid) (!bLocal || ((padid)->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_LOCAL))
112
113     switch (uMetric) {
114     case ACM_METRIC_COUNT_DRIVERS:
115         bLocal = FALSE;
116         /* fall through */
117     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
118         if (hao) return MMSYSERR_INVALHANDLE;
119         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
120             if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
121                 val++;
122         *(LPDWORD)pMetric = val;
123         break;
124
125     case ACM_METRIC_COUNT_CODECS:
126         bLocal = FALSE;
127         /* fall through */
128     case ACM_METRIC_COUNT_LOCAL_CODECS:
129         if (hao) return MMSYSERR_INVALHANDLE;
130         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
131             if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
132                 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
133                 CheckLocal(padid))
134                 val++;
135         *(LPDWORD)pMetric = val;
136         break;
137
138     case ACM_METRIC_COUNT_CONVERTERS:
139         bLocal = FALSE;
140         /* fall through */
141     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
142         if (hao) return MMSYSERR_INVALHANDLE;
143         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
144             if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
145                  (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
146                 CheckLocal(padid))
147                 val++;
148         *(LPDWORD)pMetric = val;
149         break;
150
151     case ACM_METRIC_COUNT_FILTERS:
152         bLocal = FALSE;
153         /* fall through */
154     case ACM_METRIC_COUNT_LOCAL_FILTERS:
155         if (hao) return MMSYSERR_INVALHANDLE;
156         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
157             if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
158                 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) &&
159                 CheckLocal(padid))
160                 val++;
161         *(LPDWORD)pMetric = val;
162         break;
163
164     case ACM_METRIC_COUNT_DISABLED:
165         bLocal = FALSE;
166         /* fall through */
167     case ACM_METRIC_COUNT_LOCAL_DISABLED:
168         if (hao) return MMSYSERR_INVALHANDLE;
169         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
170             if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
171                 val++;
172         *(LPDWORD)pMetric = val;
173         break;
174
175     case ACM_METRIC_MAX_SIZE_FORMAT:
176         if (hao == NULL) {
177             for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
178                 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
179                     for (i = 0; i < padid->cFormatTags; i++) {
180                         if (val < padid->aFormatTag[i].cbwfx)
181                             val = padid->aFormatTag[i].cbwfx;
182                     }
183                 }
184             }
185         } else if (pao != NULL) {
186             switch (pao->dwType) {
187             case WINE_ACMOBJ_DRIVER:
188             case WINE_ACMOBJ_DRIVERID:
189                 padid = pao->pACMDriverID;
190                 break;
191             default:
192                 return MMSYSERR_INVALHANDLE;
193             }
194             if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
195                 for (i = 0; i < padid->cFormatTags; i++) {
196                     if (val < padid->aFormatTag[i].cbwfx)
197                         val = padid->aFormatTag[i].cbwfx;
198                 }
199             }
200         } else {
201             return MMSYSERR_INVALHANDLE;
202         }
203         *(LPDWORD)pMetric = val;
204         break;
205
206     case ACM_METRIC_COUNT_HARDWARE:
207     case ACM_METRIC_HARDWARE_WAVE_INPUT:
208     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
209     case ACM_METRIC_MAX_SIZE_FILTER:
210     case ACM_METRIC_DRIVER_SUPPORT:
211     case ACM_METRIC_DRIVER_PRIORITY:
212     default:
213         FIXME("(%p, %d, %p): stub\n", hao, uMetric, pMetric);
214         mmr = MMSYSERR_NOTSUPPORTED;
215     }
216     return mmr;
217 }