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

DVD

开发平台:

Delphi

  1. {-----------------------------------------------------------------------------
  2.  Unit Name: Device
  3.  Author:    Paul Fisher / Andrew Semack
  4.  Purpose:   Class for CD / DVD device
  5.  History:
  6.           03-11-05 Changed burn properties to a record of settings
  7. -----------------------------------------------------------------------------}
  8. unit Device;
  9. interface
  10. uses
  11.   Windows, Classes, messages, Dialogs, DeviceTypes, DeviceReader, DeviceInfo,
  12.     DiscInfo, CustomImage, SCSIUnit, DiskNotifier, SCSITypes;
  13. type
  14.   TDevice = class
  15.   private
  16.     FInfoRecord: PCDBurnerInfo;
  17.     FDeviceInfo: TDeviceInfo;
  18.     FDiscInfo: TDiscInfo;
  19.     FDeviceReader: TDeviceReader;
  20.     FBurnSettings: TBurnSettings;
  21.     FLastError: TScsiError;
  22.     FDefaults: TScsiDefaults;
  23.     // notify events
  24.     FOnCopyStatus: TCopyStatusEvent;
  25.     FOnCDStatus: TCDStatusEvent;
  26.     FOnBufferProgress: TCDBufferProgressEvent;
  27.     FOnFileBufferProgress: TCDFileBufferProgressEvent;
  28.     FOnBufferStatus: TCDBufferStatusEvent;
  29.     FOnWriteStatusEvent: TCDWriteStatusEvent;
  30.     FOnDriveDiskInsert : TNotifyEvent;
  31.     FOnDriveDiskRemove : TNotifyEvent;
  32.     FDiskNotifier : TDiskNotifier;
  33.     procedure DiskInserted(DriveLetter : String); // for notify
  34.     procedure DiskRemoved(DriveLetter : String); // for notify
  35.     function GetBurnerInfo: TCDBurnerInfo;
  36.     function GetIsLocked: boolean;
  37.     function GetReady: boolean;
  38.     function GetCapability: TCdRomCapabilities;
  39.     function GetWriteParameters: string;
  40.     function GetBufferSize: WORD;
  41.     procedure AutoInitialize;
  42.     procedure AutoDestroy;
  43.     procedure SetDefaultBurnSettings;
  44.     Procedure GetSpecialDeviceSettings;
  45.   protected
  46.     property BurnerInfo: TCDBurnerInfo read GetBurnerInfo;
  47.   public
  48.     constructor Create(InfoRecord: PCDBurnerInfo);
  49.     destructor Destroy; override;
  50.     procedure Lock;
  51.     procedure UnLock;
  52.     procedure Load(const NoWait: boolean = True);
  53.     procedure Eject(const NoWait: boolean = True);
  54.     procedure GetSpeed(out MaxReadSpeed, MaxWriteSpeed, CurrentReadSpeed,
  55.       CurrentWriteSpeed: integer);
  56.     function SetSpeed(const ReadSpeed, WriteSpeed: integer): Boolean;
  57.     procedure BurnFromFile(const FileName: string);
  58.     procedure BurnFromImage(Image: TCustomImage);
  59.     procedure Erase(const FullErase: boolean = False);
  60.     function CloseSession: Boolean;
  61.     procedure QuickSetAudioBurnSettings;
  62.     procedure QuickSetISOBurnSettings;
  63.     procedure QuickSetDVDISOBurnSettings;    
  64.     procedure QuickSetDAOBurnSettings;
  65.     procedure QuickSetSAOBurnSettings;
  66.     property BurnSettings: TBurnSettings read FBurnSettings write FBurnSettings;
  67.     property IsLocked: boolean read GetIsLocked;
  68.     property IsReady: boolean read GetReady;
  69.     property Capability: TCdRomCapabilities read GetCapability;
  70.     property DeviceBurnSettings: string read GetWriteParameters; //??
  71.     property DeviceInfo: TDeviceInfo read FDeviceInfo;
  72.     property DiscInfo: TDiscInfo read FDiscInfo;
  73.     property DeviceReader: TDeviceReader read FDeviceReader;
  74.     property LastError: TScsiError read FLastError;
  75.     property CDBufferSize: WORD read GetBufferSize;
  76.     // notify properties
  77.     property OnCopyStatus: TCopyStatusEvent read FOnCopyStatus write
  78.       FOnCopyStatus;
  79.     property OnCDStatus: TCDStatusEvent read FOnCDStatus write FOnCDStatus;
  80.     property OnBufferProgress: TCDBufferProgressEvent read FOnBufferProgress
  81.       write FOnBufferProgress;
  82.     property OnFileBufferProgress: TCDFileBufferProgressEvent read
  83.       FOnFileBufferProgress write FOnFileBufferProgress;
  84.     property OnBufferStatus: TCDBufferStatusEvent read FOnBufferStatus write
  85.       FOnBufferStatus;
  86.     property OnWriteStatusEvent: TCDWriteStatusEvent read FOnWriteStatusEvent
  87.       write FOnWriteStatusEvent;
  88.     property OnDriveDiskInsert : TNotifyEvent Read FOnDriveDiskInsert
  89.       write FOnDriveDiskInsert;
  90.     property OnDriveDiskRemove : TNotifyEvent Read FOnDriveDiskRemove
  91.       write FOnDriveDiskRemove;
  92.   end;
  93. implementation
  94. uses
  95.   BurnerThread, EraserThread, FileImage;
  96. { TDevice }
  97. procedure TDevice.BurnFromFile(const FileName: string);
  98. var
  99.   FileImage: TFileImage;
  100. begin
  101.   FileImage := TFileImage.Create(FileName);
  102.   FileImage.ImageType := ITISOFileImage; // set a just a filename to a iso file
  103.   try
  104.     BurnFromImage(FileImage);
  105.   finally
  106.     FileImage.Free;
  107.   end;
  108. end;
  109. procedure TDevice.BurnFromImage(Image: TCustomImage);
  110. var
  111.   BurnerThread: TBurnerThread;
  112. begin
  113.   SetSpeed(SCDS_MAXSPEED, SCDS_MAXSPEED);
  114.   BurnerThread := TBurnerThread.Create(FInfoRecord, Image);
  115.   BurnerThread.OnCDStatus := FOnCdStatus;
  116.   BurnerThread.OnCopyStatus := FOnCopyStatus;
  117.   BurnerThread.OnBufferProgress := FOnBufferProgress;
  118.   BurnerThread.OnFileBufferProgress := FOnFilebufferProgress;
  119.   BurnerThread.OnBufferStatus := FOnBufferStatus;
  120.   BurnerThread.OnWriteStatusEvent := FOnWriteStatusEvent;
  121.   BurnerThread.BurnSettings := FBurnSettings;
  122.   BurnerThread.Resume;
  123. end;
  124. Procedure TDevice.GetSpecialDeviceSettings;
  125. begin
  126.    FBurnSettings.SpecialDeviceType.PDVR103 := False;
  127.    FBurnSettings.SpecialDeviceType.SonyCRX100E := False;
  128.    FBurnSettings.SpecialDeviceType.TEAC512EB := False;
  129.    FBurnSettings.SpecialDeviceType.SonyPowerBurn := False;
  130.    FBurnSettings.SpecialDeviceType.FlmmedCT := False;
  131.    if (BurnerInfo.ProductID = 'CRX175E') or (BurnerInfo.ProductID = 'CD-RW CRX800E') then
  132.      FBurnSettings.SpecialDeviceType.SonyPowerBurn := True;
  133.    if (BurnerInfo.ProductID = 'CD-RW CRX800E') then
  134.      FBurnSettings.SpecialDeviceType.SonyCRX100E := True;
  135.    if (BurnerInfo.ProductID = 'CDRW321040X') then
  136.      FBurnSettings.SpecialDeviceType.FlmmedCT := True;
  137.    if (BurnerInfo.ProductID = 'DVD-RW DVR-103') or (BurnerInfo.ProductID = 'DVD-RW DVR-103') then
  138.    Begin
  139.      FBurnSettings.SpecialDeviceType.PDVR103 := True;
  140.      FBurnSettings.SpecialDeviceType.FlmmedCT := True;
  141.    End;
  142. end;
  143. procedure TDevice.QuickSetDVDISOBurnSettings;
  144. begin
  145.   FBurnSettings.DataBlockType := btMODE_1;
  146.   FBurnSettings.WriteType := wtDVD_TAO;      //$42
  147.   FBurnSettings.TrackMode := tmDVD_MODE_DATA;  //$05
  148.   FBurnSettings.SessionType := stCDROM_CDDA;
  149.   FBurnSettings.EraseType := etBLANK_DISC;
  150.   FBurnSettings.BurnProof := True;
  151.   FBurnSettings.TestWrite := False; // tempting fate ??
  152.   FBurnSettings.CloseSession := True;
  153.   FBurnSettings.AudioPause := 150;
  154.   FBurnSettings.PacketSize := 0;
  155.   FBurnSettings.MediaType.MediaType := mtDVD_R;
  156.   GetSpecialDeviceSettings;
  157. end;
  158. procedure TDevice.QuickSetISOBurnSettings;
  159. begin
  160.   FBurnSettings.DataBlockType := btMODE_1;
  161.   FBurnSettings.WriteType := wtTRACK_AT_ONCE;
  162.   FBurnSettings.TrackMode := tmCDR_MODE_DATA;
  163.   FBurnSettings.SessionType := stCDROM_CDDA;
  164.   FBurnSettings.EraseType := etBLANK_DISC;
  165.   FBurnSettings.BurnProof := True;
  166.   FBurnSettings.TestWrite := False;
  167.   FBurnSettings.CloseSession := True;
  168.   FBurnSettings.AudioPause := 150;
  169.   FBurnSettings.PacketSize := 0;
  170.   FBurnSettings.MediaType.MediaType := mtCD_R;
  171.   GetSpecialDeviceSettings;
  172. end;
  173. procedure TDevice.QuickSetAudioBurnSettings;
  174. begin
  175.   FBurnSettings.DataBlockType := btRAW_DATA_BLOCK;
  176.   FBurnSettings.WriteType := wtTRACK_AT_ONCE;
  177.   FBurnSettings.TrackMode := tmCDR_MODE_AUDIO;
  178.   FBurnSettings.SessionType := stCDROM_CDDA;
  179.   FBurnSettings.EraseType := etBLANK_DISC;
  180.   FBurnSettings.BurnProof := True;
  181.   FBurnSettings.TestWrite := False;
  182.   FBurnSettings.CloseSession := True;
  183.   FBurnSettings.AudioPause := 150;
  184.   FBurnSettings.PacketSize := 0;
  185.   FBurnSettings.MediaType.MediaType := mtCD_R;
  186.   GetSpecialDeviceSettings;
  187. end;
  188. procedure TDevice.QuickSetDAOBurnSettings; //looks like it is wrong
  189. begin
  190.   FBurnSettings.DataBlockType := btRAW_DATA_BLOCK;
  191.   FBurnSettings.WriteType := wtSESSION_AT_ONCE;
  192.   FBurnSettings.TrackMode := tmCDR_MODE_DATA;
  193.   FBurnSettings.SessionType := stCDROM_CDDA;
  194.   FBurnSettings.EraseType := etBLANK_DISC;
  195.   FBurnSettings.BurnProof := True;
  196.   FBurnSettings.TestWrite := False;
  197.   FBurnSettings.CloseSession := True;
  198.   FBurnSettings.AudioPause := 0;
  199.   FBurnSettings.PacketSize := 0;
  200.   FBurnSettings.SessionAtOnce := True;
  201.   FBurnSettings.DiskAtOnce := True;
  202.   GetSpecialDeviceSettings;
  203. end;
  204. procedure TDevice.QuickSetSAOBurnSettings;
  205. begin
  206.   FBurnSettings.DataBlockType := btRAW_DATA_BLOCK;
  207.   FBurnSettings.WriteType := wtSESSION_AT_ONCE;
  208.   FBurnSettings.TrackMode := tmCDR_MODE_DAO_96;
  209.   FBurnSettings.SessionType := stCDROM_CDDA;
  210.   FBurnSettings.EraseType := etBLANK_DISC;
  211.   FBurnSettings.BurnProof := True;
  212.   FBurnSettings.TestWrite := False;
  213.   FBurnSettings.CloseSession := True;
  214.   FBurnSettings.AudioPause := 0;
  215.   FBurnSettings.PacketSize := 0;
  216.   FBurnSettings.SessionAtOnce := True;
  217.   FBurnSettings.DiskAtOnce := False;
  218.   GetSpecialDeviceSettings;
  219. end;
  220. procedure TDevice.SetDefaultBurnSettings;
  221. begin
  222.   QuickSetISOBurnSettings;
  223. end;
  224. procedure TDevice.AutoInitialize; // Initialize variables
  225. begin
  226.   FDeviceInfo := TDeviceInfo.Create(FInfoRecord);
  227.   FDiscInfo := TDiscInfo.Create(FInfoRecord);
  228.   FDeviceReader := TDeviceReader.Create(FInfoRecord);
  229.   FDiskNotifier := TDiskNotifier.Create(nil);
  230.   FDiskNotifier.OnDiskInserted := DiskInserted;
  231.   FDiskNotifier.OnDiskRemoved := DiskRemoved;
  232.   SetDefaultBurnSettings;
  233.   FDefaults := SCSI_DEF;
  234.   FLastError := Err_None;
  235.   SetSpeed($FFFF, $FFFF);
  236. end;
  237. constructor TDevice.Create(InfoRecord: PCDBurnerInfo);
  238. begin
  239.   FInfoRecord := InfoRecord;
  240.   AutoInitialize;
  241. end;
  242. { Method to free any objects created by AutoInitialize }
  243. procedure TDevice.AutoDestroy;
  244. begin
  245.   FDiskNotifier.free;
  246.   if assigned(FDiscInfo) then
  247.     FDiscInfo.Free;
  248.   if assigned(FDeviceInfo) then
  249.     FDeviceInfo.Free;
  250.   if assigned(FInfoRecord) then
  251.     Dispose(FInfoRecord);
  252. end;
  253. destructor TDevice.Destroy;
  254. begin
  255.   AutoDestroy;
  256.   inherited;
  257. end;
  258. procedure TDevice.DiskInserted(DriveLetter : String); // for disk notify
  259. Begin
  260.  if (DriveLetter = FDeviceInfo.DriveLetter) then
  261.  begin
  262.     if assigned(FDiscInfo) then FDiscInfo.RefreshInfo;
  263.     if assigned(FOnDriveDiskInsert) then FOnDriveDiskInsert(self);
  264.  end;
  265. end;
  266. procedure TDevice.DiskRemoved(DriveLetter : String); // for disk notify
  267. Begin
  268.  if (DriveLetter = FDeviceInfo.DriveLetter) then
  269.  begin
  270.     if assigned(FDiscInfo) then FDiscInfo.RefreshInfo;
  271.     if assigned(OnDriveDiskRemove) then OnDriveDiskRemove(self);
  272.  end;
  273. end;
  274. procedure TDevice.Eject(const NoWait: boolean);
  275. begin
  276.   FLastError := SCSIstartStopUnit(BurnerInfo, False, True, NoWait, fDefaults);
  277. end;
  278. procedure TDevice.Erase(const FullErase: boolean);
  279.   // create thread to erase disk
  280.   // ATTENTION!! It freeze PC on etBLANK_DISC!
  281. var
  282.   EraseThread:TEraserThread;
  283. begin
  284.   // create thread to erase disk
  285.   EraseThread:=TEraserThread.Create(FInfoRecord);
  286.   if FullErase then
  287.     FBurnSettings.EraseType := etBLANK_DISC
  288.   else
  289.     FBurnSettings.EraseType := etBLANK_MINIMAL;
  290.   EraseThread.OnCDStatus      := FOnCdStatus;
  291.   EraseThread.BurnSettings    := FBurnSettings;
  292.   EraseThread.FreeOnTerminate := true;
  293.   EraseThread.Resume;
  294. end;
  295. function TDevice.GetBurnerInfo: TCDBurnerInfo;
  296. begin
  297.   Result := FInfoRecord^;
  298. end;
  299. function TDevice.GetIsLocked: boolean; //to do
  300. begin
  301.   Result := False;
  302. end;
  303. procedure TDevice.Load(const NoWait: boolean);
  304. begin
  305.   FLastError := SCSIstartStopUnit(BurnerInfo, True, True, NoWait, fDefaults);
  306. end;
  307. procedure TDevice.GetSpeed(out MaxReadSpeed, MaxWriteSpeed, CurrentReadSpeed,
  308.   CurrentWriteSpeed: integer);
  309. var
  310.   CDROMSpeeds: TCDReadWriteSpeeds;
  311. begin
  312.   SCSIGetDriveSpeeds(BurnerInfo, CDROMSpeeds, fDefaults);
  313.   MaxReadSpeed := CDRomSpeeds.MaxReadSpeed;
  314.   MaxWriteSpeed := CDRomSpeeds.MaxWriteSpeed;
  315.   CurrentReadSpeed := CDRomSpeeds.CurrentReadSpeed;
  316.   CurrentWriteSpeed := CDRomSpeeds.CurrentWriteSpeed;
  317. end;
  318. function TDevice.GetWriteParameters: string;
  319. var
  320.   Params: string;
  321.   // TBurnSettings
  322. begin
  323.   FLastError := ScsiGetWriteParams(BurnerInfo, 0, Params, fDefaults);
  324.   Result := Params;
  325. end;
  326. procedure TDevice.Lock;
  327. begin
  328.   FLastError := SCSIpreventMediumRemoval(BurnerInfo, True, fDefaults);
  329. end;
  330. procedure TDevice.UnLock;
  331. begin
  332.   FLastError := SCSIpreventMediumRemoval(BurnerInfo, False, fDefaults);
  333. end;
  334. function TDevice.SetSpeed(const ReadSpeed, WriteSpeed: integer): Boolean;
  335. begin
  336.   FLastError := SCSISetSpeed(BurnerInfo, ReadSpeed, WriteSpeed, fDefaults);
  337.   Result := FLastError = Err_None;
  338. end;
  339. function TDevice.GetReady: boolean;
  340. begin
  341.   Result := SCSItestReady(BurnerInfo, fDefaults);
  342. end;
  343. function TDevice.GetCapability: TCdRomCapabilities;
  344. begin
  345.   FLastError := SCSIgetCdRomCapabilities(BurnerInfo, Result, fDefaults);
  346. end;
  347. function TDevice.CloseSession: Boolean;
  348. begin
  349.   FLastError := SCSICloseSession(BurnerInfo, fDefaults);
  350.   Result := FLastError = Err_None;
  351. end;
  352. function TDevice.GetBufferSize: WORD;
  353. var
  354.   Temp: Word;
  355. begin
  356.   Temp := 0;
  357.   FLastError := SCSIgetBufferSize(BurnerInfo, Temp, fDefaults);
  358.   Result := Temp;
  359. end;
  360. end.