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