aboutsummaryrefslogtreecommitdiff
path: root/lib/liblame/Dll/MP3export.pas
diff options
context:
space:
mode:
Diffstat (limited to 'lib/liblame/Dll/MP3export.pas')
-rw-r--r--lib/liblame/Dll/MP3export.pas303
1 files changed, 303 insertions, 0 deletions
diff --git a/lib/liblame/Dll/MP3export.pas b/lib/liblame/Dll/MP3export.pas
new file mode 100644
index 0000000000..ab55bba013
--- /dev/null
+++ b/lib/liblame/Dll/MP3export.pas
@@ -0,0 +1,303 @@
+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.