diff options
Diffstat (limited to 'lib/liblame/Dll/Example.cpp')
-rw-r--r-- | lib/liblame/Dll/Example.cpp | 288 |
1 files changed, 288 insertions, 0 deletions
diff --git a/lib/liblame/Dll/Example.cpp b/lib/liblame/Dll/Example.cpp new file mode 100644 index 0000000000..fec7565e21 --- /dev/null +++ b/lib/liblame/Dll/Example.cpp @@ -0,0 +1,288 @@ +/* + * LAME DLL Sample Code. + * + * Copyright (c) 2000 A.L. Faber + * + * 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 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. + */ + + +#include <windows.h> +#include <stdio.h> +#include <io.h> +#include <fcntl.h> +#include <sys/stat.h> +#include "BladeMP3EncDLL.h" + +BEINITSTREAM beInitStream=NULL; +BEENCODECHUNK beEncodeChunk=NULL; +BEDEINITSTREAM beDeinitStream=NULL; +BECLOSESTREAM beCloseStream=NULL; +BEVERSION beVersion=NULL; +BEWRITEVBRHEADER beWriteVBRHeader=NULL; +BEWRITEINFOTAG beWriteInfoTag=NULL; + + +// Main program +int main(int argc, char *argv[]) +{ + HINSTANCE hDLL =NULL; + FILE* pFileIn =NULL; + FILE* pFileOut =NULL; + BE_VERSION Version ={0,}; + BE_CONFIG beConfig ={0,}; + + CHAR strFileIn[255] ={'0',}; + CHAR strFileOut[255] ={'0',}; + + DWORD dwSamples =0; + DWORD dwMP3Buffer =0; + HBE_STREAM hbeStream =0; + BE_ERR err =0; + + PBYTE pMP3Buffer =NULL; + PSHORT pWAVBuffer =NULL; + + // check number of arguments + if(argc != 2) + { + fprintf(stderr,"Usage: %s <filename.wav>\n", argv[0]); + fprintf(stderr,"Descr: Short demo to show how to use the lame_enc.dll library file\n"); + fprintf(stderr,"Note : WAV file is assumed to to have the following parameters\n"); + fprintf(stderr," : 44100 Hz, stereo, 16 Bits per sample\n"); + return -1; + } + + // Setup the file names + strcpy(strFileIn ,argv[1]); + strcpy(strFileOut,argv[1]); + + // Add mp3 extention + strcat(strFileOut,".mp3"); + + // Load lame_enc.dll library (Make sure though that you set the + // project/settings/debug Working Directory correctly, otherwhise the DLL can't be loaded + + hDLL = LoadLibrary("lame_enc.dll"); + + if ( NULL == hDLL ) + { + hDLL = LoadLibrary("..\\..\\output\\lame_enc.dll"); + } + + if( NULL == hDLL ) + { + fprintf(stderr,"Error loading lame_enc.DLL"); + return -1; + } + + // Get Interface functions from the DLL + beInitStream = (BEINITSTREAM) GetProcAddress(hDLL, TEXT_BEINITSTREAM); + beEncodeChunk = (BEENCODECHUNK) GetProcAddress(hDLL, TEXT_BEENCODECHUNK); + beDeinitStream = (BEDEINITSTREAM) GetProcAddress(hDLL, TEXT_BEDEINITSTREAM); + beCloseStream = (BECLOSESTREAM) GetProcAddress(hDLL, TEXT_BECLOSESTREAM); + beVersion = (BEVERSION) GetProcAddress(hDLL, TEXT_BEVERSION); + beWriteVBRHeader= (BEWRITEVBRHEADER) GetProcAddress(hDLL,TEXT_BEWRITEVBRHEADER); + beWriteInfoTag = (BEWRITEINFOTAG) GetProcAddress(hDLL,TEXT_BEWRITEINFOTAG); + + // Check if all interfaces are present + if(!beInitStream || !beEncodeChunk || !beDeinitStream || !beCloseStream || !beVersion || !beWriteVBRHeader) + { + printf("Unable to get LAME interfaces"); + return -1; + } + + // Get the version number + beVersion( &Version ); + + printf( + "lame_enc.dll version %u.%02u (%u/%u/%u)\n" + "lame_enc Engine %u.%02u\n" + "lame_enc homepage at %s\n\n", + Version.byDLLMajorVersion, Version.byDLLMinorVersion, + Version.byDay, Version.byMonth, Version.wYear, + Version.byMajorVersion, Version.byMinorVersion, + Version.zHomepage); + + // Try to open the WAV file, be sure to open it as a binary file! + pFileIn = fopen( strFileIn, "rb" ); + + // Check file open result + if(pFileIn == NULL) + { + fprintf(stderr,"Error opening %s", argv[1]); + return -1; + } + + // Open MP3 file + pFileOut= fopen(strFileOut,"wb+"); + + // Check file open result + if(pFileOut == NULL) + { + fprintf(stderr,"Error creating file %s", strFileOut); + return -1; + } + + memset(&beConfig,0,sizeof(beConfig)); // clear all fields + + // use the LAME config structure + beConfig.dwConfig = BE_CONFIG_LAME; + + // this are the default settings for testcase.wav + beConfig.format.LHV1.dwStructVersion = 1; + beConfig.format.LHV1.dwStructSize = sizeof(beConfig); + beConfig.format.LHV1.dwSampleRate = 44100; // INPUT FREQUENCY + beConfig.format.LHV1.dwReSampleRate = 0; // DON"T RESAMPLE + beConfig.format.LHV1.nMode = BE_MP3_MODE_JSTEREO; // OUTPUT IN STREO + beConfig.format.LHV1.dwBitrate = 128; // MINIMUM BIT RATE + beConfig.format.LHV1.nPreset = LQP_R3MIX; // QUALITY PRESET SETTING + beConfig.format.LHV1.dwMpegVersion = MPEG1; // MPEG VERSION (I or II) + beConfig.format.LHV1.dwPsyModel = 0; // USE DEFAULT PSYCHOACOUSTIC MODEL + beConfig.format.LHV1.dwEmphasis = 0; // NO EMPHASIS TURNED ON + beConfig.format.LHV1.bOriginal = TRUE; // SET ORIGINAL FLAG + beConfig.format.LHV1.bWriteVBRHeader = TRUE; // Write INFO tag + +// beConfig.format.LHV1.dwMaxBitrate = 320; // MAXIMUM BIT RATE +// beConfig.format.LHV1.bCRC = TRUE; // INSERT CRC +// beConfig.format.LHV1.bCopyright = TRUE; // SET COPYRIGHT FLAG +// beConfig.format.LHV1.bPrivate = TRUE; // SET PRIVATE FLAG +// beConfig.format.LHV1.bWriteVBRHeader = TRUE; // YES, WRITE THE XING VBR HEADER +// beConfig.format.LHV1.bEnableVBR = TRUE; // USE VBR +// beConfig.format.LHV1.nVBRQuality = 5; // SET VBR QUALITY + beConfig.format.LHV1.bNoRes = TRUE; // No Bit resorvoir + +// Preset Test +// beConfig.format.LHV1.nPreset = LQP_PHONE; + + // Init the MP3 Stream + err = beInitStream(&beConfig, &dwSamples, &dwMP3Buffer, &hbeStream); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + fprintf(stderr,"Error opening encoding stream (%lu)", err); + return -1; + } + + + // Allocate MP3 buffer + pMP3Buffer = new BYTE[dwMP3Buffer]; + + // Allocate WAV buffer + pWAVBuffer = new SHORT[dwSamples]; + + // Check if Buffer are allocated properly + if(!pMP3Buffer || !pWAVBuffer) + { + printf("Out of memory"); + return -1; + } + + DWORD dwRead=0; + DWORD dwWrite=0; + DWORD dwDone=0; + DWORD dwFileSize=0; + + // Seek to end of file + fseek(pFileIn,0,SEEK_END); + + // Get the file size + dwFileSize=ftell(pFileIn); + + // Seek back to start of WAV file, + // but skip the first 44 bytes, since that's the WAV header + fseek(pFileIn,44,SEEK_SET); + + + // Convert All PCM samples + while ( (dwRead=fread(pWAVBuffer,sizeof(SHORT),dwSamples,pFileIn)) >0 ) + { + // Encode samples + err = beEncodeChunk(hbeStream, dwRead, pWAVBuffer, pMP3Buffer, &dwWrite); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + beCloseStream(hbeStream); + fprintf(stderr,"beEncodeChunk() failed (%lu)", err); + return -1; + } + + // write dwWrite bytes that are returned in tehe pMP3Buffer to disk + if(fwrite(pMP3Buffer,1,dwWrite,pFileOut) != dwWrite) + { + fprintf(stderr,"Output file write error"); + return -1; + } + + dwDone += dwRead*sizeof(SHORT); + + printf("Done: %0.2f%% \r", 100 * (float)dwDone/(float)(dwFileSize)); + } + + // Deinit the stream + err = beDeinitStream(hbeStream, pMP3Buffer, &dwWrite); + + // Check result + if(err != BE_ERR_SUCCESSFUL) + { + + beCloseStream(hbeStream); + fprintf(stderr,"beExitStream failed (%lu)", err); + return -1; + } + + // Are there any bytes returned from the DeInit call? + // If so, write them to disk + if( dwWrite ) + { + if( fwrite( pMP3Buffer, 1, dwWrite, pFileOut ) != dwWrite ) + { + fprintf(stderr,"Output file write error"); + return -1; + } + } + + // close the MP3 Stream + beCloseStream( hbeStream ); + + // Delete WAV buffer + delete [] pWAVBuffer; + + // Delete MP3 Buffer + delete [] pMP3Buffer; + + // Close input file + fclose( pFileIn ); + + // Close output file + fclose( pFileOut ); + + if ( beWriteInfoTag ) + { + // Write the INFO Tag + beWriteInfoTag( hbeStream, strFileOut ); + } + else + { + beWriteVBRHeader( strFileOut ); + } + + // Were done, return OK result + return 0; +} + |