304 lines
10 KiB
ObjectPascal
304 lines
10 KiB
ObjectPascal
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''<27>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 <20> 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 <20> la derni<6E>re <20>criture');
|
||
end;
|
||
|
||
beCloseStream(hbeStream);
|
||
finally
|
||
FreeMem(pBuffer);
|
||
FreeMem(pMP3Buffer);
|
||
end;
|
||
end
|
||
else begin
|
||
|
||
end;
|
||
end;
|
||
|
||
end.
|