Added PCM converter internal driver.
[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
10 #include "winbase.h"
11 #include "winerror.h"
12 #include "windef.h"
13 #include "debugtools.h"
14 #include "msacm.h"
15 #include "msacmdrv.h"
16 #include "wineacm.h"
17
18 DEFAULT_DEBUG_CHANNEL(msacm);
19         
20 /**********************************************************************/
21         
22 static DWORD MSACM_dwProcessesAttached = 0;
23 HINSTANCE       MSACM_hInstance32 = 0;
24
25 /***********************************************************************
26  *           MSACM_LibMain (MSACM32.init) 
27  */
28 BOOL WINAPI MSACM32_LibMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
29 {
30     TRACE("0x%x 0x%lx %p\n", hInstDLL, fdwReason, lpvReserved);
31
32     switch (fdwReason) {
33     case DLL_PROCESS_ATTACH:
34         if (MSACM_dwProcessesAttached == 0) {
35             MSACM_hHeap = HeapCreate(0, 0x10000, 0);
36             MSACM_hInstance32 = hInstDLL;
37             MSACM_RegisterAllDrivers();
38         }
39         MSACM_dwProcessesAttached++;
40         break;
41     case DLL_PROCESS_DETACH:
42         MSACM_dwProcessesAttached--;
43         if (MSACM_dwProcessesAttached == 0) {
44             MSACM_UnregisterAllDrivers();
45             HeapDestroy(MSACM_hHeap);
46             MSACM_hHeap = (HANDLE) NULL;
47             MSACM_hInstance32 = (HINSTANCE)NULL;
48         }
49         break;
50     case DLL_THREAD_ATTACH:
51         break;
52     case DLL_THREAD_DETACH:
53         break;
54     default:
55         break;
56     }
57     return TRUE;
58 }
59
60 /***********************************************************************
61  *           XRegThunkEntry (MSACM32.1)
62  * FIXME
63  *   No documentation found.
64  */
65
66 /***********************************************************************
67  *           acmGetVersion (MSACM32.34)
68  */
69 DWORD WINAPI acmGetVersion(void)
70 {
71     OSVERSIONINFOA version;
72     GetVersionExA( &version );
73     switch(version.dwPlatformId)
74     {
75     case VER_PLATFORM_WIN32_NT:
76         return 0x04000565; /* 4.0.1381 */
77     default:
78         FIXME("%ld not supported",version.dwPlatformId);
79     case VER_PLATFORM_WIN32_WINDOWS:
80         return 0x04000000; /* 4.0.0 */
81   }
82 }
83
84 /***********************************************************************
85  *           acmMessage32 (MSACM32.35)
86  * FIXME
87  *   No documentation found.
88  */
89
90 /***********************************************************************
91  *           acmMetrics (MSACM32.36)
92  */
93 MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
94 {
95     PWINE_ACMOBJ        pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
96     BOOL                bLocal = TRUE;
97     PWINE_ACMDRIVERID   padid;
98     DWORD               val = 0;
99     MMRESULT            mmr = MMSYSERR_NOERROR;
100
101     TRACE("(0x%08x, %d, %p);\n", hao, uMetric, pMetric);
102     
103     switch (uMetric) {
104     case ACM_METRIC_COUNT_DRIVERS:
105         bLocal = FALSE;
106         /* fall thru */
107     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
108         if (!pao)
109             return MMSYSERR_INVALHANDLE;
110         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
111             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
112                 val++;
113         *(LPDWORD)pMetric = val;
114         break;
115
116     case ACM_METRIC_COUNT_CODECS:
117         if (!pao)
118             return MMSYSERR_INVALHANDLE;
119         bLocal = FALSE;
120         /* fall thru */
121     case ACM_METRIC_COUNT_LOCAL_CODECS:
122         /* FIXME: don't know how to differentiate codec, converters & filters yet */
123         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
124             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
125                 val++;
126         *(LPDWORD)pMetric = val;
127         break;
128
129     case ACM_METRIC_COUNT_CONVERTERS:
130         bLocal = FALSE;
131         /* fall thru */
132     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
133         /* FIXME: don't know how to differentiate codec, converters & filters yet */
134         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
135             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
136                 val++;
137         *(LPDWORD)pMetric = val;
138         break;
139
140     case ACM_METRIC_COUNT_FILTERS:
141         bLocal = FALSE;
142         /* fall thru */
143     case ACM_METRIC_COUNT_LOCAL_FILTERS:
144         /* FIXME: don't know how to differentiate codec, converters & filters yet */
145         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
146             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
147                 val++;
148         *(LPDWORD)pMetric = val;
149         break;
150
151     case ACM_METRIC_COUNT_DISABLED:
152         bLocal = FALSE;
153         /* fall thru */
154     case ACM_METRIC_COUNT_LOCAL_DISABLED:
155         if (!pao)
156             return MMSYSERR_INVALHANDLE;  
157         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
158             if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
159                 val++;
160         *(LPDWORD)pMetric = val;
161         break;
162     
163     case ACM_METRIC_MAX_SIZE_FORMAT:
164         {
165             ACMFORMATTAGDETAILSW        aftd;
166
167             aftd.cbStruct = sizeof(aftd);
168             aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
169
170             if (hao == (HACMOBJ)NULL) {
171                 mmr = acmFormatTagDetailsW((HACMDRIVER)NULL, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
172             } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVER)) {
173                 mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
174             } else if (MSACM_GetObj(hao, WINE_ACMOBJ_DRIVERID)) {
175                 HACMDRIVER      had;
176                 
177                 if (acmDriverOpen(&had, (HACMDRIVERID)hao, 0) == 0) {
178                     mmr = acmFormatTagDetailsW((HACMDRIVER)hao, &aftd, ACM_FORMATTAGDETAILSF_LARGESTSIZE);
179                     acmDriverClose(had, 0);
180                 }
181             } else {
182                 mmr = MMSYSERR_INVALHANDLE;
183             }
184             if (mmr == MMSYSERR_NOERROR) *(LPDWORD)pMetric = aftd.cbFormatSize;
185         }
186         break;
187
188     case ACM_METRIC_COUNT_HARDWARE:
189     case ACM_METRIC_HARDWARE_WAVE_INPUT:
190     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
191     case ACM_METRIC_MAX_SIZE_FILTER:
192     case ACM_METRIC_DRIVER_SUPPORT:
193     case ACM_METRIC_DRIVER_PRIORITY:
194     default:
195         FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
196         mmr = MMSYSERR_NOTSUPPORTED;
197     }
198     return mmr;
199 }