diff options
Diffstat (limited to 'lib/liblame/ACM/main.cpp')
-rw-r--r-- | lib/liblame/ACM/main.cpp | 216 |
1 files changed, 216 insertions, 0 deletions
diff --git a/lib/liblame/ACM/main.cpp b/lib/liblame/ACM/main.cpp new file mode 100644 index 0000000000..84e47739b6 --- /dev/null +++ b/lib/liblame/ACM/main.cpp @@ -0,0 +1,216 @@ +/** + * + * Lame ACM wrapper, encode/decode MP3 based RIFF/AVI files in MS Windows + * + * Copyright (c) 2002 Steve Lhomme <steve.lhomme at free.fr> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +/*! + \author Steve Lhomme + \version \$Id: main.cpp,v 1.5 2006/12/25 21:37:34 robert Exp $ +*/ + +#if !defined(STRICT) +#define STRICT +#endif // STRICT + +#include <windows.h> + +/// The ACM is considered as a driver and run in Kernel-Mode +/// So the new/delete operators have to be overriden in order to use memory +/// readable out of the calling process + +void * operator new( unsigned int cb ) +{ + return LocalAlloc(LPTR, cb); // VirtualAlloc +} + +void operator delete(void *block) { + LocalFree(block); +} + +extern "C" { + + void *acm_Calloc( size_t num, size_t size ) + { + return LocalAlloc(LPTR, num * size); // VirtualAlloc + } + + void *acm_Malloc( size_t size ) + { + return LocalAlloc(LPTR, size); // VirtualAlloc + } + + void acm_Free( void * mem) + { + LocalFree(mem); + } +}; + +////// End of memory instrumentation + +#include <mmreg.h> +#include <msacm.h> +#include <msacmdrv.h> + +#include <assert.h> + +#include "AEncodeProperties.h" +#include "ACM.h" +#include "resource.h" +#include "adebug.h" + + +ADbg * debug = NULL; + +LONG WINAPI DriverProc(DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2) +{ + + switch (msg) + { + case DRV_OPEN: // acmDriverOpen + { + if (debug == NULL) { + debug = new ADbg(DEBUG_LEVEL_CREATION); + debug->setPrefix("LAMEdrv"); + } + + if (debug != NULL) + { + // Sent when the driver is opened. + if (lParam2 != NULL) + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_OPEN (ID 0x%08X), pDesc = 0x%08X",dwDriverId,lParam2); + else + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_OPEN (ID 0x%08X), pDesc = NULL",dwDriverId); + } + + if (lParam2 != NULL) { + LPACMDRVOPENDESC pDesc = (LPACMDRVOPENDESC)lParam2; + + if (pDesc->fccType != ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC) { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "wrong pDesc->fccType (0x%08X)",pDesc->fccType); + } + return NULL; + } + } else { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "pDesc == NULL"); + } + } + + ACM * ThisACM = new ACM(GetDriverModuleHandle(hdrvr)); + + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "OPENED instance 0x%08X",ThisACM); + } + + return (LONG)ThisACM;// returns 0L to fail + // value subsequently used + // for dwDriverId. + } + break; + + case DRV_CLOSE: // acmDriverClose + { + if (debug != NULL) + { + // Sent when the driver is closed. Drivers are + // unloaded when the open count reaches zero. + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_CLOSE"); + } + + ACM * ThisACM = (ACM *)dwDriverId; + delete ThisACM; + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_FUNC_CODE, "CLOSED instance 0x%08X",ThisACM); + delete debug; + debug = NULL; + } + return 1L; // returns 0L to fail + } + break; + + case DRV_LOAD: + { + // nothing to do + if (debug != NULL) + { +// debug->OutPut(DEBUG_LEVEL_MSG, "DRV_LOAD, version %s %s %s", ACM_VERSION, __DATE__, __TIME__); + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_LOAD, %s %s", __DATE__, __TIME__); + } + return 1L; + } + break; + + case DRV_ENABLE: + { + // nothing to do + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_ENABLE"); + } + return 1L; + } + break; + + case DRV_DISABLE: + { + // nothing to do + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_DISABLE"); + } + return 1L; + } + break; + + case DRV_FREE: + { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "DRV_FREE"); + } + return 1L; + } + break; + + default: + { + ACM * ThisACM = (ACM *)dwDriverId; + + if (ThisACM != NULL) + return ThisACM->DriverProcedure(hdrvr, msg, lParam1, lParam2); + else + { + if (debug != NULL) + { + debug->OutPut(DEBUG_LEVEL_MSG, "Driver not opened, unknown message (0x%08X), lParam1 = 0x%08X, lParam2 = 0x%08X", msg, lParam1, lParam2); + } + + return DefDriverProc (dwDriverId, hdrvr, msg, lParam1, lParam2); + } + } + break; + } +} + |