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.