ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

filter.c
Go to the documentation of this file.
00001 /* -*- tab-width: 8; c-basic-offset: 4 -*- */
00002 
00003 /*
00004  *      MSACM32 library
00005  *
00006  *      Copyright 1998  Patrik Stridvall
00007  *
00008  * This library is free software; you can redistribute it and/or
00009  * modify it under the terms of the GNU Lesser General Public
00010  * License as published by the Free Software Foundation; either
00011  * version 2.1 of the License, or (at your option) any later version.
00012  *
00013  * This library is distributed in the hope that it will be useful,
00014  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00016  * Lesser General Public License for more details.
00017  *
00018  * You should have received a copy of the GNU Lesser General Public
00019  * License along with this library; if not, write to the Free Software
00020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00021  */
00022 
00023 #include <stdarg.h>
00024 #include <string.h>
00025 #include "windef.h"
00026 #include "winbase.h"
00027 #include "winnls.h"
00028 #include "winerror.h"
00029 #include "mmsystem.h"
00030 #define NOBITMAP
00031 #include "mmreg.h"
00032 #include "msacm.h"
00033 #include "msacmdrv.h"
00034 #include "wineacm.h"
00035 #include "wine/debug.h"
00036 
00037 WINE_DEFAULT_DEBUG_CHANNEL(msacm);
00038 
00039 /***********************************************************************
00040  *           acmFilterChooseA (MSACM32.@)
00041  */
00042 MMRESULT WINAPI acmFilterChooseA(PACMFILTERCHOOSEA pafltrc)
00043 {
00044     FIXME("(%p): stub\n", pafltrc);
00045     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00046     return MMSYSERR_ERROR;
00047 }
00048 
00049 /***********************************************************************
00050  *           acmFilterChooseW (MSACM32.@)
00051  */
00052 MMRESULT WINAPI acmFilterChooseW(PACMFILTERCHOOSEW pafltrc)
00053 {
00054     FIXME("(%p): stub\n", pafltrc);
00055     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
00056     return MMSYSERR_ERROR;
00057 }
00058 
00059 /***********************************************************************
00060  *           acmFilterDetailsA (MSACM32.@)
00061  */
00062 MMRESULT WINAPI acmFilterDetailsA(HACMDRIVER had, PACMFILTERDETAILSA pafd,
00063                   DWORD fdwDetails)
00064 {
00065     ACMFILTERDETAILSW   afdw;
00066     MMRESULT        mmr;
00067 
00068     memset(&afdw, 0, sizeof(afdw));
00069     afdw.cbStruct = sizeof(afdw);
00070     afdw.dwFilterIndex = pafd->dwFilterIndex;
00071     afdw.dwFilterTag = pafd->dwFilterTag;
00072     afdw.pwfltr = pafd->pwfltr;
00073     afdw.cbwfltr = pafd->cbwfltr;
00074 
00075     mmr = acmFilterDetailsW(had, &afdw, fdwDetails);
00076     if (mmr == MMSYSERR_NOERROR) {
00077     pafd->dwFilterTag = afdw.dwFilterTag;
00078     pafd->fdwSupport = afdw.fdwSupport;
00079         WideCharToMultiByte( CP_ACP, 0, afdw.szFilter, -1, pafd->szFilter,
00080                              sizeof(pafd->szFilter), NULL, NULL );
00081     }
00082     return mmr;
00083 }
00084 
00085 /***********************************************************************
00086  *           acmFilterDetailsW (MSACM32.@)
00087  */
00088 MMRESULT WINAPI acmFilterDetailsW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
00089                   DWORD fdwDetails)
00090 {
00091     MMRESULT            mmr;
00092     ACMFILTERTAGDETAILSA    aftd;
00093 
00094     TRACE("(%p, %p, %d)\n", had, pafd, fdwDetails);
00095 
00096     memset(&aftd, 0, sizeof(aftd));
00097     aftd.cbStruct = sizeof(aftd);
00098 
00099     if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
00100 
00101     switch (fdwDetails) {
00102     case ACM_FILTERDETAILSF_FILTER:
00103     if (pafd->dwFilterTag != pafd->pwfltr->dwFilterTag) {
00104         mmr = MMSYSERR_INVALPARAM;
00105         break;
00106     }
00107     if (had == NULL) {
00108         PWINE_ACMDRIVERID       padid;
00109 
00110         mmr = ACMERR_NOTPOSSIBLE;
00111         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
00112         /* should check for codec only */
00113         if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
00114             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
00115             mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS,
00116                     (LPARAM)pafd, (LPARAM)fdwDetails);
00117             acmDriverClose(had, 0);
00118             if (mmr == MMSYSERR_NOERROR) break;
00119         }
00120         }
00121     } else {
00122         mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
00123     }
00124     break;
00125     case ACM_FILTERDETAILSF_INDEX:
00126     /* should check pafd->dwFilterIndex < aftd->cStandardFilters */
00127     mmr = MSACM_Message(had, ACMDM_FILTER_DETAILS, (LPARAM)pafd, fdwDetails);
00128     break;
00129     default:
00130     WARN("Unknown fdwDetails %08x\n", fdwDetails);
00131     mmr = MMSYSERR_INVALFLAG;
00132     break;
00133     }
00134 
00135     TRACE("=> %d\n", mmr);
00136     return mmr;
00137 }
00138 
00139 struct MSACM_FilterEnumWtoA_Instance {
00140     PACMFILTERDETAILSA pafda;
00141     DWORD_PTR          dwInstance;
00142     ACMFILTERENUMCBA   fnCallback;
00143 };
00144 
00145 static BOOL CALLBACK MSACM_FilterEnumCallbackWtoA(HACMDRIVERID hadid,
00146                           PACMFILTERDETAILSW pafdw,
00147                                                   DWORD_PTR dwInstance,
00148                           DWORD fdwSupport)
00149 {
00150     struct MSACM_FilterEnumWtoA_Instance* pafei;
00151 
00152     pafei = (struct MSACM_FilterEnumWtoA_Instance*)dwInstance;
00153 
00154     pafei->pafda->dwFilterIndex = pafdw->dwFilterIndex;
00155     pafei->pafda->dwFilterTag = pafdw->dwFilterTag;
00156     pafei->pafda->fdwSupport = pafdw->fdwSupport;
00157     WideCharToMultiByte( CP_ACP, 0, pafdw->szFilter, -1, pafei->pafda->szFilter,
00158                          sizeof(pafei->pafda->szFilter), NULL, NULL );
00159 
00160     return (pafei->fnCallback)(hadid, pafei->pafda,
00161                    pafei->dwInstance, fdwSupport);
00162 }
00163 
00164 /***********************************************************************
00165  *           acmFilterEnumA (MSACM32.@)
00166  */
00167 MMRESULT WINAPI acmFilterEnumA(HACMDRIVER had, PACMFILTERDETAILSA pafda,
00168                                ACMFILTERENUMCBA fnCallback,
00169                                DWORD_PTR dwInstance, DWORD fdwEnum)
00170 {
00171     ACMFILTERDETAILSW       afdw;
00172     struct MSACM_FilterEnumWtoA_Instance afei;
00173 
00174     memset(&afdw, 0, sizeof(afdw));
00175     afdw.cbStruct = sizeof(afdw);
00176     afdw.dwFilterIndex = pafda->dwFilterIndex;
00177     afdw.dwFilterTag = pafda->dwFilterTag;
00178     afdw.pwfltr = pafda->pwfltr;
00179     afdw.cbwfltr = pafda->cbwfltr;
00180 
00181     afei.pafda = pafda;
00182     afei.dwInstance = dwInstance;
00183     afei.fnCallback = fnCallback;
00184 
00185     return acmFilterEnumW(had, &afdw, MSACM_FilterEnumCallbackWtoA,
00186                           (DWORD_PTR)&afei, fdwEnum);
00187 }
00188 
00189 static BOOL MSACM_FilterEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had,
00190                    PACMFILTERDETAILSW pafd,
00191                                    ACMFILTERENUMCBW fnCallback,
00192                                    DWORD_PTR dwInstance, DWORD fdwEnum)
00193 {
00194     ACMFILTERTAGDETAILSW    aftd;
00195     unsigned int i, j;
00196 
00197     for (i = 0; i < padid->cFilterTags; i++) {
00198     memset(&aftd, 0, sizeof(aftd));
00199     aftd.cbStruct = sizeof(aftd);
00200     aftd.dwFilterTagIndex = i;
00201     if (acmFilterTagDetailsW(had, &aftd, ACM_FILTERTAGDETAILSF_INDEX) != MMSYSERR_NOERROR)
00202         continue;
00203 
00204     if ((fdwEnum & ACM_FILTERENUMF_DWFILTERTAG) &&
00205         aftd.dwFilterTag != pafd->pwfltr->dwFilterTag)
00206         continue;
00207 
00208     for (j = 0; j < aftd.cStandardFilters; j++) {
00209         pafd->dwFilterIndex = j;
00210         pafd->dwFilterTag = aftd.dwFilterTag;
00211         if (acmFilterDetailsW(had, pafd, ACM_FILTERDETAILSF_INDEX) != MMSYSERR_NOERROR)
00212         continue;
00213 
00214         if (!(fnCallback)((HACMDRIVERID)padid, pafd, dwInstance, padid->fdwSupport))
00215         return FALSE;
00216     }
00217     }
00218     return TRUE;
00219 }
00220 
00221 /***********************************************************************
00222  *           acmFilterEnumW (MSACM32.@)
00223  */
00224 MMRESULT WINAPI acmFilterEnumW(HACMDRIVER had, PACMFILTERDETAILSW pafd,
00225                                ACMFILTERENUMCBW fnCallback,
00226                                DWORD_PTR dwInstance, DWORD fdwEnum)
00227 {
00228     PWINE_ACMDRIVERID       padid;
00229     BOOL            ret;
00230 
00231     TRACE("(%p, %p, %p, %ld, %d)\n",
00232       had, pafd, fnCallback, dwInstance, fdwEnum);
00233 
00234     if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
00235 
00236     if (fdwEnum & ~(ACM_FILTERENUMF_DWFILTERTAG))
00237     FIXME("Unsupported fdwEnum values\n");
00238 
00239     if (had) {
00240     HACMDRIVERID    hadid;
00241 
00242     if (acmDriverID((HACMOBJ)had, &hadid, 0) != MMSYSERR_NOERROR)
00243         return MMSYSERR_INVALHANDLE;
00244     MSACM_FilterEnumHelper(MSACM_GetDriverID(hadid), had, pafd,
00245                    fnCallback, dwInstance, fdwEnum);
00246     return MMSYSERR_NOERROR;
00247     }
00248     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
00249         /* should check for codec only */
00250         if ((padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) ||
00251         acmDriverOpen(&had, (HACMDRIVERID)padid, 0) != MMSYSERR_NOERROR)
00252         continue;
00253         ret = MSACM_FilterEnumHelper(padid, had, pafd,
00254                      fnCallback, dwInstance, fdwEnum);
00255         acmDriverClose(had, 0);
00256         if (!ret) break;
00257     }
00258     return MMSYSERR_NOERROR;
00259 }
00260 
00261 /***********************************************************************
00262  *           acmFilterTagDetailsA (MSACM32.@)
00263  */
00264 MMRESULT WINAPI acmFilterTagDetailsA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
00265                      DWORD fdwDetails)
00266 {
00267     ACMFILTERTAGDETAILSW    aftdw;
00268     MMRESULT            mmr;
00269 
00270     memset(&aftdw, 0, sizeof(aftdw));
00271     aftdw.cbStruct = sizeof(aftdw);
00272     aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex;
00273     aftdw.dwFilterTag = paftda->dwFilterTag;
00274 
00275     mmr = acmFilterTagDetailsW(had, &aftdw, fdwDetails);
00276     if (mmr == MMSYSERR_NOERROR) {
00277     paftda->dwFilterTag = aftdw.dwFilterTag;
00278     paftda->dwFilterTagIndex = aftdw.dwFilterTagIndex;
00279     paftda->cbFilterSize = aftdw.cbFilterSize;
00280     paftda->fdwSupport = aftdw.fdwSupport;
00281     paftda->cStandardFilters = aftdw.cStandardFilters;
00282         WideCharToMultiByte( CP_ACP, 0, aftdw.szFilterTag, -1, paftda->szFilterTag,
00283                              sizeof(paftda->szFilterTag), NULL, NULL );
00284     }
00285     return mmr;
00286 }
00287 
00288 /***********************************************************************
00289  *           acmFilterTagDetailsW (MSACM32.@)
00290  */
00291 MMRESULT WINAPI acmFilterTagDetailsW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
00292                      DWORD fdwDetails)
00293 {
00294     PWINE_ACMDRIVERID   padid;
00295     MMRESULT        mmr;
00296 
00297     TRACE("(%p, %p, %d)\n", had, paftd, fdwDetails);
00298 
00299     if (fdwDetails & ~(ACM_FILTERTAGDETAILSF_FILTERTAG|ACM_FILTERTAGDETAILSF_INDEX|
00300                ACM_FILTERTAGDETAILSF_LARGESTSIZE))
00301     return MMSYSERR_INVALFLAG;
00302 
00303     switch (fdwDetails) {
00304     case ACM_FILTERTAGDETAILSF_FILTERTAG:
00305     if (had == NULL) {
00306         mmr = ACMERR_NOTPOSSIBLE;
00307         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
00308         /* should check for codec only */
00309         if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
00310               acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
00311             mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
00312             acmDriverClose(had, 0);
00313             if (mmr == MMSYSERR_NOERROR) break;
00314         }
00315         }
00316     } else {
00317         mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
00318     }
00319     break;
00320 
00321     case ACM_FILTERTAGDETAILSF_INDEX:
00322     /* FIXME should check paftd->dwFilterTagIndex < add.cFilterTags */
00323     mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
00324     break;
00325 
00326     case ACM_FILTERTAGDETAILSF_LARGESTSIZE:
00327     if (had == NULL) {
00328         ACMFILTERTAGDETAILSW    tmp;
00329         DWORD           ft = paftd->dwFilterTag;
00330 
00331         mmr = ACMERR_NOTPOSSIBLE;
00332         for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
00333         /* should check for codec only */
00334         if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
00335             acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == 0) {
00336 
00337             memset(&tmp, 0, sizeof(tmp));
00338             tmp.cbStruct = sizeof(tmp);
00339             tmp.dwFilterTag = ft;
00340 
00341             if (MSACM_Message(had, ACMDM_FILTERTAG_DETAILS,
00342                       (LPARAM)&tmp, fdwDetails) == MMSYSERR_NOERROR) {
00343             if (mmr == ACMERR_NOTPOSSIBLE ||
00344                 paftd->cbFilterSize < tmp.cbFilterSize) {
00345                 *paftd = tmp;
00346                 mmr = MMSYSERR_NOERROR;
00347             }
00348             }
00349             acmDriverClose(had, 0);
00350         }
00351         }
00352     } else {
00353         mmr = MSACM_Message(had, ACMDM_FILTERTAG_DETAILS, (LPARAM)paftd, fdwDetails);
00354     }
00355     break;
00356 
00357     default:
00358     WARN("Unsupported fdwDetails=%08x\n", fdwDetails);
00359     mmr = MMSYSERR_ERROR;
00360     }
00361 
00362     if (mmr == MMSYSERR_NOERROR &&
00363     paftd->dwFilterTag == WAVE_FORMAT_PCM && paftd->szFilterTag[0] == 0)
00364         MultiByteToWideChar( CP_ACP, 0, "PCM", -1, paftd->szFilterTag,
00365                              sizeof(paftd->szFilterTag)/sizeof(WCHAR) );
00366 
00367     return mmr;
00368 }
00369 
00370 struct MSACM_FilterTagEnumWtoA_Instance {
00371     PACMFILTERTAGDETAILSA paftda;
00372     DWORD_PTR             dwInstance;
00373     ACMFILTERTAGENUMCBA   fnCallback;
00374 };
00375 
00376 static BOOL CALLBACK MSACM_FilterTagEnumCallbackWtoA(HACMDRIVERID hadid,
00377                              PACMFILTERTAGDETAILSW paftdw,
00378                                                      DWORD_PTR dwInstance,
00379                              DWORD fdwSupport)
00380 {
00381     struct MSACM_FilterTagEnumWtoA_Instance* paftei;
00382 
00383     paftei = (struct MSACM_FilterTagEnumWtoA_Instance*)dwInstance;
00384 
00385     paftei->paftda->dwFilterTagIndex = paftdw->dwFilterTagIndex;
00386     paftei->paftda->dwFilterTag = paftdw->dwFilterTag;
00387     paftei->paftda->cbFilterSize = paftdw->cbFilterSize;
00388     paftei->paftda->fdwSupport = paftdw->fdwSupport;
00389     paftei->paftda->cStandardFilters = paftdw->cStandardFilters;
00390     WideCharToMultiByte( CP_ACP, 0, paftdw->szFilterTag, -1, paftei->paftda->szFilterTag,
00391                          sizeof(paftei->paftda->szFilterTag), NULL, NULL );
00392 
00393     return (paftei->fnCallback)(hadid, paftei->paftda,
00394                 paftei->dwInstance, fdwSupport);
00395 }
00396 
00397 /***********************************************************************
00398  *           acmFilterTagEnumA (MSACM32.@)
00399  */
00400 MMRESULT WINAPI acmFilterTagEnumA(HACMDRIVER had, PACMFILTERTAGDETAILSA paftda,
00401                                   ACMFILTERTAGENUMCBA fnCallback,
00402                                   DWORD_PTR dwInstance, DWORD fdwEnum)
00403 {
00404     ACMFILTERTAGDETAILSW    aftdw;
00405     struct MSACM_FilterTagEnumWtoA_Instance aftei;
00406 
00407     memset(&aftdw, 0, sizeof(aftdw));
00408     aftdw.cbStruct = sizeof(aftdw);
00409     aftdw.dwFilterTagIndex = paftda->dwFilterTagIndex;
00410     aftdw.dwFilterTag = paftda->dwFilterTag;
00411 
00412     aftei.paftda = paftda;
00413     aftei.dwInstance = dwInstance;
00414     aftei.fnCallback = fnCallback;
00415 
00416     return acmFilterTagEnumW(had, &aftdw, MSACM_FilterTagEnumCallbackWtoA,
00417                              (DWORD_PTR)&aftei, fdwEnum);
00418 }
00419 
00420 /***********************************************************************
00421  *           acmFilterTagEnumW (MSACM32.@)
00422  */
00423 MMRESULT WINAPI acmFilterTagEnumW(HACMDRIVER had, PACMFILTERTAGDETAILSW paftd,
00424                                   ACMFILTERTAGENUMCBW fnCallback,
00425                                   DWORD_PTR dwInstance, DWORD fdwEnum)
00426 {
00427     PWINE_ACMDRIVERID       padid;
00428     unsigned int            i;
00429 
00430     TRACE("(%p, %p, %p, %ld, %d)\n",
00431       had, paftd, fnCallback, dwInstance, fdwEnum);
00432 
00433     if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM;
00434 
00435     if (had) FIXME("had != NULL, not supported\n");
00436 
00437     for (padid = MSACM_pFirstACMDriverID; padid; padid = padid->pNextACMDriverID) {
00438     /* should check for codec only */
00439     if (!(padid->fdwSupport & ACMDRIVERDETAILS_SUPPORTF_DISABLED) &&
00440         acmDriverOpen(&had, (HACMDRIVERID)padid, 0) == MMSYSERR_NOERROR) {
00441 
00442         for (i = 0; i < padid->cFilterTags; i++) {
00443         paftd->dwFilterTagIndex = i;
00444         if (acmFilterTagDetailsW(had, paftd, ACM_FILTERTAGDETAILSF_INDEX) == MMSYSERR_NOERROR) {
00445             if (!(fnCallback)((HACMDRIVERID)padid, paftd, dwInstance, padid->fdwSupport)) {
00446             padid = NULL;
00447             break;
00448             }
00449         }
00450         }
00451         acmDriverClose(had, 0);
00452     }
00453     }
00454     return MMSYSERR_NOERROR;
00455 }

Generated on Sat May 26 2012 04:23:17 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.