Blame Dll/Example.cpp

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