CDCopy.pas 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. {========================================================================}
  2. {= (c) 1995-99 SwiftSoft Ronald Dittrich =}
  3. {========================================================================}
  4. {= All Rights Reserved =}
  5. {========================================================================}
  6. {= D 01099 Dresden = Fax.: +49(0)351-8037944 =}
  7. {= Loewenstr.7a = info@swiftsoft.de =}
  8. {========================================================================}
  9. {= Actual versions on http://www.swiftsoft.de/index.html =}
  10. {========================================================================}
  11. {= This code is for reference purposes only and may not be copied or =}
  12. {= distributed in any format electronic or otherwise except one copy =}
  13. {= for backup purposes. =}
  14. {= =}
  15. {= No Delphi Component Kit or Component individually or in a collection=}
  16. {= subclassed or otherwise from the code in this unit, or associated =}
  17. {= .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed =}
  18. {= without express permission from SwiftSoft. =}
  19. {= =}
  20. {= For more licence informations please refer to the associated =}
  21. {= HelpFile. =}
  22. {========================================================================}
  23. {= $Date: 22.03.99 - 15:52:01 $ =}
  24. {========================================================================}
  25. unit CDCopy;
  26. interface
  27. uses
  28. Windows,
  29. Messages,
  30. SysUtils,
  31. Classes,
  32. Graphics,
  33. Controls,
  34. Forms,
  35. Dialogs,
  36. StdCtrls,
  37. Buttons,
  38. ComCtrls,
  39. ExtCtrls,
  40. MMSystem,
  41. MMUtils,
  42. MMObj,
  43. MMHTimer,
  44. MMTrigg,
  45. MMGauge,
  46. MMCDRead,
  47. MMCDATyp, ImgList;
  48. type
  49. TCopyDlg = class(TForm)
  50. Label1: TLabel;
  51. lblTime1: TLabel;
  52. Timer: TMMHiTimer;
  53. Meter1: TMMGauge;
  54. Bevel1: TBevel;
  55. Label2: TLabel;
  56. lblPercent1: TLabel;
  57. lblRemaining1: TLabel;
  58. Label3: TLabel;
  59. lblTime2: TLabel;
  60. Meter2: TMMGauge;
  61. Label6: TLabel;
  62. lblPercent2: TLabel;
  63. Label8: TLabel;
  64. lblRemaining2: TLabel;
  65. Label10: TLabel;
  66. lblSpeed1: TLabel;
  67. Label11: TLabel;
  68. Label4: TLabel;
  69. lblSpeed2: TLabel;
  70. Label9: TLabel;
  71. btnAbort: TButton;
  72. Panel1: TPanel;
  73. Messages: TMemo;
  74. Timer2: TTimer;
  75. ImageList: TImageList;
  76. procedure btnAbortClick(Sender: TObject);
  77. procedure FormShow(Sender: TObject);
  78. procedure TimerTimer(Sender: TObject);
  79. procedure FormCreate(Sender: TObject);
  80. procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  81. procedure Timer2Timer(Sender: TObject);
  82. public
  83. StartTime : Longint;
  84. FullTime : Longint;
  85. LastTime : Longint;
  86. CurTrack : Longint;
  87. Writing : Boolean;
  88. CurImage : integer;
  89. UserAbort : Boolean;
  90. ErrorAbort: Boolean;
  91. FileName : TFileName;
  92. procedure StartCopy;
  93. function FindNextTrack: integer;
  94. procedure CopyTrack(Track: integer);
  95. procedure UpdateStatus;
  96. procedure StartTimer;
  97. procedure StopTimer;
  98. end;
  99. var
  100. CopyDlg: TCopyDlg;
  101. implementation
  102. uses CDMain;
  103. {$R *.DFM}
  104. {-- TCopyDlg ------------------------------------------------------------------}
  105. procedure TCopyDlg.FormCreate(Sender: TObject);
  106. begin
  107. ImageList.ResourceLoad(rtBitmap, 'BM_DRIVE1', clNone);
  108. ImageList.ResourceLoad(rtBitmap, 'BM_DRIVE2', clNone);
  109. ImageList.ResourceLoad(rtBitmap, 'BM_CD1', clNone);
  110. ImageList.ResourceLoad(rtBitmap, 'BM_CD2', clNone);
  111. ImageList.ResourceLoad(rtBitmap, 'BM_CD3', clNone);
  112. end;
  113. {-- TCopyDlg ------------------------------------------------------------------}
  114. procedure TCopyDlg.FormShow(Sender: TObject);
  115. var
  116. maxFrames,i: integer;
  117. begin
  118. with CDMainForm, CDMainForm.CDReader do
  119. begin
  120. Messages.Clear;
  121. btnAbort.Caption := 'Cancel';
  122. UserAbort := False;
  123. ErrorAbort:= False;
  124. CurImage := 0;
  125. Fulltime := 0;
  126. maxFrames := 0;
  127. CurTrack := -1;
  128. for i := 0 to ListBox.Items.Count-1 do
  129. begin
  130. if ListBox.Selected[i] and (Tracks[i].TrackType = ttAudio) then
  131. begin
  132. inc(MaxFrames,MSFToFrame(Tracks[i].Length));
  133. if (CurTrack = -1) then CurTrack := i;
  134. end;
  135. end;
  136. if (CurTrack = -1) then
  137. begin
  138. CurTrack := Max(ListBox.ItemIndex,0);
  139. maxFrames := MSFToFrame(Tracks[CurTrack].Length);
  140. end;
  141. Meter2.MinValue := 0;
  142. Meter2.MaxValue := maxFrames;
  143. Meter2.Progress := 0;
  144. end;
  145. Timer2.Enabled := True;
  146. end;
  147. {-- TCopyDlg ------------------------------------------------------------------}
  148. procedure TCopyDlg.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  149. begin
  150. if (trOpen in CDMainForm.Trigger.State) then
  151. begin
  152. UserAbort := True;
  153. CDMainForm.Trigger.Stop;
  154. CanClose := False;
  155. end
  156. else CanClose := True;
  157. end;
  158. {-- TCopyDlg ------------------------------------------------------------------}
  159. procedure TCopyDlg.StartCopy;
  160. begin
  161. CopyTrack(CurTrack);
  162. end;
  163. {-- TCopyDlg ------------------------------------------------------------------}
  164. procedure TCopyDlg.CopyTrack(Track: integer);
  165. var
  166. i: integer;
  167. S: string;
  168. begin
  169. with CDMainForm, CDMainForm.CDReader do
  170. begin
  171. SetCopyParams(Tracks[Track].Start, Tracks[Track].Length);
  172. Meter1.MinValue := 0;
  173. Meter1.MaxValue := MSFToFrame(Tracks[Track].Length);
  174. Meter1.Progress := 0;
  175. CurTrack := Track;
  176. i := Pos('.',FileName);
  177. if (i > 0) then
  178. S := System.Copy(FileName,1,i-1)
  179. else
  180. S := FileName;
  181. S := S + Format('%.2d.wav',[CurTrack+1]);
  182. DeleteFile(S);
  183. CDMainForm.WaveFile.Wave.FileName := S;
  184. try
  185. Trigger.Start;
  186. except
  187. Trigger.Stop;
  188. raise;
  189. end;
  190. Messages.Lines.Add(Format('Copying Track %02d',[CurTrack+1]));
  191. end;
  192. end;
  193. {-- TCopyDlg ------------------------------------------------------------------}
  194. function TCopyDlg.FindNextTrack: integer;
  195. var
  196. i: integer;
  197. begin
  198. with CDMainForm, CDMainForm.CDReader do
  199. begin
  200. Result := CurTrack;
  201. for i := 0 to ListBox.Items.Count-1 do
  202. begin
  203. if ListBox.Selected[i] and (Tracks[i].TrackType = ttAudio) then
  204. begin
  205. if (i > Result) then
  206. begin
  207. Result := i;
  208. break;
  209. end;
  210. end;
  211. end;
  212. end;
  213. end;
  214. {-- TCopyDlg ------------------------------------------------------------------}
  215. procedure TCopyDlg.btnAbortClick(Sender: TObject);
  216. begin
  217. if (trOpen in CDMainForm.Trigger.State) then
  218. begin
  219. UserAbort := True;
  220. CDMainForm.Trigger.Stop;
  221. end
  222. else Close;
  223. end;
  224. {-- TCopyDlg ------------------------------------------------------------------}
  225. procedure TCopyDlg.UpdateStatus;
  226. var
  227. CurTime,CurFrame: Longint;
  228. begin
  229. with CDMainForm do
  230. begin
  231. CurTime := TimeGetTime-StartTime;
  232. FullTime := FullTime+(CurTime-LastTime);
  233. LastTime := CurTime;
  234. CurFrame := CDReader.CurrentFrame-CDReader.StartFrame;
  235. Meter2.Progress := Meter2.Progress + (CurFrame-Meter1.Progress);
  236. Meter1.Progress := CurFrame;
  237. lblPercent1.Caption := Format('%.1f %%',[(Meter1.Progress*100)/Meter1.MaxValue]);
  238. lblSpeed1.Caption := Format('%.1f X',[((Meter1.Progress*FRAME_SIZE)/(CurTime/1000))/SINGLE_SPEED]);
  239. lblTime1.Caption := TimeToString(CurTime);
  240. lblRemaining1.Caption:= TimeToString(MulDiv(CurTime,Meter1.MaxValue,Meter1.Progress)-CurTime);
  241. lblPercent2.Caption := Format('%.1f %%',[(Meter2.Progress*100)/Meter2.MaxValue]);
  242. lblSpeed2.Caption := Format('%.1f X',[((Meter2.Progress*FRAME_SIZE)/(FullTime/1000))/SINGLE_SPEED]);
  243. lblTime2.Caption := TimeToString(FullTime);
  244. lblRemaining2.Caption:= TimeToString(MulDiv(FullTime,Meter2.MaxValue,Meter2.Progress)-FullTime);
  245. end;
  246. end;
  247. {-- TCopyDlg ------------------------------------------------------------------}
  248. procedure TCopyDlg.StartTimer;
  249. begin
  250. StartTime := TimeGetTime;
  251. LastTime := 0;
  252. Timer.Enabled := True;
  253. end;
  254. {-- TCopyDlg ------------------------------------------------------------------}
  255. procedure TCopyDlg.StopTimer;
  256. begin
  257. Timer.Enabled := False;
  258. if not ErrorAbort then
  259. begin
  260. Meter1.Progress := Meter1.MaxValue;
  261. Meter1.Update;
  262. lblPercent1.Caption := '100.0 %';
  263. lblPercent1.Update;
  264. lblRemaining1.Caption := TimeToString(0);
  265. lblRemaining1.Update;
  266. end;
  267. end;
  268. {-- TCopyDlg ------------------------------------------------------------------}
  269. procedure TCopyDlg.TimerTimer(Sender: TObject);
  270. begin
  271. if Timer.Enabled then UpdateStatus;
  272. end;
  273. {-- TCopyDlg ------------------------------------------------------------------}
  274. procedure TCopyDlg.Timer2Timer(Sender: TObject);
  275. begin
  276. Timer2.Enabled := False;
  277. StartCopy;
  278. end;
  279. end.