⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 burnerthread.pas

📁 用于CD/DVD烧录的Delphi源码,包括source和demo
💻 PAS
📖 第 1 页 / 共 2 页
字号:
    self.SyncCache;
  end;

  if Assigned(FOnBufferProgress) then
    FOnBufferProgress(GetBufferCapacity);
  if Assigned(FOnFileBufferProgress) then
    FOnFileBufferProgress(0);
  ISOFilestream.Free;
  Result := True;
  BufLen := (SectorSize * 20);
  Freemem(Buf, BufLen);
  if Assigned(FOnCDStatus) then
    FOnCDStatus(resFinishISOBurn);
  Self.Terminate;
end;



function TBurnerThread.WriteAudioCD(TrackCount: Integer): boolean;
var
  Buf: Pointer;
  BufLen, SectorSize, TempDataSize: integer;
  SectorsToWrite: Integer;
  BytesWritten: integer;
  TrackID: Integer;
  LastTrackLBA: Integer;
  IndexBlock: integer;
  LastBlock: integer;
  CDTracks : TAudioImage;
begin
  LastTrackLBA := 0; // set start point
  BufLen := 0;
  CDTracks := TAudioImage(FImage);

  if not SetWriteMode(FBurnSettings) then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resSetAudioHardwareFail);
    Result := False;
    exit;
  end
  else if Assigned(FOnCDStatus) then
    FOnCDStatus(resSetAudioHardwareOK);

  for TrackID := 0 to TrackCount - 1 do //burn all tracks to cd
  begin
    FOnCDStatus('Burning :' + CDTracks.Tracks[TrackID].CDTrack.TrackName);
    SectorSize := ConvertDataBlock(FBurnSettings.DataBlockType);
    CDTracks.Tracks[TrackID].CDTrack.SectorSize := SectorSize;

    LastBlock := (LastTrackLBA + CDTracks.Tracks[TrackID].CDTrack.SectorCount);
    //set data offsett past header
    CDTracks.Tracks[TrackID].CDTrack.Seek(soFromBeginning,
      CDTracks.Tracks[TrackID].CDTrack.DataOffset);

    SectorsToWrite := 20; //copy 20 sectors at a time
    BytesWritten := 0; // No of bytes written to disk
    BufLen := (SectorSize * SectorsToWrite); // big enough for 20 sectors
    Buf := nil;
    ReallocMem(Buf, BufLen);
    IndexBlock := LastTrackLBA;

    while (IndexBlock < LastBlock) do
      //for IndexBlock := LastTrackLBA to LastBlock - 1 do
    begin
      try
        TempDataSize := CDTracks.Tracks[TrackID].CDTrack.DataSize;
        if BufLen > (TempDataSize - BytesWritten) then
        begin
          BufLen := (TempDataSize - BytesWritten);
          SectorsToWrite := (LastBlock - IndexBlock); // find last sector count
        end;

        BytesWritten := BytesWritten +
          CDTracks.Tracks[TrackID].CDTrack.Read(pchar(Buf)^, BufLen);
          //read buffer full
        WriteAudio(IndexBlock, SectorsToWrite, buf, BufLen);
          // write the buffer to cd
        inc(IndexBlock, SectorsToWrite);
      finally
        if Assigned(FOnBufferProgress) then
          FOnBufferProgress(GetBufferCapacity);
        if Assigned(FOnCopyStatus) then
          FOnCopyStatus(IndexBlock, (IndexBlock div ((LastBlock - 1) div 100)));
        if Assigned(FOnWriteStatusEvent) then
          FOnWriteStatusEvent(BytesWritten);
        if Assigned(FOnBufferStatus) then
          FOnBufferStatus(BufferSize, BufferFreeSpace);
      end;
      while (GetBufferFreeSpace < 2448) do
        if Assigned(FOnBufferProgress) then
          FOnBufferProgress(GetBufferCapacity);
    end; //all track data for loop

    if Assigned(FOnCDStatus) then
      FOnCDStatus(resSyncCache);
    SyncCache;
    if Assigned(FOnBufferProgress) then
      FOnBufferProgress(GetBufferCapacity);
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resCloseTrack +
        inttostr(TrackID));
    CloseTrack(TrackID);
    LastTrackLBA := (LastBlock + FBurnSettings.AudioPause + 2);
      // reset LastTrackLBA to Next block to write (Leo-Soft)
  end; // for all tracks loop

  if FBurnSettings.CloseSession = True then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resCloseSession);
    CloseSession;
  end;
  if Assigned(FOnBufferProgress) then
    FOnBufferProgress(GetBufferCapacity);
  Freemem(Buf, BufLen);
  if Assigned(FOnCDStatus) then
    FOnCDStatus(resFinishAudioBurn);
  Result := True;
  Self.Terminate;
end;



function TBurnerThread.WriteDAOImage: boolean;
var
  ISOFilestream: TCDBufferedStream;
  Buf: Pointer;
  BufLen, SectorSize, SectorsToWrite: integer;
  BytesWritten: integer;
  IndexBlock: integer;
  LastBlock: integer;
  BINFileName : String;
  ATIPBuffer : Pointer;
  ATIPBufferSize : Longint;
  BINCue : TBinCueImage;

begin
  BINFileName := TBinCueImage(FImage).BINFileName;
  FBurnSettings.TrackMode := TBinCueImage(FImage).TrackMode;
  SectorSize := TBinCueImage(FImage).SectorSize;

  //FImage seems to go out of scope after setwritemode, so set cue sheet first ?????
  ATIPBufferSize := (TBinCueImage(FImage).ATIPCueList.Count + 1) * 8; // no of bytes needed for ATIP CueSheet
  try
    ATIPBuffer := nil;
    ReallocMem(ATIPBuffer, ATIPBufferSize); // alloc max buf size
    Move(TBinCueImage(FImage).ATIPCueList.Cues, ATIPBuffer^, ATIPBufferSize); // move bytes from cue list to buffer

  if not SetWriteMode(FBurnSettings) then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resSetDataHardwareFail);
    Result := False;
    exit;
  end
  else if Assigned(FOnCDStatus) then
    FOnCDStatus(resSetDataHardwareOK);

  if not SendCueSheet(ATIPBuffer, ATIPBufferSize) then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resCUESheetFailed);
    Result := False;
    exit;
  end
  else if Assigned(FOnCDStatus) then
    FOnCDStatus(resCUESheetSent);

  finally
     freemem(ATIPBuffer,ATIPBufferSize);  // free cue sheet buffer
  end;

  ISOFilestream := TCDBufferedStream.Create(BINFileName, fmOpenRead);

  ISOFilestream.SectorSize := SectorSize;

  if not ISOFilestream.ISOSectorSizeOK then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resImageSizeError);
    ISOFilestream.free;
    Result := False;
    exit;
  end;

  LastBlock := ISOFilestream.SectorCount;
  IndexBlock := 0;
  BytesWritten := 0;
  SectorsToWrite := 20; // increase to make faster writing ????
  Buf := nil;
  BufLen := (SectorSize * SectorsToWrite); //20 *  at a time
  ReallocMem(Buf, BufLen); // alloc max buf size

  while (BytesWritten < ISOFilestream.Size - 1) do
    //  for IndexBlock := 0 to LastBlock - 1 do
  begin
    try
      if (SectorsToWrite > ISOFilestream.SectorsLeft) then
        SectorsToWrite := (ISOFilestream.SectorsLeft);
      buflen := (SectorSize * SectorsToWrite);

      BytesWritten := BytesWritten + ISOFilestream.Read(pchar(Buf)^, BufLen);
        // read data from iso

      if not WriteData(IndexBlock, SectorsToWrite, buf, BufLen) then
        // write data to cd
      begin
        if Assigned(FOnCDStatus) then
          FOnCDStatus(resDiskWriteError);
        ISOFilestream.free;
        Result := False;
        exit;
      end;

      inc(IndexBlock, SectorsToWrite);
    finally
      if Assigned(FOnCopyStatus) then
        FOnCopyStatus(IndexBlock, (IndexBlock div ((LastBlock - 1) div 100)));
      if Assigned(FOnWriteStatusEvent) then
        FOnWriteStatusEvent(BytesWritten);
      if Assigned(FOnBufferProgress) then
        FOnBufferProgress(GetBufferCapacity);
      if Assigned(FOnBufferStatus) then
        FOnBufferStatus(BufferSize, BufferFreeSpace);
      if Assigned(FOnFileBufferProgress) then
        FOnFileBufferProgress(ISOFilestream.BufferPercentFull);
    end;
    while (GetBufferFreeSpace < 2448) do
      if Assigned(FOnBufferProgress) then
        FOnBufferProgress(GetBufferCapacity);
  end; {writing for loop}

  ReallocMem(Buf, 0);
  if Assigned(FOnBufferProgress) then
    FOnBufferProgress(GetBufferCapacity);
  if Assigned(FOnCDStatus) then
    FOnCDStatus(resSyncCache);
  if not SyncCache then // Sync the cache buffer
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resSyncCacheError);
    ISOFilestream.free;
    Result := False;
    exit;
  end;

  if Assigned(FOnCDStatus) then
    FOnCDStatus(resCloseTrack);
  self.CloseTrack(1);
  self.SyncCache;

  if CloseSession = true then
  begin
    if Assigned(FOnCDStatus) then
      FOnCDStatus(resCloseSession);
    self.CloseSession;
    self.SyncCache;
  end;

  if Assigned(FOnBufferProgress) then
    FOnBufferProgress(GetBufferCapacity);
  if Assigned(FOnFileBufferProgress) then
    FOnFileBufferProgress(0);
  ISOFilestream.Free;
  Result := True;
  BufLen := (SectorSize * 20);
  Freemem(Buf, BufLen);
  if Assigned(FOnCDStatus) then
    FOnCDStatus(resFinishISOBurn);
  Self.Terminate;
end;





procedure TBurnerThread.WriteImage;
begin
  if FImage is TFileImage then
  begin
    FFileName := TFileImage(FImage).ISOFileName;
    WriteISOToCD(FFileName);
  end
  else if FImage is TAudioImage then
  begin
    WriteAudioCD(TAudioImage(FImage).TrackCount);
  end
  else if FImage is TBinCueImage then
  begin
    WriteDAOImage;
  end;
end;


procedure TBurnerThread.Execute;
begin
  try
    WriteImage;
  except
    HandleException;
  end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -