Blame Dll/MP3export.pas

Packit 47f805
unit MP3export;
Packit 47f805
Packit 47f805
interface
Packit 47f805
Packit 47f805
Uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Packit 47f805
Forms, Dialogs, StdCtrls;
Packit 47f805
Packit 47f805
type
Packit 47f805
//type definitions
Packit 47f805
//typedef		unsigned long			HBE_STREAM;
Packit 47f805
//typedef		HBE_STREAM				*PHBE_STREAM;
Packit 47f805
//typedef		unsigned long			BE_ERR;
Packit 47f805
  THBE_STREAM = LongWord;
Packit 47f805
  PHBE_STREAM = ^PHBE_STREAM;
Packit 47f805
  BE_ERR = LongWord;
Packit 47f805
Packit 47f805
const
Packit 47f805
// encoding formats
Packit 47f805
//#define		BE_CONFIG_MP3			0
Packit 47f805
//#define		BE_CONFIG_LAME			256
Packit 47f805
  BE_CONFIG_MP3	 = 0;
Packit 47f805
  BE_CONFIG_LAME = 256;
Packit 47f805
Packit 47f805
Packit 47f805
// error codes
Packit 47f805
//#define    BE_ERR_SUCCESSFUL		        0x00000000
Packit 47f805
//#define    BE_ERR_INVALID_FORMAT		0x00000001
Packit 47f805
//#define    BE_ERR_INVALID_FORMAT_PARAMETERS	0x00000002
Packit 47f805
//#define    BE_ERR_NO_MORE_HANDLES		0x00000003
Packit 47f805
//#define    BE_ERR_INVALID_HANDLE		0x00000004
Packit 47f805
BE_ERR_SUCCESSFUL: LongWord = 0;
Packit 47f805
BE_ERR_INVALID_FORMAT: LongWord = 1;
Packit 47f805
BE_ERR_INVALID_FORMAT_PARAMETERS: LongWord = 2;
Packit 47f805
BE_ERR_NO_MORE_HANDLES: LongWord = 3;
Packit 47f805
BE_ERR_INVALID_HANDLE: LongWord = 4;
Packit 47f805
Packit 47f805
// other constants
Packit 47f805
Packit 47f805
BE_MAX_HOMEPAGE	= 256;
Packit 47f805
Packit 47f805
// format specific variables
Packit 47f805
Packit 47f805
BE_MP3_MODE_STEREO = 0;
Packit 47f805
BE_MP3_MODE_DUALCHANNEL = 2;
Packit 47f805
BE_MP3_MODE_MONO = 3;
Packit 47f805
Packit 47f805
type
Packit 47f805
Packit 47f805
  TMP3 = packed record
Packit 47f805
           dwSampleRate     : LongWord;
Packit 47f805
           byMode           : Byte;
Packit 47f805
           wBitRate         : Word;
Packit 47f805
           bPrivate         : LongWord;
Packit 47f805
           bCRC             : LongWord;
Packit 47f805
           bCopyright       : LongWord;
Packit 47f805
           bOriginal        : LongWord;
Packit 47f805
           end;
Packit 47f805
Packit 47f805
  TLHV1 = packed record
Packit 47f805
          // STRUCTURE INFORMATION
Packit 47f805
            dwStructVersion: DWORD;
Packit 47f805
            dwStructSize: DWORD;
Packit 47f805
Packit 47f805
          // BASIC ENCODER SETTINGS
Packit 47f805
            dwSampleRate: DWORD;	// ALLOWED SAMPLERATE VALUES DEPENDS ON dwMPEGVersion
Packit 47f805
            dwReSampleRate: DWORD;	// DOWNSAMPLERATE, 0=ENCODER DECIDES
Packit 47f805
            nMode: Integer;	  	// BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
Packit 47f805
            dwBitrate: DWORD;		// CBR bitrate, VBR min bitrate
Packit 47f805
            dwMaxBitrate: DWORD;	// CBR ignored, VBR Max bitrate
Packit 47f805
            nQuality: Integer;   	// Quality setting (NORMAL,HIGH,LOW,VOICE)
Packit 47f805
            dwMpegVersion: DWORD;	// MPEG-1 OR MPEG-2
Packit 47f805
            dwPsyModel: DWORD;		// FUTURE USE, SET TO 0
Packit 47f805
            dwEmphasis: DWORD;		// FUTURE USE, SET TO 0
Packit 47f805
Packit 47f805
          // BIT STREAM SETTINGS
Packit 47f805
            bPrivate: LONGBOOL;		// Set Private Bit (TRUE/FALSE)
Packit 47f805
            bCRC: LONGBOOL;		// Insert CRC (TRUE/FALSE)
Packit 47f805
            bCopyright: LONGBOOL;	// Set Copyright Bit (TRUE/FALSE)
Packit 47f805
            bOriginal: LONGBOOL;	// Set Original Bit (TRUE/FALSE_
Packit 47f805
Packit 47f805
          // VBR STUFF
Packit 47f805
            bWriteVBRHeader: LONGBOOL;	// WRITE XING VBR HEADER (TRUE/FALSE)
Packit 47f805
            bEnableVBR: LONGBOOL;       // USE VBR ENCODING (TRUE/FALSE)
Packit 47f805
            nVBRQuality: Integer;	// VBR QUALITY 0..9
Packit 47f805
Packit 47f805
            btReserved: array[0..255] of Byte;	// FUTURE USE, SET TO 0
Packit 47f805
            end;
Packit 47f805
Packit 47f805
  TAAC = packed record
Packit 47f805
           dwSampleRate     : LongWord;
Packit 47f805
           byMode           : Byte;
Packit 47f805
           wBitRate         : Word;
Packit 47f805
           byEncodingMethod : Byte;
Packit 47f805
           end;
Packit 47f805
Packit 47f805
  TFormat = packed record
Packit 47f805
              case byte of
Packit 47f805
                1 : (mp3           : TMP3);
Packit 47f805
                2 : (lhv1          : TLHV1);
Packit 47f805
                3 : (aac           : TAAC);
Packit 47f805
              end;
Packit 47f805
Packit 47f805
  TBE_Config = packed record
Packit 47f805
                 dwConfig   : LongWord;
Packit 47f805
                 format     : TFormat;
Packit 47f805
                 end;
Packit 47f805
Packit 47f805
Packit 47f805
  PBE_Config = ^TBE_Config;
Packit 47f805
Packit 47f805
//typedef struct	{
Packit 47f805
//	// BladeEnc DLL Version number
Packit 47f805
//
Packit 47f805
//	BYTE	byDLLMajorVersion;
Packit 47f805
//	BYTE	byDLLMinorVersion;
Packit 47f805
//
Packit 47f805
//	// BladeEnc Engine Version Number
Packit 47f805
//
Packit 47f805
//	BYTE	byMajorVersion;
Packit 47f805
//	BYTE	byMinorVersion;
Packit 47f805
//
Packit 47f805
//	// DLL Release date
Packit 47f805
//
Packit 47f805
//	BYTE	byDay;
Packit 47f805
//	BYTE	byMonth;
Packit 47f805
//	WORD	wYear;
Packit 47f805
//
Packit 47f805
//	// BladeEnc	Homepage URL
Packit 47f805
//
Packit 47f805
//	CHAR	zHomepage[BE_MAX_HOMEPAGE + 1];
Packit 47f805
//
Packit 47f805
//} BE_VERSION, *PBE_VERSION;
Packit 47f805
Packit 47f805
  TBE_Version = record
Packit 47f805
                  byDLLMajorVersion : Byte;
Packit 47f805
                  byDLLMinorVersion : Byte;
Packit 47f805
Packit 47f805
                  byMajorVersion    : Byte;
Packit 47f805
                  byMinorVersion    : Byte;
Packit 47f805
Packit 47f805
                  byDay             : Byte;
Packit 47f805
                  byMonth           : Byte;
Packit 47f805
                  wYear             : Word;
Packit 47f805
Packit 47f805
                  zHomePage         : Array[0..BE_MAX_HOMEPAGE + 1] of Char;
Packit 47f805
                  end;
Packit 47f805
Packit 47f805
  PBE_Version = ^TBE_Version;
Packit 47f805
Packit 47f805
//__declspec(dllexport) BE_ERR	beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream);
Packit 47f805
//__declspec(dllexport) BE_ERR	beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput);
Packit 47f805
//__declspec(dllexport) BE_ERR	beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput);
Packit 47f805
//__declspec(dllexport) BE_ERR	beCloseStream(HBE_STREAM hbeStream);
Packit 47f805
//__declspec(dllexport) VOID	beVersion(PBE_VERSION pbeVersion);
Packit 47f805
Packit 47f805
{
Packit 47f805
Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Bladeenc.dll';
Packit 47f805
//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';
Packit 47f805
Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; cdecl 'Bladeenc.dll';
Packit 47f805
Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Bladeenc.dll';
Packit 47f805
Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Bladeenc.dll';
Packit 47f805
Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Bladeenc.dll';
Packit 47f805
}
Packit 47f805
Packit 47f805
Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; cdecl; external 'Lame_enc.dll';
Packit 47f805
//Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';
Packit 47f805
Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';
Packit 47f805
Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; cdecl; external 'Lame_enc.dll';
Packit 47f805
Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; cdecl; external 'Lame_enc.dll';
Packit 47f805
Procedure beVersion(var pbeVersion: TBE_VERSION); cdecl; external 'Lame_enc.dll';
Packit 47f805
Packit 47f805
Procedure EncodeWavToMP3(fs, fd: Integer);
Packit 47f805
implementation
Packit 47f805
Packit 47f805
Uses InternetSnd, TraiteWav;
Packit 47f805
Packit 47f805
{----------------------------------------}
Packit 47f805
Procedure EncodeWavToMP3(fs, fd: Integer);
Packit 47f805
var
Packit 47f805
  err: Integer;
Packit 47f805
  beConfig: TBE_Config;
Packit 47f805
  dwSamples, dwSamplesMP3 : LongWord;
Packit 47f805
  hbeStream : THBE_STREAM;
Packit 47f805
  error: BE_ERR;
Packit 47f805
  pBuffer: PSmallInt;
Packit 47f805
  pMP3Buffer: PByte;
Packit 47f805
  Marque:PChar;
Packit 47f805
Packit 47f805
  done: LongWord;
Packit 47f805
  dwWrite: LongWord;
Packit 47f805
  ToRead: LongWord;
Packit 47f805
  ToWrite: LongWord;
Packit 47f805
  i:Integer;
Packit 47f805
Packit 47f805
begin
Packit 47f805
  beConfig.dwConfig := BE_CONFIG_LAME;
Packit 47f805
Packit 47f805
{
Packit 47f805
  beConfig.Format.mp3.dwSampleRate := WavInfo.SamplesPerSec;
Packit 47f805
  beConfig.Format.mp3.byMode := BE_MP3_MODE_STEREO;
Packit 47f805
  beConfig.Format.mp3.wBitrate := strToInt(MainFrm.Mp3BitRate.Text);
Packit 47f805
  beConfig.Format.mp3.bCopyright := 0;
Packit 47f805
  beConfig.Format.mp3.bCRC := $00000000;
Packit 47f805
  beConfig.Format.mp3.bOriginal := 0;
Packit 47f805
  beConfig.Format.mp3.bPrivate := 0;
Packit 47f805
}
Packit 47f805
//Structure information
Packit 47f805
  beConfig.Format.lhv1.dwStructVersion := 1;
Packit 47f805
  beConfig.Format.lhv1.dwStructSize := SizeOf(beConfig);
Packit 47f805
//Basic encoder setting
Packit 47f805
  beConfig.Format.lhv1.dwSampleRate := WavInfo.SamplesPerSec;
Packit 47f805
  beConfig.Format.lhv1.dwReSampleRate := 44100;
Packit 47f805
  beConfig.Format.lhv1.nMode := BE_MP3_MODE_STEREO;
Packit 47f805
  beConfig.Format.lhv1.dwBitrate := strToInt(MainFrm.Mp3BitRate.Text);
Packit 47f805
  beConfig.Format.lhv1.dwMaxBitrate := strToInt(MainFrm.Mp3BitRate.Text);
Packit 47f805
  beConfig.Format.lhv1.nQuality := 2;
Packit 47f805
  beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1
Packit 47f805
  beConfig.Format.lhv1.dwPsyModel := 0;
Packit 47f805
  beConfig.Format.lhv1.dwEmphasis := 0;
Packit 47f805
//Bit Stream Settings
Packit 47f805
  beConfig.Format.lhv1.bPrivate := False;
Packit 47f805
  beConfig.Format.lhv1.bCRC := False;
Packit 47f805
  beConfig.Format.lhv1.bCopyright := True;
Packit 47f805
  beConfig.Format.lhv1.bOriginal := True;
Packit 47f805
//VBR Stuff
Packit 47f805
  beConfig.Format.lhv1.bWriteVBRHeader := false;
Packit 47f805
  beConfig.Format.lhv1.bEnableVBR := false;
Packit 47f805
  beConfig.Format.lhv1.nVBRQuality := 0;
Packit 47f805
Packit 47f805
  i := 0;
Packit 47f805
  error := beInitStream(beConfig, dwSamples, dwSamplesMP3, hbeStream);
Packit 47f805
  if error = BE_ERR_SUCCESSFUL
Packit 47f805
    then begin
Packit 47f805
         pBuffer := AllocMem(dwSamples*2);
Packit 47f805
         pMP3Buffer := AllocMem(dwSamplesMP3);
Packit 47f805
         try
Packit 47f805
           done := 0;
Packit 47f805
Packit 47f805
           error := FileSeek(fs, 0, 0);
Packit 47f805
           While (done < TotalSize) do
Packit 47f805
             begin
Packit 47f805
               if (done + dwSamples*2 < TotalSize)
Packit 47f805
                 then ToRead := dwSamples*2
Packit 47f805
                 else begin
Packit 47f805
                      ToRead := TotalSize-done;
Packit 47f805
                      //FillChar(buf[0],dwSamples*2,0);
Packit 47f805
                      FillChar(pbuffer^,dwSamples,0);
Packit 47f805
                      end;
Packit 47f805
Packit 47f805
               //if FileRead(fs, buf[0], toread) = -1
Packit 47f805
               if FileRead(fs, pbuffer^, toread) = -1
Packit 47f805
                 then raise Exception.Create('Erreur de lecture');
Packit 47f805
Packit 47f805
               //error := beEncodeChunk(hbeStream, toRead div 2, Buf[0], TmpBuf[0], toWrite);
Packit 47f805
               error := beEncodeChunk(hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite);
Packit 47f805
Packit 47f805
               if error <> BE_ERR_SUCCESSFUL
Packit 47f805
                 then begin
Packit 47f805
                      beCloseStream(hbeStream);
Packit 47f805
                      raise Exception.Create('Echec de l''encodage');
Packit 47f805
                      end;
Packit 47f805
Packit 47f805
               //if FileWrite(fd, TmpBuf[0], toWrite) = -1
Packit 47f805
               if FileWrite(fd, pMP3Buffer^, toWrite) = -1
Packit 47f805
                 then raise Exception.Create('Erreur d''écriture');
Packit 47f805
Packit 47f805
               done := done + toread;
Packit 47f805
               inc(i);
Packit 47f805
               if i mod 64 = 0
Packit 47f805
                 then begin
Packit 47f805
                      MainFrm.ProgressBar1.Position := round(100*done/Totalsize);
Packit 47f805
                      Application.ProcessMessages;
Packit 47f805
                      end;
Packit 47f805
             end;
Packit 47f805
Packit 47f805
           error := beDeInitStream(hbeStream, pMP3Buffer^, dwWrite);
Packit 47f805
           //error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite);
Packit 47f805
Packit 47f805
           if error <> BE_ERR_SUCCESSFUL
Packit 47f805
             then begin
Packit 47f805
                  beCloseStream(hbeStream);
Packit 47f805
                  raise Exception.Create('Echec à la sortie');
Packit 47f805
                  end;
Packit 47f805
Packit 47f805
           if dwWrite <> 0
Packit 47f805
             then begin
Packit 47f805
                  //if FileWrite(fd, TmpBuf[0], dwWrite) = -1
Packit 47f805
                  if FileWrite(fd, pMP3Buffer^, dwWrite) = -1
Packit 47f805
                    then raise Exception.Create('Erreur à la dernière écriture');
Packit 47f805
                  end;
Packit 47f805
Packit 47f805
           beCloseStream(hbeStream);
Packit 47f805
           finally
Packit 47f805
             FreeMem(pBuffer);
Packit 47f805
             FreeMem(pMP3Buffer);
Packit 47f805
             end;
Packit 47f805
         end
Packit 47f805
    else begin
Packit 47f805
Packit 47f805
         end;
Packit 47f805
end;
Packit 47f805
Packit 47f805
end.