//==========================================================================; // // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY // KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR // PURPOSE. // // Copyright (c) 1992 - 1994 Microsoft Corporation. All Rights Reserved. // //--------------------------------------------------------------------------; // // acmthunk.c // // Description: // This is a thunk layer to the Audio Compression Manager. It's // purpose is to allow an application to use the ACM only if it is // available (like under Win 3.1 and NT where the ACM may or may not // be installed). // // There are two requirements for using this module: // // 1. Compile and link with this module before linking to MMSYSTEM.LIB. // Do *NOT* link with MSACM.LIB. // // 2. Before calling any other functions in ACM function set, call // acmThunkInitialize(). This will cause all dyna-linking to occur. // // 3. Before exiting your application, call acmThunkTerminate(). // This will unlink to the ACM and free allocated resources. // // NOTE! this could be written more efficiently in Assembly by doing // a jump to the correct API in the ACM, but this would not be // portable (easily) on NT. So the arguments will be repushed on the // stack.. such is life. // //==========================================================================; #include #include #include #include #include // // // #ifdef WIN32 #define BCODE #else #define BCODE _based(_segname("_CODE")) #endif //==========================================================================; // // Prototypes and String Defines for Dyna-Linking to the ACM // // //==========================================================================; #define ACMINST_NOT_PRESENT NULL #define ACMINST_TRY_LINKING (HINSTANCE)(UINT)-1 static HINSTANCE ghinstAcm = ACMINST_TRY_LINKING; #ifdef WIN32 TCHAR BCODE gszAcmModuleName[] = TEXT("MSACM32.DLL"); #else char BCODE gszAcmModuleName[] = "MSACM.DLL"; #endif FARPROC *gpafnAcmFunctions; PSTR BCODE gapszAcmFunctions[] = { "acmGetVersion", "acmMetrics", "acmDriverEnum", #ifdef WIN32 "acmDriverDetailsW", "acmDriverDetailsA", #else "acmDriverDetails", #endif #ifdef WIN32 "acmDriverAddW", "acmDriverAddA", #else "acmDriverAdd", #endif "acmDriverRemove", "acmDriverOpen", "acmDriverClose", "acmDriverMessage", "acmDriverID", "acmDriverPriority", #ifdef WIN32 "acmFormatTagDetailsW", "acmFormatTagDetailsA", #else "acmFormatTagDetails", #endif #ifdef WIN32 "acmFormatTagEnumW", "acmFormatTagEnumA", #else "acmFormatTagEnum", #endif #ifdef WIN32 "acmFormatChooseW", "acmFormatChooseA", #else "acmFormatChoose", #endif #ifdef WIN32 "acmFormatDetailsW", "acmFormatDetailsA", #else "acmFormatDetails", #endif #ifdef WIN32 "acmFormatEnumW", "acmFormatEnumA", #else "acmFormatEnum", #endif "acmFormatSuggest", #ifdef WIN32 "acmFilterTagDetailsW", "acmFilterTagDetailsA", #else "acmFilterTagDetails", #endif #ifdef WIN32 "acmFilterTagEnumW", "acmFilterTagEnumA", #else "acmFilterTagEnum", #endif #ifdef WIN32 "acmFilterChooseW", "acmFilterChooseA", #else "acmFilterChoose", #endif #ifdef WIN32 "acmFilterDetailsW", "acmFilterDetailsA", #else "acmFilterDetails", #endif #ifdef WIN32 "acmFilterEnumW", "acmFilterEnumA", #else "acmFilterEnum", #endif "acmStreamOpen", "acmStreamClose", "acmStreamSize", "acmStreamConvert", "acmStreamReset", "acmStreamPrepareHeader", "acmStreamUnprepareHeader" }; #ifdef WIN32 // // For Win32 // enum { ACMTHUNK_GETVERSION = 0, ACMTHUNK_METRICS, ACMTHUNK_DRIVERENUM, ACMTHUNK_DRIVERDETAILSW, ACMTHUNK_DRIVERDETAILSA, ACMTHUNK_DRIVERADDW, ACMTHUNK_DRIVERADDA, ACMTHUNK_DRIVERREMOVE, ACMTHUNK_DRIVEROPEN, ACMTHUNK_DRIVERCLOSE, ACMTHUNK_DRIVERMESSAGE, ACMTHUNK_DRIVERID, ACMTHUNK_DRIVERPRIORITY, ACMTHUNK_FORMATTAGDETAILSW, ACMTHUNK_FORMATTAGDETAILSA, ACMTHUNK_FORMATTAGENUMW, ACMTHUNK_FORMATTAGENUMA, ACMTHUNK_FORMATCHOOSEW, ACMTHUNK_FORMATCHOOSEA, ACMTHUNK_FORMATDETAILSW, ACMTHUNK_FORMATDETAILSA, ACMTHUNK_FORMATENUMW, ACMTHUNK_FORMATENUMA, ACMTHUNK_FORMATSUGGEST, ACMTHUNK_FILTERTAGDETAILSW, ACMTHUNK_FILTERTAGDETAILSA, ACMTHUNK_FILTERTAGENUMW, ACMTHUNK_FILTERTAGENUMA, ACMTHUNK_FILTERCHOOSEW, ACMTHUNK_FILTERCHOOSEA, ACMTHUNK_FILTERDETAILSW, ACMTHUNK_FILTERDETAILSA, ACMTHUNK_FILTERENUMW, ACMTHUNK_FILTERENUMA, ACMTHUNK_STREAMOPEN, ACMTHUNK_STREAMCLOSE, ACMTHUNK_STREAMSIZE, ACMTHUNK_STREAMCONVERT, ACMTHUNK_STREAMRESET, ACMTHUNK_STREAMPREPAREHEADER, ACMTHUNK_STREAMUNPREPAREHEADER, ACMTHUNK_MAX_FUNCTIONS }; #ifdef _UNICODE #define ACMTHUNK_DRIVERDETAILS ACMTHUNK_DRIVERDETAILSW #define ACMTHUNK_DRIVERADD ACMTHUNK_DRIVERADDW #define ACMTHUNK_FORMATTAGDETAILS ACMTHUNK_FORMATTAGDETAILSW #define ACMTHUNK_FORMATTAGENUM ACMTHUNK_FORMATTAGENUMW #define ACMTHUNK_FORMATCHOOSE ACMTHUNK_FORMATCHOOSEW #define ACMTHUNK_FORMATDETAILS ACMTHUNK_FORMATDETAILSW #define ACMTHUNK_FORMATENUM ACMTHUNK_FORMATENUMW #define ACMTHUNK_FILTERTAGDETAILS ACMTHUNK_FILTERTAGDETAILSW #define ACMTHUNK_FILTERTAGENUM ACMTHUNK_FILTERTAGENUMW #define ACMTHUNK_FILTERCHOOSE ACMTHUNK_FILTERCHOOSEW #define ACMTHUNK_FILTERDETAILS ACMTHUNK_FILTERDETAILSW #define ACMTHUNK_FILTERENUM ACMTHUNK_FILTERENUMW #else #define ACMTHUNK_DRIVERDETAILS ACMTHUNK_DRIVERDETAILSA #define ACMTHUNK_DRIVERADD ACMTHUNK_DRIVERADDA #define ACMTHUNK_FORMATTAGDETAILS ACMTHUNK_FORMATTAGDETAILSA #define ACMTHUNK_FORMATTAGENUM ACMTHUNK_FORMATTAGENUMA #define ACMTHUNK_FORMATCHOOSE ACMTHUNK_FORMATCHOOSEA #define ACMTHUNK_FORMATDETAILS ACMTHUNK_FORMATDETAILSA #define ACMTHUNK_FORMATENUM ACMTHUNK_FORMATENUMA #define ACMTHUNK_FILTERTAGDETAILS ACMTHUNK_FILTERTAGDETAILSA #define ACMTHUNK_FILTERTAGENUM ACMTHUNK_FILTERTAGENUMA #define ACMTHUNK_FILTERCHOOSE ACMTHUNK_FILTERCHOOSEA #define ACMTHUNK_FILTERDETAILS ACMTHUNK_FILTERDETAILSA #define ACMTHUNK_FILTERENUM ACMTHUNK_FILTERENUMA #endif #else // if Win32 // // For Win16 // enum { ACMTHUNK_GETVERSION = 0, ACMTHUNK_METRICS, ACMTHUNK_DRIVERENUM, ACMTHUNK_DRIVERDETAILS, ACMTHUNK_DRIVERADD, ACMTHUNK_DRIVERREMOVE, ACMTHUNK_DRIVEROPEN, ACMTHUNK_DRIVERCLOSE, ACMTHUNK_DRIVERMESSAGE, ACMTHUNK_DRIVERID, ACMTHUNK_DRIVERPRIORITY, ACMTHUNK_FORMATTAGDETAILS, ACMTHUNK_FORMATTAGENUM, ACMTHUNK_FORMATCHOOSE, ACMTHUNK_FORMATDETAILS, ACMTHUNK_FORMATENUM, ACMTHUNK_FORMATSUGGEST, ACMTHUNK_FILTERTAGDETAILS, ACMTHUNK_FILTERTAGENUM, ACMTHUNK_FILTERCHOOSE, ACMTHUNK_FILTERDETAILS, ACMTHUNK_FILTERENUM, ACMTHUNK_STREAMOPEN, ACMTHUNK_STREAMCLOSE, ACMTHUNK_STREAMSIZE, ACMTHUNK_STREAMCONVERT, ACMTHUNK_STREAMRESET, ACMTHUNK_STREAMPREPAREHEADER, ACMTHUNK_STREAMUNPREPAREHEADER, ACMTHUNK_MAX_FUNCTIONS }; #endif // if WIN32 else #define ACMTHUNK_SIZE_TABLE_BYTES (ACMTHUNK_MAX_FUNCTIONS * sizeof(FARPROC)) //==========================================================================; // // // //==========================================================================; //--------------------------------------------------------------------------; // // BOOL acmThunkInitialize // // Description: // // // Arguments: // None. // // Return (BOOL): // //--------------------------------------------------------------------------; BOOL FAR PASCAL acmThunkInitialize ( void ) { DWORD (ACMAPI *pfnAcmGetVersion) ( void ); UINT fuErrorMode; DWORD dwVersion; UINT u; // // if we have already linked to the API's, then just succeed... // if (NULL != gpafnAcmFunctions) { // // someone isn't satisfied with calling this API only once? // return (TRUE); } // // if we have already tried to link to the ACM, then fail this // call--it isn't present. // if (ACMINST_TRY_LINKING != ghinstAcm) return (FALSE); // // try to get a handle on the ACM--if we cannot do this, then fail // fuErrorMode = SetErrorMode(SEM_NOOPENFILEERRORBOX); ghinstAcm = LoadLibrary(gszAcmModuleName); SetErrorMode(fuErrorMode); if (ghinstAcm < (HINSTANCE)HINSTANCE_ERROR) { ghinstAcm = ACMINST_NOT_PRESENT; return (FALSE); } (FARPROC)pfnAcmGetVersion = GetProcAddress(ghinstAcm, gapszAcmFunctions[ACMTHUNK_GETVERSION]); if (NULL == pfnAcmGetVersion) { FreeLibrary(ghinstAcm); ghinstAcm = ACMINST_NOT_PRESENT; return (FALSE); } // // allocate our array of function pointers to the ACM... note that // this is dynamically allocated so if the ACM is _not_ present, // then this code and data takes up very little space. // gpafnAcmFunctions = (FARPROC *)LocalAlloc(LPTR, ACMTHUNK_SIZE_TABLE_BYTES); if (NULL == gpafnAcmFunctions) { FreeLibrary(ghinstAcm); ghinstAcm = ACMINST_NOT_PRESENT; return (FALSE); } gpafnAcmFunctions[ACMTHUNK_GETVERSION] = (FARPROC)pfnAcmGetVersion; // // if the version of the ACM is *NOT* V2.00 or greater, then // all other API's are unavailable--so don't waste time trying // to link to them. // dwVersion = (* pfnAcmGetVersion)(); if (0x0200 > HIWORD(dwVersion)) { return (TRUE); } // // yipee! the ACM V2.00 or greater appears to be installed and // happy with us--so link to the rest of the nifty cool API's. // // start at index 1 since we already linked to acmGetVersion above // for (u = 1; u < ACMTHUNK_MAX_FUNCTIONS; u++) { gpafnAcmFunctions[u] = GetProcAddress(ghinstAcm, gapszAcmFunctions[u]); } // // finally, return success // return (TRUE); } // acmThunkInitialize() //--------------------------------------------------------------------------; // // BOOL acmThunkTerminate // // Description: // // // Arguments: // None. // // Return (BOOL): // //--------------------------------------------------------------------------; BOOL FAR PASCAL acmThunkTerminate ( void ) { // // // if (NULL != gpafnAcmFunctions) { LocalFree((HLOCAL)gpafnAcmFunctions); gpafnAcmFunctions = NULL; FreeLibrary(ghinstAcm); ghinstAcm = ACMINST_TRY_LINKING; } return (TRUE); } // acmThunkTerminate() //==========================================================================; // // General Information API's // // //==========================================================================; DWORD ACMAPI acmGetVersion ( void ) { DWORD (ACMAPI *pfnAcmGetVersion) ( void ); DWORD dwVersion; if (NULL == gpafnAcmFunctions) return (0L); (FARPROC)pfnAcmGetVersion = gpafnAcmFunctions[ACMTHUNK_GETVERSION]; if (NULL == pfnAcmGetVersion) return (0L); dwVersion = (* pfnAcmGetVersion)(); return (dwVersion); } // acmGetVersion() //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmMetrics ( HACMOBJ hao, UINT uMetric, LPVOID pMetric ) { MMRESULT (ACMAPI *pfnAcmMetrics) ( HACMOBJ hao, UINT uMetric, LPVOID pMetric ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmMetrics = gpafnAcmFunctions[ACMTHUNK_METRICS]; if (NULL == pfnAcmMetrics) return (MMSYSERR_ERROR); mmr = (* pfnAcmMetrics)(hao, uMetric, pMetric); return (mmr); } // acmMetrics() //==========================================================================; // // ACM Driver Management API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverEnum ( ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmDriverEnum) ( ACMDRIVERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverEnum = gpafnAcmFunctions[ACMTHUNK_DRIVERENUM]; if (NULL == pfnAcmDriverEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverEnum)(fnCallback, dwInstance, fdwEnum); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverDetails ( HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmDriverDetails) ( HACMDRIVERID hadid, LPACMDRIVERDETAILS padd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverDetails = gpafnAcmFunctions[ACMTHUNK_DRIVERDETAILS]; if (NULL == pfnAcmDriverDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverDetails)(hadid, padd, fdwDetails); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmDriverDetailsA ( HACMDRIVERID hadid, LPACMDRIVERDETAILSA padd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmDriverDetails) ( HACMDRIVERID hadid, LPACMDRIVERDETAILSA padd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverDetails = gpafnAcmFunctions[ACMTHUNK_DRIVERDETAILSA]; if (NULL == pfnAcmDriverDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverDetails)(hadid, padd, fdwDetails); return (mmr); } #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverAdd ( LPHACMDRIVERID phadid, HINSTANCE hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd ) { MMRESULT (ACMAPI *pfnAcmDriverAdd) ( LPHACMDRIVERID phadid, HINSTANCE hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverAdd = gpafnAcmFunctions[ACMTHUNK_DRIVERADD]; if (NULL == pfnAcmDriverAdd) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverAdd)(phadid, hinstModule, lParam, dwPriority, fdwAdd); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmDriverAddA ( LPHACMDRIVERID phadid, HINSTANCE hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd ) { MMRESULT (ACMAPI *pfnAcmDriverAdd) ( LPHACMDRIVERID phadid, HINSTANCE hinstModule, LPARAM lParam, DWORD dwPriority, DWORD fdwAdd ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverAdd = gpafnAcmFunctions[ACMTHUNK_DRIVERADDA]; if (NULL == pfnAcmDriverAdd) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverAdd)(phadid, hinstModule, lParam, dwPriority, fdwAdd); return (mmr); } #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverRemove ( HACMDRIVERID hadid, DWORD fdwRemove ) { MMRESULT (ACMAPI *pfnAcmDriverRemove) ( HACMDRIVERID hadid, DWORD fdwRemove ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverRemove = gpafnAcmFunctions[ACMTHUNK_DRIVERREMOVE]; if (NULL == pfnAcmDriverRemove) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverRemove)(hadid, fdwRemove); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverOpen ( LPHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen ) { MMRESULT (ACMAPI *pfnAcmDriverOpen) ( LPHACMDRIVER phad, HACMDRIVERID hadid, DWORD fdwOpen ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverOpen = gpafnAcmFunctions[ACMTHUNK_DRIVEROPEN]; if (NULL == pfnAcmDriverOpen) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverOpen)(phad, hadid, fdwOpen); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverClose ( HACMDRIVER had, DWORD fdwClose ) { MMRESULT (ACMAPI *pfnAcmDriverClose) ( HACMDRIVER had, DWORD fdwClose ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverClose = gpafnAcmFunctions[ACMTHUNK_DRIVERCLOSE]; if (NULL == pfnAcmDriverClose) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverClose)(had, fdwClose); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; LRESULT ACMAPI acmDriverMessage ( HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2 ) { LRESULT (ACMAPI *pfnAcmDriverMessage) ( HACMDRIVER had, UINT uMsg, LPARAM lParam1, LPARAM lParam2 ); LRESULT lr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverMessage = gpafnAcmFunctions[ACMTHUNK_DRIVERMESSAGE]; if (NULL == pfnAcmDriverMessage) return (MMSYSERR_ERROR); lr = (* pfnAcmDriverMessage)(had, uMsg, lParam1, lParam2); return (lr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverID ( HACMOBJ hao, LPHACMDRIVERID phadid, DWORD fdwDriverId ) { MMRESULT (ACMAPI *pfnAcmDriverId) ( HACMOBJ hao, LPHACMDRIVERID phadid, DWORD fdwDriverId ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverId = gpafnAcmFunctions[ACMTHUNK_DRIVERID]; if (NULL == pfnAcmDriverId) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverId)(hao, phadid, fdwDriverId); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmDriverPriority ( HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority ) { MMRESULT (ACMAPI *pfnAcmDriverPriority) ( HACMDRIVERID hadid, DWORD dwPriority, DWORD fdwPriority ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmDriverPriority = gpafnAcmFunctions[ACMTHUNK_DRIVERPRIORITY]; if (NULL == pfnAcmDriverPriority) return (MMSYSERR_ERROR); mmr = (* pfnAcmDriverPriority)(hadid, dwPriority, fdwPriority); return (mmr); } //==========================================================================; // // Format Tag Information API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatTagDetails ( HACMDRIVER had, LPACMFORMATTAGDETAILS paftd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFormatTagDetails) ( HACMDRIVER had, LPACMFORMATTAGDETAILS paftd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatTagDetails = gpafnAcmFunctions[ACMTHUNK_FORMATTAGDETAILS]; if (NULL == pfnAcmFormatTagDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatTagDetails)(had, paftd, fdwDetails); return (mmr); } // acmFormatTagDetails() #ifdef _UNICODE MMRESULT ACMAPI acmFormatTagDetailsA ( HACMDRIVER had, LPACMFORMATTAGDETAILSA paftd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFormatTagDetails) ( HACMDRIVER had, LPACMFORMATTAGDETAILSA paftd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatTagDetails = gpafnAcmFunctions[ACMTHUNK_FORMATTAGDETAILSA]; if (NULL == pfnAcmFormatTagDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatTagDetails)(had, paftd, fdwDetails); return (mmr); } // acmFormatTagDetails() #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatTagEnum ( HACMDRIVER had, LPACMFORMATTAGDETAILS paftd, ACMFORMATTAGENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFormatTagEnum) ( HACMDRIVER had, LPACMFORMATTAGDETAILS paftd, ACMFORMATTAGENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatTagEnum = gpafnAcmFunctions[ACMTHUNK_FORMATTAGENUM]; if (NULL == pfnAcmFormatTagEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatTagEnum)(had, paftd, fnCallback, dwInstance, fdwEnum); return (mmr); } // acmFormatTagEnum() #ifdef _UNICODE MMRESULT ACMAPI acmFormatTagEnumA ( HACMDRIVER had, LPACMFORMATTAGDETAILSA paftd, ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFormatTagEnum) ( HACMDRIVER had, LPACMFORMATTAGDETAILSA paftd, ACMFORMATTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatTagEnum = gpafnAcmFunctions[ACMTHUNK_FORMATTAGENUMA]; if (NULL == pfnAcmFormatTagEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatTagEnum)(had, paftd, fnCallback, dwInstance, fdwEnum); return (mmr); } // acmFormatTagEnum() #endif //==========================================================================; // // Format Information API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatChoose ( LPACMFORMATCHOOSE pafmtc ) { MMRESULT (ACMAPI *pfnAcmFormatChoose) ( LPACMFORMATCHOOSE pafmtc ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatChoose = gpafnAcmFunctions[ACMTHUNK_FORMATCHOOSE]; if (NULL == pfnAcmFormatChoose) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatChoose)(pafmtc); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmFormatChooseA ( LPACMFORMATCHOOSEA pafmtc ) { MMRESULT (ACMAPI *pfnAcmFormatChoose) ( LPACMFORMATCHOOSEA pafmtc ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatChoose = gpafnAcmFunctions[ACMTHUNK_FORMATCHOOSEA]; if (NULL == pfnAcmFormatChoose) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatChoose)(pafmtc); return (mmr); } #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatDetails ( HACMDRIVER had, LPACMFORMATDETAILS pafd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFormatDetails) ( HACMDRIVER had, LPACMFORMATDETAILS pafd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatDetails = gpafnAcmFunctions[ACMTHUNK_FORMATDETAILS]; if (NULL == pfnAcmFormatDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatDetails)(had, pafd, fdwDetails); return (mmr); } // acmFormatDetails() #ifdef _UNICODE MMRESULT ACMAPI acmFormatDetailsA ( HACMDRIVER had, LPACMFORMATDETAILSA pafd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFormatDetails) ( HACMDRIVER had, LPACMFORMATDETAILSA pafd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatDetails = gpafnAcmFunctions[ACMTHUNK_FORMATDETAILSA]; if (NULL == pfnAcmFormatDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatDetails)(had, pafd, fdwDetails); return (mmr); } // acmFormatDetails() #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatEnum ( HACMDRIVER had, LPACMFORMATDETAILS pafd, ACMFORMATENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFormatEnum) ( HACMDRIVER had, LPACMFORMATDETAILS pafd, ACMFORMATENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatEnum = gpafnAcmFunctions[ACMTHUNK_FORMATENUM]; if (NULL == pfnAcmFormatEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatEnum)(had, pafd, fnCallback, dwInstance, fdwEnum); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmFormatEnumA ( HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFormatEnum) ( HACMDRIVER had, LPACMFORMATDETAILSA pafd, ACMFORMATENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatEnum = gpafnAcmFunctions[ACMTHUNK_FORMATENUMA]; if (NULL == pfnAcmFormatEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatEnum)(had, pafd, fnCallback, dwInstance, fdwEnum); return (mmr); } #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFormatSuggest ( HACMDRIVER had, LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest ) { MMRESULT (ACMAPI *pfnAcmFormatSuggest) ( HACMDRIVER had, LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, DWORD cbwfxDst, DWORD fdwSuggest ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFormatSuggest = gpafnAcmFunctions[ACMTHUNK_FORMATSUGGEST]; if (NULL == pfnAcmFormatSuggest) return (MMSYSERR_ERROR); mmr = (* pfnAcmFormatSuggest)(had, pwfxSrc, pwfxDst, cbwfxDst, fdwSuggest); return (mmr); } //==========================================================================; // // Filter Tag Information API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFilterTagDetails ( HACMDRIVER had, LPACMFILTERTAGDETAILS paftd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFilterTagDetails) ( HACMDRIVER had, LPACMFILTERTAGDETAILS paftd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterTagDetails = gpafnAcmFunctions[ACMTHUNK_FILTERTAGDETAILS]; if (NULL == pfnAcmFilterTagDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterTagDetails)(had, paftd, fdwDetails); return (mmr); } // acmFilterTagDetails() #ifdef _UNICODE MMRESULT ACMAPI acmFilterTagDetailsA ( HACMDRIVER had, LPACMFILTERTAGDETAILSA paftd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFilterTagDetails) ( HACMDRIVER had, LPACMFILTERTAGDETAILSA paftd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterTagDetails = gpafnAcmFunctions[ACMTHUNK_FILTERTAGDETAILSA]; if (NULL == pfnAcmFilterTagDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterTagDetails)(had, paftd, fdwDetails); return (mmr); } // acmFilterTagDetails() #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFilterTagEnum ( HACMDRIVER had, LPACMFILTERTAGDETAILS paftd, ACMFILTERTAGENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFilterTagEnum) ( HACMDRIVER had, LPACMFILTERTAGDETAILS paftd, ACMFILTERTAGENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterTagEnum = gpafnAcmFunctions[ACMTHUNK_FILTERTAGENUM]; if (NULL == pfnAcmFilterTagEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterTagEnum)(had, paftd, fnCallback, dwInstance, fdwEnum); return (mmr); } // acmFilterTagEnum() #ifdef _UNICODE MMRESULT ACMAPI acmFilterTagEnumA ( HACMDRIVER had, LPACMFILTERTAGDETAILSA paftd, ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFilterTagEnum) ( HACMDRIVER had, LPACMFILTERTAGDETAILSA paftd, ACMFILTERTAGENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterTagEnum = gpafnAcmFunctions[ACMTHUNK_FILTERTAGENUMA]; if (NULL == pfnAcmFilterTagEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterTagEnum)(had, paftd, fnCallback, dwInstance, fdwEnum); return (mmr); } // acmFilterTagEnum() #endif //==========================================================================; // // Filter Information API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFilterChoose ( LPACMFILTERCHOOSE pafltrc ) { MMRESULT (ACMAPI *pfnAcmFilterChoose) ( LPACMFILTERCHOOSE pafltrc ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterChoose = gpafnAcmFunctions[ACMTHUNK_FILTERCHOOSE]; if (NULL == pfnAcmFilterChoose) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterChoose)(pafltrc); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmFilterChooseA ( LPACMFILTERCHOOSEA pafltrc ) { MMRESULT (ACMAPI *pfnAcmFilterChoose) ( LPACMFILTERCHOOSEA pafltrc ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterChoose = gpafnAcmFunctions[ACMTHUNK_FILTERCHOOSEA]; if (NULL == pfnAcmFilterChoose) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterChoose)(pafltrc); return (mmr); } #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFilterDetails ( HACMDRIVER had, LPACMFILTERDETAILS pafd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFilterDetails) ( HACMDRIVER had, LPACMFILTERDETAILS pafd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterDetails = gpafnAcmFunctions[ACMTHUNK_FILTERDETAILS]; if (NULL == pfnAcmFilterDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterDetails)(had, pafd, fdwDetails); return (mmr); } // acmFilterDetails() #ifdef _UNICODE MMRESULT ACMAPI acmFilterDetailsA ( HACMDRIVER had, LPACMFILTERDETAILSA pafd, DWORD fdwDetails ) { MMRESULT (ACMAPI *pfnAcmFilterDetails) ( HACMDRIVER had, LPACMFILTERDETAILSA pafd, DWORD fdwDetails ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterDetails = gpafnAcmFunctions[ACMTHUNK_FILTERDETAILSA]; if (NULL == pfnAcmFilterDetails) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterDetails)(had, pafd, fdwDetails); return (mmr); } // acmFilterDetails() #endif //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmFilterEnum ( HACMDRIVER had, LPACMFILTERDETAILS pafd, ACMFILTERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFilterEnum) ( HACMDRIVER had, LPACMFILTERDETAILS pafd, ACMFILTERENUMCB fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterEnum = gpafnAcmFunctions[ACMTHUNK_FILTERENUM]; if (NULL == pfnAcmFilterEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterEnum)(had, pafd, fnCallback, dwInstance, fdwEnum); return (mmr); } #ifdef _UNICODE MMRESULT ACMAPI acmFilterEnumA ( HACMDRIVER had, LPACMFILTERDETAILSA pafd, ACMFILTERENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ) { MMRESULT (ACMAPI *pfnAcmFilterEnum) ( HACMDRIVER had, LPACMFILTERDETAILSA pafd, ACMFILTERENUMCBA fnCallback, DWORD dwInstance, DWORD fdwEnum ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmFilterEnum = gpafnAcmFunctions[ACMTHUNK_FILTERENUMA]; if (NULL == pfnAcmFilterEnum) return (MMSYSERR_ERROR); mmr = (* pfnAcmFilterEnum)(had, pafd, fnCallback, dwInstance, fdwEnum); return (mmr); } #endif //==========================================================================; // // ACM Stream Management API's // // //==========================================================================; //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamOpen ( LPHACMSTREAM phas, HACMDRIVER had, LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, LPWAVEFILTER pwfltr, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen ) { MMRESULT (ACMAPI *pfnAcmStreamOpen) ( LPHACMSTREAM phas, HACMDRIVER had, LPWAVEFORMATEX pwfxSrc, LPWAVEFORMATEX pwfxDst, LPWAVEFILTER pwfltr, DWORD dwCallback, DWORD dwInstance, DWORD fdwOpen ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamOpen = gpafnAcmFunctions[ACMTHUNK_STREAMOPEN]; if (NULL == pfnAcmStreamOpen) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamOpen)(phas, had, pwfxSrc, pwfxDst, pwfltr, dwCallback, dwInstance, fdwOpen); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamClose ( HACMSTREAM has, DWORD fdwClose ) { MMRESULT (ACMAPI *pfnAcmStreamClose) ( HACMSTREAM has, DWORD fdwClose ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamClose = gpafnAcmFunctions[ACMTHUNK_STREAMCLOSE]; if (NULL == pfnAcmStreamClose) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamClose)(has, fdwClose); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamSize ( HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize ) { MMRESULT (ACMAPI *pfnAcmStreamSize) ( HACMSTREAM has, DWORD cbInput, LPDWORD pdwOutputBytes, DWORD fdwSize ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamSize = gpafnAcmFunctions[ACMTHUNK_STREAMSIZE]; if (NULL == pfnAcmStreamSize) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamSize)(has, cbInput, pdwOutputBytes, fdwSize); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamConvert ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert ) { MMRESULT (ACMAPI *pfnAcmStreamConvert) ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwConvert ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamConvert = gpafnAcmFunctions[ACMTHUNK_STREAMCONVERT]; if (NULL == pfnAcmStreamConvert) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamConvert)(has, pash, fdwConvert); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamReset ( HACMSTREAM has, DWORD fdwReset ) { MMRESULT (ACMAPI *pfnAcmStreamReset) ( HACMSTREAM has, DWORD fdwReset ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamReset = gpafnAcmFunctions[ACMTHUNK_STREAMRESET]; if (NULL == pfnAcmStreamReset) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamReset)(has, fdwReset); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamPrepareHeader ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare ) { MMRESULT (ACMAPI *pfnAcmStreamPrepareHeader) ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwPrepare ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamPrepareHeader = gpafnAcmFunctions[ACMTHUNK_STREAMPREPAREHEADER]; if (NULL == pfnAcmStreamPrepareHeader) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamPrepareHeader)(has, pash, fdwPrepare); return (mmr); } //--------------------------------------------------------------------------; //--------------------------------------------------------------------------; MMRESULT ACMAPI acmStreamUnprepareHeader ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare ) { MMRESULT (ACMAPI *pfnAcmStreamUnprepareHeader) ( HACMSTREAM has, LPACMSTREAMHEADER pash, DWORD fdwUnprepare ); MMRESULT mmr; if (NULL == gpafnAcmFunctions) return (MMSYSERR_ERROR); (FARPROC)pfnAcmStreamUnprepareHeader = gpafnAcmFunctions[ACMTHUNK_STREAMUNPREPAREHEADER]; if (NULL == pfnAcmStreamUnprepareHeader) return (MMSYSERR_ERROR); mmr = (* pfnAcmStreamUnprepareHeader)(has, pash, fdwUnprepare); return (mmr); }