Bin2ISO.pas
上传用户:wanyu_2000
上传日期:2021-02-21
资源大小:527k
文件大小:5k
源码类别:

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: Bin2ISO
  3.  Author:    paul fisher
  4.  Purpose:   Convert a BIN File to ISO (2048) file
  5.  History:   First release (not tested)
  6. -----------------------------------------------------------------------------}
  7. unit Bin2ISO;
  8. interface
  9. uses SysUtils, Classes, CDBufferedStream, Resources;
  10. const
  11.    BIN2ISO_OK = 0;
  12.    BIN2ISO_UNKNOWN = 1;
  13.    BIN2ISO_NOT_RAW = 2;
  14.    BIN2ISO_INVALID_MODE = 3;
  15.    BIN2ISO_CANCELED = 4;
  16.    BIN2ISO_NOFILEFOUND = 5;
  17.    SYNCPATTERN = '00FFFFFFFFFFFFFFFFFFFF00';
  18. type
  19.    TProgressEvent = procedure(PercentDone: Integer; var Cancel: Boolean) of object;
  20. type
  21.    TBIN2ISO = class
  22.    private
  23.       FProgressEvent: TProgressEvent;
  24.       FErrorString: string;
  25.       FErrorCode: Integer;
  26.       FBinFileName: string;
  27.       FISOFileName: string;
  28.       FBinStream: TCDBufferedStream;
  29.       FISOStream: TFileStream;
  30.       FSeek_Header: Integer;
  31.       FSeek_ECC: Integer;
  32.       FSector_Size: Integer;
  33.       procedure SetBINFilename(Filename: string);
  34.       procedure SetISOFilename(Filename: string);
  35.       procedure AutoInitialize;
  36.       procedure AutoDestroy;
  37.       function CheckSYNCPattern: Boolean;
  38.    public
  39.       constructor Create;
  40.       destructor Destroy; override;
  41.       function ConvertFile: Integer;
  42.    published
  43.       property OnProgress: TProgressEvent read FProgressEvent write FProgressEvent;
  44.       property BINFileName: string read FBinFileName write SetBINFilename;
  45.       property ISOFileName: string read FISOFileName write SetISOFilename;
  46.    end;
  47. implementation
  48. procedure TBIN2ISO.AutoInitialize;
  49. begin
  50.    FErrorCode := BIN2ISO_OK;
  51.    FErrorString := '';
  52. end;
  53. procedure TBIN2ISO.AutoDestroy;
  54. begin
  55.    FISOStream.Free;
  56.    FBinStream.Free;
  57. end;
  58. procedure TBIN2ISO.SetBINFilename(Filename: string);
  59. begin
  60.    FBinFileName := Filename;
  61.    if not Fileexists(FBinFilename) then
  62.    begin
  63.       FErrorCode := BIN2ISO_NOFILEFOUND;
  64.       FErrorString := resNoBinFileFound;
  65.    end
  66.    else
  67.    begin
  68.       FBinStream := TCDBufferedStream.Create(FBinFilename, fmOpenRead);
  69.       FBinStream.SectorSize := 2352;
  70.       if FBinStream.ISOSectorSizeOK = False then
  71.       begin
  72.          FErrorCode := BIN2ISO_NOT_RAW;
  73.          FErrorString := resBinFileNotRAW;
  74.       end;
  75.    end;
  76. end;
  77. procedure TBIN2ISO.SetISOFilename(Filename: string);
  78. begin
  79.    FISOFileName := Filename;
  80.    FISOStream := TFileStream.Create(FISOFileName, fmCreate);
  81. end;
  82. constructor TBIN2ISO.Create;
  83. begin
  84.    AutoInitialize;
  85. end;
  86. destructor TBIN2ISO.Destroy;
  87. begin
  88.    AutoDestroy;
  89. end;
  90. function TBIN2ISO.CheckSYNCPattern: Boolean;
  91. var
  92.    Buffer: PChar;
  93.    HexStr: PChar;
  94.    Count: Integer;
  95.    BinType: char;
  96. begin
  97.    Result := False;
  98.    Count := 16;
  99.    try
  100.       FBinStream.Seek(0, soFromBeginning);
  101.       GetMem(Buffer, Count);
  102.       GetMem(HexStr, 24);
  103.       Buffer[Count] := #0;
  104.       HexStr[24] := #0;
  105.       FBinStream.Read(Buffer^, Count);
  106.       BinToHEX(buffer, HexStr, 12);
  107.       if HexStr = SYNCPATTERN then
  108.       begin
  109.          Result := true;
  110.          FSeek_Header := 8; // setup base as audio mode  ??
  111.          FSeek_ECC := 280;
  112.          FSector_Size := 2336;
  113.          BinType := Buffer[15]; // get mode id code
  114.          if BinType = #1 then // Mode1/2352
  115.          begin
  116.             Result := true;
  117.             FSeek_Header := 16;
  118.             FSeek_ECC := 288;
  119.             FSector_Size := 2352;
  120.          end;
  121.          if BinType = #2 then // Mode2/2352
  122.          begin
  123.             Result := true;
  124.             FSeek_Header := 24;
  125.             FSeek_ECC := 280;
  126.             FSector_Size := 2352;
  127.          end;
  128.       end;
  129.    finally
  130.      // freemem(buffer);
  131.     //  Freemem(hexstr);
  132.    end;
  133. end;
  134. function TBIN2ISO.ConvertFile: Integer;
  135. var
  136.    Progress, Divisor: Integer;
  137.    Buffer: PChar;
  138.    isCancel: boolean;
  139. begin
  140.    Result := 0;
  141.    Progress := 0;
  142.    isCancel := false;
  143.    if CheckSYNCPattern = False then
  144.    begin
  145.       FErrorCode := BIN2ISO_INVALID_MODE;
  146.       FErrorString := resTrackNotSupported;
  147.       exit;
  148.    end;
  149.    try
  150.       getmem(Buffer, 2048);
  151.       FBinStream.Seek(0, soFromBeginning);
  152.       Divisor := (FBinStream.SectorCount div 100);
  153.   //loop
  154.       while (Progress < FBinStream.SectorCount) do
  155.       begin
  156.          FBinStream.Seek(FSeek_Header, soFromCurrent);
  157.          FBinStream.Read(Buffer^, 2048);
  158.          FISOStream.Write(Buffer^, 2048);
  159.          FBinStream.Seek(FSeek_ECC, soFromCurrent);
  160.          inc(Progress);
  161.          if Assigned(FProgressEvent) then
  162.             FProgressEvent((Progress div Divisor), isCancel);
  163.          if isCancel = True then exit;
  164.       end; //end loop
  165.    finally
  166.      // freemem(Buffer);
  167.    end;
  168. end;
  169. end.