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