📄 burnerthread.pas
字号:
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 + -