blob: 65528125eaef9c939f0decfd34eb81248b623965 [file] [log] [blame]
Eric Pouech1ddce711999-10-31 18:29:16 +00001/* -*- tab-width: 8; c-basic-offset: 4 -*- */
2
Patrik Stridvall29c08dd1998-10-11 17:00:29 +00003/*
4 * MSACM32 library
5 *
6 * Copyright 1998 Patrik Stridvall
Eric Pouech1ddce711999-10-31 18:29:16 +00007 * 1999 Eric Pouech
Alexandre Julliard0799c1a2002-03-09 23:29:33 +00008 *
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
Jonathan Ernst360a3f92006-05-18 14:49:52 +020021 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000022 */
23
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000024#include <stdarg.h>
25
26#include "windef.h"
Marcus Meissner317af321999-02-17 13:51:06 +000027#include "winbase.h"
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000028#include "wine/debug.h"
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000029#include "mmsystem.h"
Francois Gouget076d78b2004-08-11 19:35:34 +000030#define NOBITMAP
Alexandre Julliarde37c6e12003-09-05 23:08:26 +000031#include "mmreg.h"
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000032#include "msacm.h"
33#include "msacmdrv.h"
Eric Pouech1ddce711999-10-31 18:29:16 +000034#include "wineacm.h"
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000035
Alexandre Julliard0799c1a2002-03-09 23:29:33 +000036WINE_DEFAULT_DEBUG_CHANNEL(msacm);
Vincent Béron9a624912002-05-31 23:06:46 +000037
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000038/**********************************************************************/
Vincent Béron9a624912002-05-31 23:06:46 +000039
Eric Pouechb8ba8452000-08-26 04:33:00 +000040HINSTANCE MSACM_hInstance32 = 0;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000041
42/***********************************************************************
Alexandre Julliard1e1313d2002-11-04 23:53:41 +000043 * DllMain (MSACM32.init)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000044 */
Alexandre Julliard1e1313d2002-11-04 23:53:41 +000045BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpvReserved)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000046{
Michael Stefaniuc0290eb12006-10-12 21:35:06 +020047 TRACE("%p 0x%x %p\n", hInstDLL, fdwReason, lpvReserved);
Eric Pouech1ddce711999-10-31 18:29:16 +000048
49 switch (fdwReason) {
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000050 case DLL_PROCESS_ATTACH:
Dmitry Timoshkov4e1ef0c2003-06-30 20:53:48 +000051 DisableThreadLibraryCalls(hInstDLL);
Alexandre Julliard06187462001-01-17 22:03:18 +000052 MSACM_hHeap = HeapCreate(0, 0x10000, 0);
53 MSACM_hInstance32 = hInstDLL;
54 MSACM_RegisterAllDrivers();
Eric Pouech1ddce711999-10-31 18:29:16 +000055 break;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000056 case DLL_PROCESS_DETACH:
Alexandre Julliard06187462001-01-17 22:03:18 +000057 MSACM_UnregisterAllDrivers();
58 HeapDestroy(MSACM_hHeap);
Francois Gouget9b0b1e02003-01-14 23:43:41 +000059 MSACM_hHeap = NULL;
Francois Gougetd2667a42002-12-02 18:10:57 +000060 MSACM_hInstance32 = NULL;
Eric Pouech1ddce711999-10-31 18:29:16 +000061 break;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000062 default:
Eric Pouech1ddce711999-10-31 18:29:16 +000063 break;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000064 }
Eric Pouech1ddce711999-10-31 18:29:16 +000065 return TRUE;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000066}
67
68/***********************************************************************
69 * XRegThunkEntry (MSACM32.1)
70 * FIXME
71 * No documentation found.
72 */
73
74/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +000075 * acmGetVersion (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000076 */
Eric Pouech1ddce711999-10-31 18:29:16 +000077DWORD WINAPI acmGetVersion(void)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000078{
Alexandre Julliardd586dc92000-08-14 14:35:01 +000079 OSVERSIONINFOA version;
Eric Pouechfaa35942001-04-23 18:14:41 +000080
81 version.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
82 if (!GetVersionExA( &version ))
83 return 0x04030000;
84
85 switch (version.dwPlatformId) {
Alexandre Julliardd586dc92000-08-14 14:35:01 +000086 case VER_PLATFORM_WIN32_NT:
Eric Pouech1ddce711999-10-31 18:29:16 +000087 return 0x04000565; /* 4.0.1381 */
Alexandre Julliardd586dc92000-08-14 14:35:01 +000088 default:
Michael Stefaniuc0290eb12006-10-12 21:35:06 +020089 FIXME("%x not supported\n", version.dwPlatformId);
Andrew Talbota051be52011-10-04 22:48:37 +010090 /* fall through */
Alexandre Julliardd586dc92000-08-14 14:35:01 +000091 case VER_PLATFORM_WIN32_WINDOWS:
Eric Pouechfaa35942001-04-23 18:14:41 +000092 return 0x04030000; /* 4.3.0 */
93 }
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000094}
95
96/***********************************************************************
97 * acmMessage32 (MSACM32.35)
98 * FIXME
99 * No documentation found.
100 */
101
102/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000103 * acmMetrics (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000104 */
Eric Pouechb8ba8452000-08-26 04:33:00 +0000105MMRESULT WINAPI acmMetrics(HACMOBJ hao, UINT uMetric, LPVOID pMetric)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000106{
Eric Pouechb8ba8452000-08-26 04:33:00 +0000107 PWINE_ACMOBJ pao = MSACM_GetObj(hao, WINE_ACMOBJ_DONTCARE);
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000108 BOOL bLocal = TRUE;
109 PWINE_ACMDRIVERID padid;
110 DWORD val = 0;
Hans Leidekkerfe442b22004-09-08 01:23:57 +0000111 unsigned int i;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000112 MMRESULT mmr = MMSYSERR_NOERROR;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000113
Michael Stefaniuc70e9a642002-10-22 00:46:23 +0000114 TRACE("(%p, %d, %p);\n", hao, uMetric, pMetric);
Vincent Béron9a624912002-05-31 23:06:46 +0000115
Eric Pouechfaa35942001-04-23 18:14:41 +0000116#define CheckLocal(padid) (!bLocal || ((padid)->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_LOCAL))
117
Eric Pouech1ddce711999-10-31 18:29:16 +0000118 switch (uMetric) {
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000119 case ACM_METRIC_COUNT_DRIVERS:
Eric Pouech1ddce711999-10-31 18:29:16 +0000120 bLocal = FALSE;
Francois Gouget588ff372001-08-21 17:07:17 +0000121 /* fall through */
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000122 case ACM_METRIC_COUNT_LOCAL_DRIVERS:
Eric Pouechfaa35942001-04-23 18:14:41 +0000123 if (hao) return MMSYSERR_INVALHANDLE;
Robert Reif445fc352004-05-03 20:09:42 +0000124 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000125 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
Eric Pouechf051db32001-05-22 19:21:16 +0000126 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000127 val++;
128 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000129 break;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000130
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000131 case ACM_METRIC_COUNT_CODECS:
Eric Pouech1ddce711999-10-31 18:29:16 +0000132 bLocal = FALSE;
Francois Gouget588ff372001-08-21 17:07:17 +0000133 /* fall through */
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000134 case ACM_METRIC_COUNT_LOCAL_CODECS:
Eric Pouechfaa35942001-04-23 18:14:41 +0000135 if (hao) return MMSYSERR_INVALHANDLE;
Robert Reif445fc352004-05-03 20:09:42 +0000136 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000137 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
Vincent Béron9a624912002-05-31 23:06:46 +0000138 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
Eric Pouechf051db32001-05-22 19:21:16 +0000139 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CODEC) &&
140 CheckLocal(padid))
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000141 val++;
142 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000143 break;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000144
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000145 case ACM_METRIC_COUNT_CONVERTERS:
Eric Pouech1ddce711999-10-31 18:29:16 +0000146 bLocal = FALSE;
Francois Gouget588ff372001-08-21 17:07:17 +0000147 /* fall through */
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000148 case ACM_METRIC_COUNT_LOCAL_CONVERTERS:
Eric Pouechfaa35942001-04-23 18:14:41 +0000149 if (hao) return MMSYSERR_INVALHANDLE;
Robert Reif445fc352004-05-03 20:09:42 +0000150 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000151 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
Vincent Béron9a624912002-05-31 23:06:46 +0000152 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
Eric Pouechf051db32001-05-22 19:21:16 +0000153 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_CONVERTER) &&
154 CheckLocal(padid))
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000155 val++;
156 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000157 break;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000158
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000159 case ACM_METRIC_COUNT_FILTERS:
Eric Pouech1ddce711999-10-31 18:29:16 +0000160 bLocal = FALSE;
Francois Gouget588ff372001-08-21 17:07:17 +0000161 /* fall through */
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000162 case ACM_METRIC_COUNT_LOCAL_FILTERS:
Eric Pouechfaa35942001-04-23 18:14:41 +0000163 if (hao) return MMSYSERR_INVALHANDLE;
Robert Reif445fc352004-05-03 20:09:42 +0000164 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000165 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
Vincent Béron9a624912002-05-31 23:06:46 +0000166 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
167 (padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_FILTER) &&
Eric Pouechf051db32001-05-22 19:21:16 +0000168 CheckLocal(padid))
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000169 val++;
170 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000171 break;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000172
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000173 case ACM_METRIC_COUNT_DISABLED:
Eric Pouech1ddce711999-10-31 18:29:16 +0000174 bLocal = FALSE;
Francois Gouget588ff372001-08-21 17:07:17 +0000175 /* fall through */
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000176 case ACM_METRIC_COUNT_LOCAL_DISABLED:
Eric Pouechfaa35942001-04-23 18:14:41 +0000177 if (hao) return MMSYSERR_INVALHANDLE;
Robert Reif445fc352004-05-03 20:09:42 +0000178 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000179 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID)
Eric Pouechf051db32001-05-22 19:21:16 +0000180 if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) && CheckLocal(padid))
Eric Pouech5c7f1ab1999-12-12 21:28:09 +0000181 val++;
182 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000183 break;
Vincent Béron9a624912002-05-31 23:06:46 +0000184
James Hathewaye940b8c2000-07-11 22:05:47 +0000185 case ACM_METRIC_MAX_SIZE_FORMAT:
Francois Gougetd2667a42002-12-02 18:10:57 +0000186 if (hao == NULL) {
Eric Pouechfaa35942001-04-23 18:14:41 +0000187 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
Eric Pouechf051db32001-05-22 19:21:16 +0000188 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
Eric Pouechfaa35942001-04-23 18:14:41 +0000189 for (i = 0; i < padid->cFormatTags; i++) {
190 if (val < padid->aFormatTag[i].cbwfx)
191 val = padid->aFormatTag[i].cbwfx;
192 }
Eric Pouechb8ba8452000-08-26 04:33:00 +0000193 }
Eric Pouechb8ba8452000-08-26 04:33:00 +0000194 }
Eric Pouechfaa35942001-04-23 18:14:41 +0000195 } else if (pao != NULL) {
196 switch (pao->dwType) {
197 case WINE_ACMOBJ_DRIVER:
198 case WINE_ACMOBJ_DRIVERID:
199 padid = pao->pACMDriverID;
200 break;
201 default:
202 return MMSYSERR_INVALHANDLE;
203 }
Eric Pouechf051db32001-05-22 19:21:16 +0000204 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED)) {
Eric Pouechfaa35942001-04-23 18:14:41 +0000205 for (i = 0; i < padid->cFormatTags; i++) {
206 if (val < padid->aFormatTag[i].cbwfx)
207 val = padid->aFormatTag[i].cbwfx;
208 }
209 }
210 } else {
211 return MMSYSERR_INVALHANDLE;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000212 }
Robert Reif445fc352004-05-03 20:09:42 +0000213 if (!pMetric) return MMSYSERR_INVALPARAM;
Eric Pouechfaa35942001-04-23 18:14:41 +0000214 *(LPDWORD)pMetric = val;
Eric Pouechb8ba8452000-08-26 04:33:00 +0000215 break;
216
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000217 case ACM_METRIC_COUNT_HARDWARE:
Robert Reif445fc352004-05-03 20:09:42 +0000218 if (hao) return MMSYSERR_INVALHANDLE;
219 if (!pMetric) return MMSYSERR_INVALPARAM;
220 *(LPDWORD)pMetric = 0;
221 FIXME("ACM_METRIC_COUNT_HARDWARE not implemented\n");
222 break;
223
Alex Villacís Lasso63413b72006-01-03 13:16:12 +0100224 case ACM_METRIC_DRIVER_PRIORITY:
225 /* Return current list position of driver */
226 if (!hao) return MMSYSERR_INVALHANDLE;
Alex Villacís Lasso63413b72006-01-03 13:16:12 +0100227 mmr = MMSYSERR_INVALHANDLE;
228 for (i = 1, padid = MSACM_pFirstACMDriverID; padid; i++, padid = padid->pNextACMDriverID) {
229 if (padid == (PWINE_ACMDRIVERID)hao) {
Alex Villacís Lasso1da4b592006-01-17 15:59:59 +0100230 if (pMetric) {
231 *(LPDWORD)pMetric = i;
232 mmr = MMSYSERR_NOERROR;
233 } else {
234 mmr = MMSYSERR_INVALPARAM;
235 }
Alex Villacís Lasso63413b72006-01-03 13:16:12 +0100236 break;
237 }
238 }
239 break;
240
Alex Villacís Lasso9a577e52006-01-17 15:59:02 +0100241 case ACM_METRIC_DRIVER_SUPPORT:
242 /* Return fdwSupport for driver */
243 if (!hao) return MMSYSERR_INVALHANDLE;
244 mmr = MMSYSERR_INVALHANDLE;
245 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
246 if (padid == (PWINE_ACMDRIVERID)hao) {
247 if (pMetric) {
248 *(LPDWORD)pMetric = padid->fdwSupport;
249 mmr = MMSYSERR_NOERROR;
250 } else {
251 mmr = MMSYSERR_INVALPARAM;
252 }
253 break;
254 }
255 }
256 break;
257
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000258 case ACM_METRIC_HARDWARE_WAVE_INPUT:
259 case ACM_METRIC_HARDWARE_WAVE_OUTPUT:
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000260 case ACM_METRIC_MAX_SIZE_FILTER:
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000261 default:
Michael Stefaniuc70e9a642002-10-22 00:46:23 +0000262 FIXME("(%p, %d, %p): stub\n", hao, uMetric, pMetric);
Eric Pouechb8ba8452000-08-26 04:33:00 +0000263 mmr = MMSYSERR_NOTSUPPORTED;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000264 }
Eric Pouechb8ba8452000-08-26 04:33:00 +0000265 return mmr;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000266}