home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Sound / LAME / src / Dll / MP3export.pas < prev    next >
Pascal/Delphi Source File  |  2000-08-06  |  11KB  |  304 lines

  1. unit MP3export;
  2.  
  3. interface
  4.  
  5. Uses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  6. Forms, Dialogs, StdCtrls;
  7.  
  8. type
  9. //type definitions
  10. //typedef        unsigned long            HBE_STREAM;
  11. //typedef        HBE_STREAM                *PHBE_STREAM;
  12. //typedef        unsigned long            BE_ERR;
  13.   THBE_STREAM = LongWord;
  14.   PHBE_STREAM = ^PHBE_STREAM;
  15.   BE_ERR = LongWord;
  16.  
  17. const
  18. // encoding formats
  19. //#define        BE_CONFIG_MP3            0
  20. //#define        BE_CONFIG_LAME            256
  21.   BE_CONFIG_MP3     = 0;
  22.   BE_CONFIG_LAME = 256;
  23.  
  24.  
  25. // error codes
  26. //#define    BE_ERR_SUCCESSFUL                0x00000000
  27. //#define    BE_ERR_INVALID_FORMAT        0x00000001
  28. //#define    BE_ERR_INVALID_FORMAT_PARAMETERS    0x00000002
  29. //#define    BE_ERR_NO_MORE_HANDLES        0x00000003
  30. //#define    BE_ERR_INVALID_HANDLE        0x00000004
  31. BE_ERR_SUCCESSFUL: LongWord = 0;
  32. BE_ERR_INVALID_FORMAT: LongWord = 1;
  33. BE_ERR_INVALID_FORMAT_PARAMETERS: LongWord = 2;
  34. BE_ERR_NO_MORE_HANDLES: LongWord = 3;
  35. BE_ERR_INVALID_HANDLE: LongWord = 4;
  36.  
  37. // other constants
  38.  
  39. BE_MAX_HOMEPAGE    = 256;
  40.  
  41. // format specific variables
  42.  
  43. BE_MP3_MODE_STEREO = 0;
  44. BE_MP3_MODE_DUALCHANNEL = 2;
  45. BE_MP3_MODE_MONO = 3;
  46.  
  47. type
  48.  
  49.   TMP3 = packed record
  50.            dwSampleRate     : LongWord;
  51.            byMode           : Byte;
  52.            wBitRate         : Word;
  53.            bPrivate         : LongWord;
  54.            bCRC             : LongWord;
  55.            bCopyright       : LongWord;
  56.            bOriginal        : LongWord;
  57.            end;
  58.  
  59.   TLHV1 = packed record
  60.           // STRUCTURE INFORMATION
  61.             dwStructVersion: DWORD;
  62.             dwStructSize: DWORD;
  63.  
  64.           // BASIC ENCODER SETTINGS
  65.             dwSampleRate: DWORD;    // ALLOWED SAMPLERATE VALUES DEPENDS ON dwMPEGVersion
  66.             dwReSampleRate: DWORD;    // DOWNSAMPLERATE, 0=ENCODER DECIDES
  67.             nMode: Integer;          // BE_MP3_MODE_STEREO, BE_MP3_MODE_DUALCHANNEL, BE_MP3_MODE_MONO
  68.             dwBitrate: DWORD;        // CBR bitrate, VBR min bitrate
  69.             dwMaxBitrate: DWORD;    // CBR ignored, VBR Max bitrate
  70.             nQuality: Integer;       // Quality setting (NORMAL,HIGH,LOW,VOICE)
  71.             dwMpegVersion: DWORD;    // MPEG-1 OR MPEG-2
  72.             dwPsyModel: DWORD;        // FUTURE USE, SET TO 0
  73.             dwEmphasis: DWORD;        // FUTURE USE, SET TO 0
  74.  
  75.           // BIT STREAM SETTINGS
  76.             bPrivate: LONGBOOL;        // Set Private Bit (TRUE/FALSE)
  77.             bCRC: LONGBOOL;        // Insert CRC (TRUE/FALSE)
  78.             bCopyright: LONGBOOL;    // Set Copyright Bit (TRUE/FALSE)
  79.             bOriginal: LONGBOOL;    // Set Original Bit (TRUE/FALSE_
  80.  
  81.           // VBR STUFF
  82.             bWriteVBRHeader: LONGBOOL;    // WRITE XING VBR HEADER (TRUE/FALSE)
  83.             bEnableVBR: LONGBOOL;       // USE VBR ENCODING (TRUE/FALSE)
  84.             nVBRQuality: Integer;    // VBR QUALITY 0..9
  85.  
  86.             btReserved: array[0..255] of Byte;    // FUTURE USE, SET TO 0
  87.             end;
  88.  
  89.   TAAC = packed record
  90.            dwSampleRate     : LongWord;
  91.            byMode           : Byte;
  92.            wBitRate         : Word;
  93.            byEncodingMethod : Byte;
  94.            end;
  95.  
  96.   TFormat = packed record
  97.               case byte of
  98.                 1 : (mp3           : TMP3);
  99.                 2 : (lhv1          : TLHV1);
  100.                 3 : (aac           : TAAC);
  101.               end;
  102.  
  103.   TBE_Config = packed record
  104.                  dwConfig   : LongWord;
  105.                  format     : TFormat;
  106.                  end;
  107.  
  108.  
  109.   PBE_Config = ^TBE_Config;
  110.  
  111. //typedef struct    {
  112. //    // BladeEnc DLL Version number
  113. //
  114. //    BYTE    byDLLMajorVersion;
  115. //    BYTE    byDLLMinorVersion;
  116. //
  117. //    // BladeEnc Engine Version Number
  118. //
  119. //    BYTE    byMajorVersion;
  120. //    BYTE    byMinorVersion;
  121. //
  122. //    // DLL Release date
  123. //
  124. //    BYTE    byDay;
  125. //    BYTE    byMonth;
  126. //    WORD    wYear;
  127. //
  128. //    // BladeEnc    Homepage URL
  129. //
  130. //    CHAR    zHomepage[BE_MAX_HOMEPAGE + 1];
  131. //
  132. //} BE_VERSION, *PBE_VERSION;
  133.  
  134.   TBE_Version = record
  135.                   byDLLMajorVersion : Byte;
  136.                   byDLLMinorVersion : Byte;
  137.  
  138.                   byMajorVersion    : Byte;
  139.                   byMinorVersion    : Byte;
  140.  
  141.                   byDay             : Byte;
  142.                   byMonth           : Byte;
  143.                   wYear             : Word;
  144.  
  145.                   zHomePage         : Array[0..BE_MAX_HOMEPAGE + 1] of Char;
  146.                   end;
  147.  
  148.   PBE_Version = ^TBE_Version;
  149.  
  150. //__declspec(dllexport) BE_ERR    beInitStream(PBE_CONFIG pbeConfig, PDWORD dwSamples, PDWORD dwBufferSize, PHBE_STREAM phbeStream);
  151. //__declspec(dllexport) BE_ERR    beEncodeChunk(HBE_STREAM hbeStream, DWORD nSamples, PSHORT pSamples, PBYTE pOutput, PDWORD pdwOutput);
  152. //__declspec(dllexport) BE_ERR    beDeinitStream(HBE_STREAM hbeStream, PBYTE pOutput, PDWORD pdwOutput);
  153. //__declspec(dllexport) BE_ERR    beCloseStream(HBE_STREAM hbeStream);
  154. //__declspec(dllexport) VOID    beVersion(PBE_VERSION pbeVersion);
  155.  
  156. {
  157. Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; stdcall; external 'Bladeenc.dll';
  158. //Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; stdcall; external 'Bladeenc.dll';
  159. Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; external 'Bladeenc.dll';
  160. Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; external 'Bladeenc.dll';
  161. Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; stdcall; external 'Bladeenc.dll';
  162. Procedure beVersion(var pbeVersion: TBE_VERSION); stdcall; external 'Bladeenc.dll';
  163. }
  164.  
  165. Function beInitStream(var pbeConfig: TBE_CONFIG; var dwSample: LongWord; var dwBufferSize: LongWord; var phbeStream: THBE_STREAM ): BE_Err; stdcall; external 'Lame_enc.dll';
  166. //Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; pSample: PSmallInt;pOutput: PByte; var pdwOutput: LongWord): BE_Err; stdcall; external 'Lame_enc.dll';
  167. Function beEncodeChunk(hbeStream: THBE_STREAM; nSamples: LongWord; var pSample;var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; external 'Lame_enc.dll';
  168. Function beDeinitStream(hbeStream: THBE_STREAM; var pOutput; var pdwOutput: LongWord): BE_Err; stdcall; external 'Lame_enc.dll';
  169. Function beCloseStream(hbeStream: THBE_STREAM): BE_Err; stdcall; external 'Lame_enc.dll';
  170. Procedure beVersion(var pbeVersion: TBE_VERSION); stdcall; external 'Lame_enc.dll';
  171.  
  172. Procedure EncodeWavToMP3(fs, fd: Integer);
  173. implementation
  174.  
  175. Uses InternetSnd, TraiteWav;
  176.  
  177. {----------------------------------------}
  178. Procedure EncodeWavToMP3(fs, fd: Integer);
  179. var
  180.   err: Integer;
  181.   beConfig: TBE_Config;
  182.   dwSamples, dwSamplesMP3 : LongWord;
  183.   hbeStream : THBE_STREAM;
  184.   error: BE_ERR;
  185.   pBuffer: PSmallInt;
  186.   pMP3Buffer: PByte;
  187.   Marque:PChar;
  188.  
  189.   done: LongWord;
  190.   dwWrite: LongWord;
  191.   ToRead: LongWord;
  192.   ToWrite: LongWord;
  193.   i:Integer;
  194.  
  195. begin
  196.   beConfig.dwConfig := BE_CONFIG_LAME;
  197.  
  198. {
  199.   beConfig.Format.mp3.dwSampleRate := WavInfo.SamplesPerSec;
  200.   beConfig.Format.mp3.byMode := BE_MP3_MODE_STEREO;
  201.   beConfig.Format.mp3.wBitrate := strToInt(MainFrm.Mp3BitRate.Text);
  202.   beConfig.Format.mp3.bCopyright := 0;
  203.   beConfig.Format.mp3.bCRC := $00000000;
  204.   beConfig.Format.mp3.bOriginal := 0;
  205.   beConfig.Format.mp3.bPrivate := 0;
  206. }
  207. //Structure information
  208.   beConfig.Format.lhv1.dwStructVersion := 1;
  209.   beConfig.Format.lhv1.dwStructSize := SizeOf(beConfig);
  210. //Basic encoder setting
  211.   beConfig.Format.lhv1.dwSampleRate := WavInfo.SamplesPerSec;
  212.   beConfig.Format.lhv1.dwReSampleRate := 44100;
  213.   beConfig.Format.lhv1.nMode := BE_MP3_MODE_STEREO;
  214.   beConfig.Format.lhv1.dwBitrate := strToInt(MainFrm.Mp3BitRate.Text);
  215.   beConfig.Format.lhv1.dwMaxBitrate := strToInt(MainFrm.Mp3BitRate.Text);
  216.   beConfig.Format.lhv1.nQuality := 2;
  217.   beConfig.Format.lhv1.dwMPegVersion := 1; //MPEG1
  218.   beConfig.Format.lhv1.dwPsyModel := 0;
  219.   beConfig.Format.lhv1.dwEmphasis := 0;
  220. //Bit Stream Settings
  221.   beConfig.Format.lhv1.bPrivate := False;
  222.   beConfig.Format.lhv1.bCRC := False;
  223.   beConfig.Format.lhv1.bCopyright := True;
  224.   beConfig.Format.lhv1.bOriginal := True;
  225. //VBR Stuff
  226.   beConfig.Format.lhv1.bWriteVBRHeader := false;
  227.   beConfig.Format.lhv1.bEnableVBR := false;
  228.   beConfig.Format.lhv1.nVBRQuality := 0;
  229.  
  230.   i := 0;
  231.   error := beInitStream(beConfig, dwSamples, dwSamplesMP3, hbeStream);
  232.   if error = BE_ERR_SUCCESSFUL
  233.     then begin
  234.          pBuffer := AllocMem(dwSamples*2);
  235.          pMP3Buffer := AllocMem(dwSamplesMP3);
  236.          try
  237.            done := 0;
  238.  
  239.            error := FileSeek(fs, 0, 0);
  240.            While (done < TotalSize) do
  241.              begin
  242.                if (done + dwSamples*2 < TotalSize)
  243.                  then ToRead := dwSamples*2
  244.                  else begin
  245.                       ToRead := TotalSize-done;
  246.                       //FillChar(buf[0],dwSamples*2,0);
  247.                       FillChar(pbuffer^,dwSamples,0);
  248.                       end;
  249.  
  250.                //if FileRead(fs, buf[0], toread) = -1
  251.                if FileRead(fs, pbuffer^, toread) = -1
  252.                  then raise Exception.Create('Erreur de lecture');
  253.  
  254.                //error := beEncodeChunk(hbeStream, toRead div 2, Buf[0], TmpBuf[0], toWrite);
  255.                error := beEncodeChunk(hbeStream, toRead div 2, pBuffer^, pMP3Buffer^, toWrite);
  256.  
  257.                if error <> BE_ERR_SUCCESSFUL
  258.                  then begin
  259.                       beCloseStream(hbeStream);
  260.                       raise Exception.Create('Echec de l''encodage');
  261.                       end;
  262.  
  263.                //if FileWrite(fd, TmpBuf[0], toWrite) = -1
  264.                if FileWrite(fd, pMP3Buffer^, toWrite) = -1
  265.                  then raise Exception.Create('Erreur d''écriture');
  266.  
  267.                done := done + toread;
  268.                inc(i);
  269.                if i mod 64 = 0
  270.                  then begin
  271.                       MainFrm.ProgressBar1.Position := round(100*done/Totalsize);
  272.                       Application.ProcessMessages;
  273.                       end;
  274.              end;
  275.  
  276.            error := beDeInitStream(hbeStream, pMP3Buffer^, dwWrite);
  277.            //error := beDeInitStream(hbeStream, TmpBuf[0], dwWrite);
  278.  
  279.            if error <> BE_ERR_SUCCESSFUL
  280.              then begin
  281.                   beCloseStream(hbeStream);
  282.                   raise Exception.Create('Echec à la sortie');
  283.                   end;
  284.  
  285.            if dwWrite <> 0
  286.              then begin
  287.                   //if FileWrite(fd, TmpBuf[0], dwWrite) = -1
  288.                   if FileWrite(fd, pMP3Buffer^, dwWrite) = -1
  289.                     then raise Exception.Create('Erreur à la dernière écriture');
  290.                   end;
  291.  
  292.            beCloseStream(hbeStream);
  293.            finally
  294.              FreeMem(pBuffer);
  295.              FreeMem(pMP3Buffer);
  296.              end;
  297.          end
  298.     else begin
  299.  
  300.          end;
  301. end;
  302.  
  303. end.
  304.