Logo Search packages:      
Sourcecode: lame version File versions  Download package

Example.cpp

/*
 *    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 Library 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
 * Library General Public License for more details.
 * 
 * You should have received a copy of the GNU Library 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;
}


Generated by  Doxygen 1.6.0   Back to index