blob: 6e7ee45576caeef38d22d714012c94433c42c5b9 [file] [log] [blame]
Eric Pouechb8ba8452000-08-26 04:33:00 +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
7 */
8
James Juranf4d5fef2001-01-26 20:43:40 +00009#include <string.h>
Marcus Meissner317af321999-02-17 13:51:06 +000010#include "winbase.h"
Alexandre Julliard24a62ab2000-11-28 22:40:56 +000011#include "winnls.h"
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000012#include "winerror.h"
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000013#include "mmsystem.h"
14#include "msacm.h"
15#include "msacmdrv.h"
Eric Pouechb8ba8452000-08-26 04:33:00 +000016#include "wineacm.h"
Alexandre Julliard9fe7a251999-05-14 08:17:14 +000017#include "debugtools.h"
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000018
Eric Pouechb8ba8452000-08-26 04:33:00 +000019DEFAULT_DEBUG_CHANNEL(msacm);
Patrik Stridvallb4b9fae1999-04-19 14:56:29 +000020
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000021/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +000022 * acmFilterChooseA (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000023 */
Eric Pouechb8ba8452000-08-26 04:33:00 +000024MMRESULT WINAPI acmFilterChooseA(PACMFILTERCHOOSEA pafltrc)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000025{
Eric Pouechb8ba8452000-08-26 04:33:00 +000026 FIXME("(%p): stub\n", pafltrc);
27 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
28 return MMSYSERR_ERROR;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000029}
30
31/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +000032 * acmFilterChooseW (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000033 */
Eric Pouechb8ba8452000-08-26 04:33:00 +000034MMRESULT WINAPI acmFilterChooseW(PACMFILTERCHOOSEW pafltrc)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000035{
Eric Pouechb8ba8452000-08-26 04:33:00 +000036 FIXME("(%p): stub\n", pafltrc);
37 SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
38 return MMSYSERR_ERROR;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000039}
40
41/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +000042 * acmFilterDetailsA (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000043 */
Eric Pouechb8ba8452000-08-26 04:33:00 +000044MMRESULT WINAPI acmFilterDetailsA(HACMDRIVER had, PACMFILTERDETAILSA pafd,
45 DWORD fdwDetails)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000046{
Eric Pouechb8ba8452000-08-26 04:33:00 +000047 ACMFILTERDETAILSW afdw;
48 MMRESULT mmr;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000049
Eric Pouechb8ba8452000-08-26 04:33:00 +000050 memset(&afdw, 0, sizeof(afdw));
51 afdw.cbStruct = sizeof(afdw);
52 afdw.dwFilterIndex = pafd->dwFilterIndex;
53 afdw.dwFilterTag = pafd->dwFilterTag;
54 afdw.pwfltr = pafd->pwfltr;
55 afdw.cbwfltr = pafd->cbwfltr;
56
57 mmr = acmFilterDetailsW(had, &afdw, fdwDetails);
58 if (mmr == MMSYSERR_NOERROR) {
59 pafd->dwFilterTag = afdw.dwFilterTag;
60 pafd->fdwSupport = afdw.fdwSupport;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +000061 WideCharToMultiByte( CP_ACP, 0, afdw.szFilter, -1, pafd->szFilter,
62 sizeof(pafd->szFilter), NULL, NULL );
Eric Pouechb8ba8452000-08-26 04:33:00 +000063 }
64 return mmr;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000065}
66
67/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +000068 * acmFilterDetailsW (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000069 */
Eric Pouechb8ba8452000-08-26 04:33:00 +000070MMRESULT WINAPI acmFilterDetailsW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
71 DWORD fdwDetails)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +000072{
Eric Pouech42cdfcc2000-09-09 20:32:10 +000073 MMRESULT mmr;
74 ACMFILTERTAGDETAILSA aftd;
75
Eric Pouechb8ba8452000-08-26 04:33:00 +000076 TRACE("(0x%08x, %p, %ld)\n", had, pafd, fdwDetails);
77
Eric Pouech42cdfcc2000-09-09 20:32:10 +000078 memset(&aftd, 0, sizeof(aftd));
79 aftd.cbStruct = sizeof(aftd);
80
81 if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
82
83 switch (fdwDetails) {
84 case ACM_FILTERDETAILSF_FILTER:
85 if (pafd->dwFilterTag != pafd->pwfltr->dwFilterTag) {
86 mmr = MMSYSERR_INVALPARAM;
87 break;
88 }
89 if (had == (HACMDRIVER)NULL) {
90 PWINE_ACMDRIVERID padid;
91
92 mmr = ACMERR_NOTPOSSIBLE;
93 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
94 /* should check for codec only */
Eric Pouechf051db32001-05-22 19:21:16 +000095 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
Eric Pouech42cdfcc2000-09-09 20:32:10 +000096 acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
97 mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
98 (LPARAM)pafd, (LPARAM)fdwDetails);
99 acmDriverClose(had, 0);
100 if (mmr == MMSYSERR_NOERROR) break;
101 }
102 }
103 } else {
Eric Pouechfaa35942001-04-23 18:14:41 +0000104 mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000105 }
106 break;
107 case ACM_FILTERDETAILSF_INDEX:
108 /* should check pafd->dwFilterIndex < aftd->cStandardFilters */
Eric Pouechfaa35942001-04-23 18:14:41 +0000109 mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000110 break;
111 default:
112 WARN("Unknown fdwDetails %08lx\n", fdwDetails);
113 mmr = MMSYSERR_INVALFLAG;
114 break;
115 }
116
117 TRACE("=> %d\n", mmr);
118 return mmr;
119}
120
121struct MSACM_FilterEnumWtoA_Instance {
122 PACMFILTERDETAILSA pafda;
123 DWORD dwInstance;
124 ACMFILTERENUMCBA fnCallback;
125};
126
127static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid,
128 PACMFILTERDETAILSW pafdw,
129 DWORD dwInstance,
130 DWORD fdwSupport)
131{
132 struct MSACM_FilterEnumWtoA_Instance* pafei;
133
134 pafei = (struct MSACM_FilterEnumWtoA_Instance*)dwInstance;
135
136 pafei->pafda->dwFilterIndex = pafdw->dwFilterIndex;
137 pafei->pafda->dwFilterTag = pafdw->dwFilterTag;
138 pafei->pafda->fdwSupport = pafdw->fdwSupport;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000139 WideCharToMultiByte( CP_ACP, 0, pafdw->szFilter, -1, pafei->pafda->szFilter,
140 sizeof(pafei->pafda->szFilter), NULL, NULL );
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000141
142 return (pafei->fnCallback)(hadid, pafei->pafda,
143 pafei->dwInstance, fdwSupport);
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000144}
145
146/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000147 * acmFilterEnumA (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000148 */
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000149MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda,
Eric Pouechb8ba8452000-08-26 04:33:00 +0000150 ACMFILTERENUMCBA fnCallback, DWORD dwInstance,
151 DWORD fdwEnum)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000152{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000153 ACMFILTERDETAILSW afdw;
154 struct MSACM_FilterEnumWtoA_Instance afei;
155
156 memset(&afdw, 0, sizeof(afdw));
157 afdw.cbStruct = sizeof(afdw);
158 afdw.dwFilterIndex = pafda->dwFilterIndex;
159 afdw.dwFilterTag = pafda->dwFilterTag;
160 afdw.pwfltr = pafda->pwfltr;
161 afdw.cbwfltr = pafda->cbwfltr;
162
163 afei.pafda = pafda;
164 afei.dwInstance = dwInstance;
165 afei.fnCallback = fnCallback;
166
167 return acmFilterEnumW(had, &afdw, MSACM_FilterEnumCallbackWtoA,
168 (DWORD)&afei, fdwEnum);
169}
170
171static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
172 PACMFILTERDETAILSW pafd,
173 ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
174 DWORD fdwEnum)
175{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000176 ACMFILTERTAGDETAILSW aftd;
177 int i, j;
178
Eric Pouechfaa35942001-04-23 18:14:41 +0000179 for (i = 0; i < padid->cFilterTags; i++) {
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000180 memset(&aftd, 0, sizeof(aftd));
181 aftd.cbStruct = sizeof(aftd);
182 aftd.dwFilterTagIndex = i;
183 if (acmFilterTagDetailsW(had, &aftd, ACM_FILTERTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
184 continue;
185
186 if ((fdwEnum & ACM_FILTERENUMF_DWFILTERTAG) &&
187 aftd.dwFilterTag != pafd->pwfltr->dwFilterTag)
188 continue;
189
190 for (j = 0; j < aftd.cStandardFilters; j++) {
191 pafd->dwFilterIndex = j;
192 pafd->dwFilterTag = aftd.dwFilterTag;
193 if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR)
194 continue;
195
Eric Pouechfaa35942001-04-23 18:14:41 +0000196 if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000197 return FALSE;
198 }
199 }
200 return TRUE;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000201}
202
203/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000204 * acmFilterEnumW (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000205 */
Eric Pouechb8ba8452000-08-26 04:33:00 +0000206MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
207 ACMFILTERENUMCBW fnCallback, DWORD dwInstance,
208 DWORD fdwEnum)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000209{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000210 PWINE_ACMDRIVERID padid;
211 BOOL ret;
212
213 TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
Eric Pouechb8ba8452000-08-26 04:33:00 +0000214 had, pafd, fnCallback, dwInstance, fdwEnum);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000215
216 if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
217
218 if (fdwEnum & ~(ACM_FILTERENUMF_DWFILTERTAG))
219 FIXME("Unsupported fdwEnum values\n");
220
221 if (had) {
222 HACMDRIVERID hadid;
223
224 if (acmDriverID(had, &hadid, 0) != MMSYSERR_NOERROR)
225 return MMSYSERR_INVALHANDLE;
James Hatheway2fd83882001-02-12 01:28:12 +0000226 MSACM_FilterEnumHelper(MSACM_GetDriverID(hadid), had, pafd,
227 fnCallback, dwInstance, fdwEnum);
228 return MMSYSERR_NOERROR;
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000229 }
230 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
231 /* should check for codec only */
Eric Pouechf051db32001-05-22 19:21:16 +0000232 if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
233 acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000234 continue;
235 ret = MSACM_FilterEnumHelper(padid, had, pafd,
236 fnCallback, dwInstance, fdwEnum);
237 acmDriverClose(had, 0);
238 if (!ret) break;
239 }
240 return MMSYSERR_NOERROR;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000241}
242
243/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000244 * acmFilterTagDetailsA (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000245 */
Eric Pouechb8ba8452000-08-26 04:33:00 +0000246MMRESULT WINAPI acmFilterTagDetailsA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
247 DWORD fdwDetails)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000248{
Eric Pouechb8ba8452000-08-26 04:33:00 +0000249 ACMFILTERTAGDETAILSW aftdw;
250 MMRESULT mmr;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000251
Eric Pouechb8ba8452000-08-26 04:33:00 +0000252 memset(&aftdw, 0, sizeof(aftdw));
253 aftdw.cbStruct = sizeof(aftdw);
254 aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex;
255 aftdw.dwFilterTag = paftda->dwFilterTag;
256
257 mmr = acmFilterTagDetailsW(had, &aftdw, fdwDetails);
258 if (mmr == MMSYSERR_NOERROR) {
259 paftda->dwFilterTag = aftdw.dwFilterTag;
260 paftda->dwFilterTagIndex = aftdw.dwFilterTagIndex;
261 paftda->cbFilterSize = aftdw.cbFilterSize;
262 paftda->fdwSupport = aftdw.fdwSupport;
263 paftda->cStandardFilters = aftdw.cStandardFilters;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000264 WideCharToMultiByte( CP_ACP, 0, aftdw.szFilterTag, -1, paftda->szFilterTag,
265 sizeof(paftda->szFilterTag), NULL, NULL );
Eric Pouechb8ba8452000-08-26 04:33:00 +0000266 }
267 return mmr;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000268}
269
270/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000271 * acmFilterTagDetailsW (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000272 */
Eric Pouechb8ba8452000-08-26 04:33:00 +0000273MMRESULT WINAPI acmFilterTagDetailsW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
274 DWORD fdwDetails)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000275{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000276 PWINE_ACMDRIVERID padid;
277 MMRESULT mmr;
278
Eric Pouechb8ba8452000-08-26 04:33:00 +0000279 TRACE("(0x%08x, %p, %ld)\n", had, paftd, fdwDetails);
280
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000281 if (fdwDetails & ~(ACM_FILTERTAGDETAILSF_FILTERTAG|ACM_FILTERTAGDETAILSF_INDEX|
282 ACM_FILTERTAGDETAILSF_LARGESTSIZE))
Eric Pouechb8ba8452000-08-26 04:33:00 +0000283 return MMSYSERR_INVALFLAG;
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000284
285 switch (fdwDetails) {
286 case ACM_FILTERTAGDETAILSF_FILTERTAG:
287 if (had == (HACMDRIVER)NULL) {
288 mmr = ACMERR_NOTPOSSIBLE;
289 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
290 /* should check for codec only */
Eric Pouechf051db32001-05-22 19:21:16 +0000291 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
292 acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
Eric Pouechfaa35942001-04-23 18:14:41 +0000293 mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000294 acmDriverClose(had, 0);
295 if (mmr == MMSYSERR_NOERROR) break;
296 }
297 }
298 } else {
Eric Pouechfaa35942001-04-23 18:14:41 +0000299 mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000300 }
301 break;
302
303 case ACM_FILTERTAGDETAILSF_INDEX:
304 /* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */
Eric Pouechfaa35942001-04-23 18:14:41 +0000305 mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000306 break;
307
308 case ACM_FILTERTAGDETAILSF_LARGESTSIZE:
309 if (had == (HACMDRIVER)NULL) {
310 ACMFILTERTAGDETAILSW tmp;
311 DWORD ft = paftd->dwFilterTag;
312
313 mmr = ACMERR_NOTPOSSIBLE;
314 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
315 /* should check for codec only */
Eric Pouechf051db32001-05-22 19:21:16 +0000316 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000317 acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
318
319 memset(&tmp, 0, sizeof(tmp));
320 tmp.cbStruct = sizeof(tmp);
321 tmp.dwFilterTag = ft;
322
Eric Pouechfaa35942001-04-23 18:14:41 +0000323 if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
324 (LPARAM)&tmp, fdwDetails) == MMSYSERR_NOERROR) {
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000325 if (mmr == ACMERR_NOTPOSSIBLE ||
326 paftd->cbFilterSize < tmp.cbFilterSize) {
327 *paftd = tmp;
328 mmr = MMSYSERR_NOERROR;
329 }
330 }
331 acmDriverClose(had, 0);
332 }
333 }
334 } else {
Eric Pouechfaa35942001-04-23 18:14:41 +0000335 mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000336 }
337 break;
338
339 default:
340 WARN("Unsupported fdwDetails=%08lx\n", fdwDetails);
341 mmr = MMSYSERR_ERROR;
342 }
343
344 if (mmr == MMSYSERR_NOERROR &&
345 paftd->dwFilterTag == WAVE_FORMAT_PCM && paftd->szFilterTag[0] == 0)
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000346 MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFilterTag,
347 sizeof(paftd->szFilterTag)/sizeof(WCHAR) );
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000348
349 return mmr;
350}
351
352struct MSACM_FilterTagEnumWtoA_Instance {
353 PACMFILTERTAGDETAILSA paftda;
354 DWORD dwInstance;
355 ACMFILTERTAGENUMCBA fnCallback;
356};
357
358static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid,
359 PACMFILTERTAGDETAILSW paftdw,
360 DWORD dwInstance,
361 DWORD fdwSupport)
362{
363 struct MSACM_FilterTagEnumWtoA_Instance* paftei;
364
365 paftei = (struct MSACM_FilterTagEnumWtoA_Instance*)dwInstance;
366
367 paftei->paftda->dwFilterTagIndex = paftdw->dwFilterTagIndex;
368 paftei->paftda->dwFilterTag = paftdw->dwFilterTag;
369 paftei->paftda->cbFilterSize = paftdw->cbFilterSize;
370 paftei->paftda->fdwSupport = paftdw->fdwSupport;
371 paftei->paftda->cStandardFilters = paftdw->cStandardFilters;
Alexandre Julliard24a62ab2000-11-28 22:40:56 +0000372 WideCharToMultiByte( CP_ACP, 0, paftdw->szFilterTag, -1, paftei->paftda->szFilterTag,
373 sizeof(paftei->paftda->szFilterTag), NULL, NULL );
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000374
375 return (paftei->fnCallback)(hadid, paftei->paftda,
376 paftei->dwInstance, fdwSupport);
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000377}
378
379/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000380 * acmFilterTagEnumA (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000381 */
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000382MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
Eric Pouechb8ba8452000-08-26 04:33:00 +0000383 ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance,
384 DWORD fdwEnum)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000385{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000386 ACMFILTERTAGDETAILSW aftdw;
387 struct MSACM_FilterTagEnumWtoA_Instance aftei;
388
389 memset(&aftdw, 0, sizeof(aftdw));
390 aftdw.cbStruct = sizeof(aftdw);
391 aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex;
392 aftdw.dwFilterTag = paftda->dwFilterTag;
393
394 aftei.paftda = paftda;
395 aftei.dwInstance = dwInstance;
396 aftei.fnCallback = fnCallback;
397
398 return acmFilterTagEnumW(had, &aftdw, MSACM_FilterTagEnumCallbackWtoA,
399 (DWORD)&aftei, fdwEnum);
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000400}
401
402/***********************************************************************
Patrik Stridvalld9b9c4c2001-06-11 20:14:43 +0000403 * acmFilterTagEnumW (MSACM32.@)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000404 */
Eric Pouechb8ba8452000-08-26 04:33:00 +0000405MMRESULT WINAPI acmFilterTagEnumW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
406 ACMFILTERTAGENUMCBW fnCallback, DWORD dwInstance,
407 DWORD fdwEnum)
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000408{
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000409 PWINE_ACMDRIVERID padid;
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000410 int i;
411
412 TRACE("(0x%08x, %p, %p, %ld, %ld)\n",
413 had, paftd, fnCallback, dwInstance, fdwEnum);
414
415 if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
416
417 if (had) FIXME("had != NULL, not supported\n");
418
419 for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
420 /* should check for codec only */
Eric Pouechf051db32001-05-22 19:21:16 +0000421 if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
422 acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000423
Eric Pouechfaa35942001-04-23 18:14:41 +0000424 for (i = 0; i < padid->cFilterTags; i++) {
425 paftd->dwFilterTagIndex = i;
426 if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
427 if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
428 padid = NULL;
429 break;
Eric Pouech42cdfcc2000-09-09 20:32:10 +0000430 }
431 }
432 }
433 }
434 acmDriverClose(had, 0);
435 }
436 return MMSYSERR_NOERROR;
Patrik Stridvall29c08dd1998-10-11 17:00:29 +0000437}