diff options
Diffstat (limited to 'lib/liblame/Dll/MP3export.pas')
-rw-r--r-- | lib/liblame/Dll/MP3export.pas | 303 |
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. |