Moved dll-specific make rules to a separate Makedll.rules file.
[wine] / dlls / msacm32 / 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 #include "winversion.h"
18
19 DEFAULT_DEBUG_CHANNEL(msacm)
20         
21 /**********************************************************************/
22         
23 static DWORD MSACM_dwProcessesAttached = 0;
24
25 /***********************************************************************
26  *           MSACM_LibMain32 (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_RegisterAllDrivers();
37         }
38         MSACM_dwProcessesAttached++;
39         break;
40     case DLL_PROCESS_DETACH:
41         MSACM_dwProcessesAttached--;
42         if (MSACM_dwProcessesAttached == 0) {
43             MSACM_UnregisterAllDrivers();
44             HeapDestroy(MSACM_hHeap);
45             MSACM_hHeap = (HANDLE) NULL;
46         }
47         break;
48     case DLL_THREAD_ATTACH:
49         break;
50     case DLL_THREAD_DETACH:
51         break;
52     default:
53         break;
54     }
55     return TRUE;
56 }
57
58 /***********************************************************************
59  *           XRegThunkEntry (MSACM32.1)
60  * FIXME
61  *   No documentation found.
62  */
63
64 /***********************************************************************
65  *           acmGetVersion32 (MSACM32.34)
66  */
67 DWORD WINAPI acmGetVersion(void)
68 {
69     switch (VERSION_GetVersion()) {
70     default: 
71         FIXME("%s not supported\n", VERSION_GetVersionName());
72     case WIN95:
73         return 0x04000000; /* 4.0.0 */
74     case NT40:
75         return 0x04000565; /* 4.0.1381 */
76     }
77 }
78
79 /***********************************************************************
80  *           acmMessage32 (MSACM32.35)
81  * FIXME
82  *   No documentation found.
83  */
84
85 /***********************************************************************
86  *           acmMetrics (MSACM32.36)
87  */
88 MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID  pMetric)
89 {
90     PWINE_ACMOBJ        pao = MSACM_GetObj(hao);
91     BOOL                bLocal = TRUE;
92     PWINE_ACMDRIVERID   padid;
93     DWORD               val = 0;
94
95     FIXME("(0x%08x, %d, %p): stub\n", hao, uMetric, pMetric);
96     
97     switch (uMetric) {
98     case ACM_METRIC_COUNT_DRIVERS:
99         bLocal = FALSE;
100         /* fall thru */
101     case ACM_METRIC_COUNT_LOCAL_DRIVERS:
102         if (!pao)
103             return MMSYSERR_INVALHANDLE;
104         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
105             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
106                 val++;
107         *(LPDWORD)pMetric = val;
108         return 0;
109
110     case ACM_METRIC_COUNT_CODECS:
111         if (!pao)
112             return MMSYSERR_INVALHANDLE;
113         bLocal = FALSE;
114         /* fall thru */
115     case ACM_METRIC_COUNT_LOCAL_CODECS:
116         /* FIXME: don't know how to differentiate codec, converters & filters yet */
117         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
118             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
119                 val++;
120         *(LPDWORD)pMetric = val;
121         return 0;
122
123     case ACM_METRIC_COUNT_CONVERTERS:
124         bLocal = FALSE;
125         /* fall thru */
126     case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
127         /* FIXME: don't know how to differentiate codec, converters & filters yet */
128         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
129             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
130                 val++;
131         *(LPDWORD)pMetric = val;
132         return 0;
133
134     case ACM_METRIC_COUNT_FILTERS:
135         bLocal = FALSE;
136         /* fall thru */
137     case ACM_METRIC_COUNT_LOCAL_FILTERS:
138         /* FIXME: don't know how to differentiate codec, converters & filters yet */
139         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
140             if (padid->bEnabled /* && (local(padid) || !bLocal) */)
141                 val++;
142         *(LPDWORD)pMetric = val;
143         return 0;
144
145     case ACM_METRIC_COUNT_DISABLED:
146         bLocal = FALSE;
147         /* fall thru */
148     case ACM_METRIC_COUNT_LOCAL_DISABLED:
149         if (!pao)
150             return MMSYSERR_INVALHANDLE;  
151         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
152             if (!padid->bEnabled /* && (local(padid) || !bLocal) */)
153                 val++;
154         *(LPDWORD)pMetric = val;
155         return 0;
156
157     case ACM_METRIC_COUNT_HARDWARE:
158     case ACM_METRIC_HARDWARE_WAVE_INPUT:
159     case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
160     case ACM_METRIC_MAX_SIZE_FORMAT:
161     case ACM_METRIC_MAX_SIZE_FILTER:
162     case ACM_METRIC_DRIVER_SUPPORT:
163     case ACM_METRIC_DRIVER_PRIORITY:
164     default:
165         return MMSYSERR_NOTSUPPORTED;
166     }
167     return MMSYSERR_NOERROR;
168 }