|
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.
|