CDMain.pas 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885
  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:51:57 $ =}
  24. {========================================================================}
  25. unit CDMain;
  26. interface
  27. uses
  28. Windows,
  29. Messages,
  30. SysUtils,
  31. Classes,
  32. Graphics,
  33. Controls,
  34. Forms,
  35. Dialogs,
  36. ExtCtrls,
  37. StdCtrls,
  38. Menus,
  39. ComCtrls,
  40. Buttons,
  41. MMSystem,
  42. MMObj,
  43. MMDSPObj,
  44. MMAbout,
  45. MMUtils,
  46. MMDesign,
  47. MMWave,
  48. MMWaveIO,
  49. MMTrigg,
  50. MMCDRead,
  51. MMCDATyp,
  52. MMWavIn,
  53. MMConect,
  54. MMDIBCv,
  55. MMLevel,
  56. MMACMCvt,
  57. MMACMDlg,
  58. MMHook,
  59. MMString;
  60. type
  61. TTrackListBox = class(TListBox)
  62. private
  63. procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  64. end;
  65. TCDMainForm = class(TForm)
  66. Bevel1: TBevel;
  67. ToolBar: TPanel;
  68. DevCombo: TComboBox;
  69. MainMenu: TMainMenu;
  70. DAC1: TMenuItem;
  71. ConfigDrive: TMenuItem;
  72. N2: TMenuItem;
  73. miExit: TMenuItem;
  74. Aktionen1: TMenuItem;
  75. N1: TMenuItem;
  76. Info: TMenuItem;
  77. SaveDlg: TSaveDialog;
  78. CopyBtn: TSpeedButton;
  79. WaveFile: TMMWaveFile;
  80. Panel1: TPanel;
  81. Header: THeader;
  82. Label2: TLabel;
  83. StatusBar: TStatusBar;
  84. Timer1: TTimer;
  85. View1: TMenuItem;
  86. ToolBar1: TMenuItem;
  87. Statusbar1: TMenuItem;
  88. CopyTracks1: TMenuItem;
  89. N5: TMenuItem;
  90. SelectAll1: TMenuItem;
  91. InvertSelection1: TMenuItem;
  92. MMDesigner1: TMMDesigner;
  93. btnPlay: TSpeedButton;
  94. btnPrev: TSpeedButton;
  95. btnNext: TSpeedButton;
  96. btnStop: TSpeedButton;
  97. btnEject: TSpeedButton;
  98. ACMConverter: TMMACMConverter;
  99. N3: TMenuItem;
  100. SelectWaveformat1: TMenuItem;
  101. ACM: TMMACM;
  102. Trigger: TMMTrigger;
  103. CDReader: TMMCDReader;
  104. N4: TMenuItem;
  105. ReadISRCCode1: TMenuItem;
  106. Label1: TLabel;
  107. SpeedCombo: TComboBox;
  108. Timer2: TTimer;
  109. editTitle: TEdit;
  110. procedure FormCreate(Sender: TObject);
  111. procedure DevComboChange(Sender: TObject);
  112. procedure ResetTrackInfos;
  113. procedure DisplayTOC(Refresh: Boolean);
  114. procedure CopyClick(Sender: TObject);
  115. procedure TriggerStop(Sender: TObject);
  116. procedure WaveFileClose(Sender: TObject);
  117. procedure ListBoxDrawItem(Control: TWinControl; Index: Integer;
  118. R: TRect; State: TOwnerDrawState);
  119. procedure HeaderSized(Sender: TObject; ASection, AWidth: Integer);
  120. procedure TriggerStart(Sender: TObject);
  121. procedure InfoClick(Sender: TObject);
  122. procedure PlayClick(Sender: TObject);
  123. procedure PrevClick(Sender: TObject);
  124. procedure NextClick(Sender: TObject);
  125. procedure StopClick(Sender: TObject);
  126. procedure EjectClick(Sender: TObject);
  127. procedure Timer1Timer(Sender: TObject);
  128. procedure ToolBar1Click(Sender: TObject);
  129. procedure Statusbar1Click(Sender: TObject);
  130. procedure SelectAll1Click(Sender: TObject);
  131. procedure InvertSelection1Click(Sender: TObject);
  132. procedure ListBoxClick(Sender: TObject);
  133. procedure ConfigDriveClick(Sender: TObject);
  134. procedure TriggerError(Sender: TObject);
  135. procedure TriggerClose(Sender: TObject);
  136. procedure FormClose(Sender: TObject; var Action: TCloseAction);
  137. procedure miExitClick(Sender: TObject);
  138. procedure SelectWaveformat1Click(Sender: TObject);
  139. procedure FormDestroy(Sender: TObject);
  140. procedure ReadISRCCode1Click(Sender: TObject);
  141. procedure SpeedComboChange(Sender: TObject);
  142. procedure Timer2Timer(Sender: TObject);
  143. public
  144. ListBox : TTrackListBox;
  145. AudioBitmap : TBitmap;
  146. DataBitmap : TBitmap;
  147. CurDiskID : integer;
  148. UseCDText : Boolean;
  149. HasCDText : Boolean;
  150. ISRCCodes : array[0..99] of string;
  151. end;
  152. var
  153. CDMainForm: TCDMainForm;
  154. {$R IMAGES.D32}
  155. implementation
  156. uses CDCopy, CDConfig, CDISRC;
  157. {$R *.DFM}
  158. {-----------------------------------------------------------------------------}
  159. function MSFToTimeStr(Value: Longint; MSec: Boolean): string;
  160. var
  161. H, M,
  162. S, S100 : Integer;
  163. begin
  164. Value := MSFToFrame(Value);
  165. S:= Value div 75;
  166. S100:= Value mod 75;
  167. H:= S div 3600;
  168. S:= S mod 3600;
  169. M:= S div 60;
  170. S:= S mod 60;
  171. Result:= Format('%d:', [H]);
  172. if (M < 10) then
  173. Result:= Result + '0' + IntToStr(M) + ':'
  174. else
  175. Result:= Result + IntToStr(M) + ':';
  176. if (S < 10) then
  177. Result:= Result + '0' + IntToStr(S)
  178. else
  179. Result:= Result + IntToStr(S);
  180. if MSec then
  181. begin
  182. if (S100 < 10) then
  183. Result:= Result + '.0' + IntToStr(S100)
  184. else
  185. Result:= Result + '.'+IntToStr(S100);
  186. end;
  187. end;
  188. {-- TTrackListbox -------------------------------------------------------------}
  189. procedure TTrackListBox.CNDrawItem(var Message: TWMDrawItem);
  190. begin
  191. with Message.DrawItemStruct^ do
  192. begin
  193. if (Items.Count > 0) then inc(rcItem.Left,CDMainForm.AudioBitmap.Width);
  194. inherited;
  195. end;
  196. end;
  197. {-- TMainForm -----------------------------------------------------------------}
  198. procedure TCDMainForm.FormCreate(Sender: TObject);
  199. var
  200. wfx: array[0..1024] of Char;
  201. i,ID: Integer;
  202. begin
  203. { create a listbox on the fly... }
  204. ListBox := TTrackListBox.Create(Panel1);
  205. with ListBox do
  206. begin
  207. Parent := Panel1;
  208. Align := alClient;
  209. BorderStyle := bsNone;
  210. ItemHeight := 16;
  211. MultiSelect := True;
  212. Style := lbOwnerDrawFixed;
  213. OnClick := ListBoxClick;
  214. OnDrawItem := ListBoxDrawItem;
  215. Font.Color := clNavy;
  216. end;
  217. AudioBitmap := TBitmap.Create;
  218. AudioBitmap.Handle := LoadBitmap(hInstance,'BM_AUDIO');
  219. DataBitmap := TBitmap.Create;
  220. DataBitmap.Handle := LoadBitmap(hInstance,'BM_DATA');
  221. with CDReader do
  222. begin
  223. { restore the configuration from to the registry }
  224. if GetFromRegistryBinary(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','WaveFormat',wfx,sizeOf(wfx)) > 0 then
  225. ACMConverter.PWaveFormat := @wfx;
  226. ID := GetFromRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','DeviceID',DeviceID);
  227. BlockCount := GetFromRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','BlockCount',BlockCount);
  228. CopyMode := GetFromRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','CopyMode',CopyMode);
  229. IgnoreSpeed := GetFromRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','IgnoreSpeed',IgnoreSpeed);
  230. UseCDText := GetFromRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','UseCDText',UseCDText);
  231. { go trough device list }
  232. if (Devices.Count > 0) then
  233. begin
  234. for i := 0 to Devices.Count-1 do
  235. begin
  236. { restore the DeviceTyes from the registry }
  237. Devices[i].DeviceType := GetFromRegistry(HKEY_CURRENT_USER,
  238. 'Software\SwiftSoft\DAC',
  239. 'DeviceType'+IntToStr(i),
  240. Devices[i].DeviceType);
  241. DevCombo.Items.Add('<'+Devices[i].DriveLetter+':> '+
  242. Devices[i].DeviceName);
  243. end;
  244. ID := MinMax(ID,0,Devices.Count-1);
  245. if (ID >= 0) then
  246. DeviceType := Devices[ID].DeviceType;
  247. DevCombo.ItemIndex:= ID;
  248. Timer1.Enabled := True;
  249. Timer2.Enabled := True;
  250. end;
  251. end;
  252. end;
  253. {-- TMainForm -----------------------------------------------------------------}
  254. procedure TCDMainForm.Timer2Timer(Sender: TObject);
  255. begin
  256. DevComboChange(Self);
  257. Timer2.Enabled := False;
  258. end;
  259. {-- TMainForm -----------------------------------------------------------------}
  260. procedure TCDMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  261. var
  262. i: integer;
  263. begin
  264. Timer1.Enabled := False;
  265. CDReader.CloseDevice;
  266. { save the configuration to the registry }
  267. SaveInRegistryBinary(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','WaveFormat',ACMConverter.PWaveFormat^,wioSizeOfWaveFormat(ACMConverter.PWaveFormat));
  268. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','BlockCount',CDReader.BlockCount);
  269. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','CopyMode',CDReader.CopyMode);
  270. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','DeviceID',CDReader.DeviceID);
  271. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','IgnoreSpeed',CDReader.IgnoreSpeed);
  272. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','UseCDText',UseCDText);
  273. for i := 0 to CDReader.Devices.Count-1 do
  274. begin
  275. SaveInRegistry(HKEY_CURRENT_USER,'Software\SwiftSoft\DAC','DeviceType'+IntToStr(i),
  276. CDReader.Devices[i].DeviceType);
  277. end;
  278. AudioBitmap.Free;
  279. DataBitmap.Free;
  280. Action := caFree;
  281. end;
  282. {-- TMainForm -----------------------------------------------------------------}
  283. procedure TCDMainForm.DevComboChange(Sender: TObject);
  284. var
  285. i: integer;
  286. begin
  287. CDReader.CloseDevice;
  288. try
  289. for i := 0 to high(ISRCCodes) do ISRCCodes[i] := '';
  290. CDReader.DeviceID := DevCombo.ItemIndex;
  291. CDReader.OpenDevice;
  292. except
  293. // no exception please !
  294. end;
  295. ResetTrackInfos;
  296. DisplayTOC(True);
  297. Update;
  298. SpeedCombo.Items.Clear;
  299. SpeedCombo.Items.Add('Detecting...');
  300. SpeedCombo.ItemIndex := 0;
  301. CDReader.DetectSupportedSpeeds;
  302. SpeedCombo.Items.Assign(CDReader.Speeds);
  303. if (SpeedCombo.Items.Count > 0) then
  304. SpeedCombo.ItemIndex := 0;
  305. ReadISRCCode1.Enabled := CDReader.CanReadISRC;
  306. end;
  307. {-- TMainForm -----------------------------------------------------------------}
  308. procedure TCDMainForm.SpeedComboChange(Sender: TObject);
  309. begin
  310. if (SpeedCombo.ItemIndex >= 0) then
  311. CDReader.SetCopySpeed(Word(SpeedCombo.Items.Objects[SpeedCombo.ItemIndex]));
  312. end;
  313. {-- TMainForm -----------------------------------------------------------------}
  314. procedure TCDMainForm.FormDestroy(Sender: TObject);
  315. begin
  316. CDMainForm := nil;
  317. end;
  318. {-- TMainForm -----------------------------------------------------------------}
  319. procedure TCDMainForm.ReadISRCCode1Click(Sender: TObject);
  320. var
  321. i: integer;
  322. begin
  323. with TCDISRCDlg.Create(Self) do
  324. try
  325. Gauge.Progress := 0;
  326. Label1.Caption := 'Reading Track 1';
  327. BringtoFront;
  328. Show;
  329. Update;
  330. i := 0;
  331. while not Cancel and (i < CDReader.Tracks.Count) do
  332. begin
  333. ISRCCodes[i] := CDReader.ReadISRC(i+1);
  334. inc(i);
  335. Gauge.Progress := (i*100)div CDReader.Tracks.Count;
  336. Label1.Caption := 'Reading Track '+IntToStr(i+1);
  337. Application.ProcessMessages;
  338. end;
  339. finally
  340. Free;
  341. end;
  342. DisplayTOC(False);
  343. end;
  344. {-- TMainForm -----------------------------------------------------------------}
  345. procedure TCDMainForm.DisplayTOC(Refresh: Boolean);
  346. var
  347. i: integer;
  348. Size : Single;
  349. S, CP, PE, Title, ISRC : string;
  350. begin
  351. ListBox.Clear;
  352. with CDReader do
  353. if DeviceReady then
  354. begin
  355. if Refresh then
  356. begin
  357. if not ReadTOC then
  358. raise Exception.Create('Unable to read CD directory');
  359. CurDiskID := DiskID;
  360. HasCDText := UseCDText and ReadCDText;
  361. end;
  362. S := '';
  363. if HasCDText then
  364. S := CDText[0].Tracks[0].TrackTitle;
  365. editTitle.Text := S;
  366. for i := 0 to Tracks.Count-1 do
  367. with Tracks[i] do
  368. begin
  369. Size := (MSFToFrame(Length)*FRAME_SIZE) / 1024 / 1024;
  370. if Copyprotected then CP := 'Yes'
  371. else CP := 'No';
  372. if PreEmphasis then PE := 'Yes'
  373. else PE := 'No';
  374. Title := '';
  375. if (Title = '') and HasCDText then
  376. Title := CDText[0].Tracks[i+1].TrackTitle;
  377. ISRC := '';
  378. if HasCDText then
  379. ISRC := CDText[0].Tracks[i+1].UPC_EAN_ISRC;
  380. if (ISRC = '') then
  381. ISRC := ISRCCodes[i];
  382. if (ISRC = '') then
  383. ISRC := '---';
  384. S:= Format('%.2d'#9'%s'#9'%s'#9'%s'#9'%.2f MB'#9'%s'#9'%s'#9'%s',
  385. [Number,
  386. Title,
  387. MSFToTimeStr(Start,True),
  388. MSFToTimeStr(Length,True), Size, CP, PE,ISRC]);
  389. ListBox.Items.Add(S);
  390. end;
  391. if (ListBox.Items.Count > 0) then
  392. begin
  393. ListBox.ItemIndex:= 0;
  394. ListBox.Selected[0] := True;
  395. end;
  396. end;
  397. CopyBtn.Enabled := (ListBox.Items.Count > 0) and (ListBox.ItemIndex >= 0);
  398. ReadISRCCode1.Enabled := CopyBtn.Enabled;
  399. CopyTracks1.Enabled := CopyBtn.Enabled;
  400. end;
  401. {-- TMainForm -----------------------------------------------------------------}
  402. procedure TCDMainForm.ResetTrackInfos;
  403. var
  404. i: integer;
  405. begin
  406. ListBox.Clear;
  407. HasCDText := False;
  408. editTitle.Text := '';
  409. for i := 0 to high(ISRCCodes) do ISRCCodes[i] := '';
  410. end;
  411. {-- TMainForm -----------------------------------------------------------------}
  412. procedure TCDMainForm.Timer1Timer(Sender: TObject);
  413. var
  414. status : TMMCDStatus;
  415. CurTrack: integer;
  416. S : string;
  417. begin
  418. with CDReader do
  419. begin
  420. status := CDReader.DeviceStatus;
  421. case Status of
  422. cdPlaying:
  423. begin
  424. ReadISRCCode1.Enabled := True;
  425. CopyTracks1.Enabled := True;
  426. CopyBtn.Enabled := True;
  427. btnPlay.Enabled := False;
  428. btnPrev.Enabled := True;
  429. btnNext.Enabled := True;
  430. btnStop.Enabled := True;
  431. btnEject.Enabled := True;
  432. end;
  433. cdStopped:
  434. begin
  435. ReadISRCCode1.Enabled := True;
  436. CopyTracks1.Enabled := True;
  437. CopyBtn.Enabled := True;
  438. btnPlay.Enabled := True;
  439. btnPrev.Enabled := False;
  440. btnNext.Enabled := False;
  441. btnStop.Enabled := False;
  442. btnEject.Enabled := True;
  443. end;
  444. else
  445. begin
  446. ReadISRCCode1.Enabled := False;
  447. CopyTracks1.Enabled := False;
  448. CopyBtn.Enabled := False;
  449. btnPlay.Enabled := False;
  450. btnPrev.Enabled := False;
  451. btnNext.Enabled := False;
  452. btnStop.Enabled := False;
  453. if (status = cdNotReady) then
  454. btnEject.Enabled := False
  455. else
  456. btnEject.Enabled := True;
  457. end;
  458. end;
  459. if DeviceReady then
  460. begin
  461. StatusBar.Panels[0].Text := 'CD Inserted';
  462. if CurDiskID <> DiskID then
  463. begin
  464. ResetTrackInfos;
  465. DisplayTOC(True);
  466. end;
  467. StatusBar.Panels[1].Text := 'Playtime: ' + MSFToTimeStr(CDReader.GetPosition,False);
  468. CurTrack := CDReader.GetCurrentTrack;
  469. S := Format('Track: %.2d',[CurTrack]);
  470. if HasCDText then
  471. S := S + ' - ' + CDReader.CDText[0].Tracks[CurTrack].TrackTitle;
  472. if (S <> StatusBar.Panels[2].Text) then
  473. StatusBar.Panels[2].Text := S;
  474. end
  475. else
  476. begin
  477. StatusBar.Panels[0].Text := 'no CD Inserted';
  478. if (CurDiskID <> -1) then
  479. begin
  480. CurDiskID := -1;
  481. ResetTrackInfos;
  482. end;
  483. StatusBar.Panels[1].Text := '';
  484. StatusBar.Panels[2].Text := '';
  485. end;
  486. end;
  487. end;
  488. {-- TMainForm -----------------------------------------------------------------}
  489. procedure TCDMainForm.CopyClick(Sender: TObject);
  490. var
  491. OK: Boolean;
  492. i: integer;
  493. begin
  494. if (ListBox.ItemIndex >= 0) then
  495. begin
  496. OK := False;
  497. for i := 0 to ListBox.Items.Count-1 do
  498. if ListBox.Selected[i] and (CDReader.Tracks[i].TrackType = ttAudio) then
  499. begin
  500. OK := True;
  501. break;
  502. end;
  503. if OK then
  504. begin
  505. if SaveDlg.Execute then
  506. begin
  507. Timer1.Enabled := False;
  508. CopyDlg := TCopyDlg.Create(Self);
  509. try
  510. CopyDlg.FileName := SaveDlg.FileName;
  511. CopyDlg.ShowModal;
  512. finally
  513. CopyDlg.Free;
  514. Timer1.Enabled := True;
  515. end;
  516. end;
  517. end
  518. else MessageDlg('No Audio Track selected !',mtInformation,[mbOK],0);
  519. end;
  520. end;
  521. {-- TMainForm -----------------------------------------------------------------}
  522. procedure TCDMainForm.TriggerStart(Sender: TObject);
  523. begin
  524. CopyDlg.StartTimer;
  525. end;
  526. {-- TMainForm -----------------------------------------------------------------}
  527. procedure TCDMainForm.TriggerStop(Sender: TObject);
  528. var
  529. NextTrack: integer;
  530. begin
  531. CopyDlg.StopTimer;
  532. if CopyDlg.ErrorAbort then
  533. begin
  534. CopyDlg.Messages.Lines.Add('There where Errors, copy not completed.');
  535. CopyDlg.btnAbort.Caption := 'Close';
  536. CopyDlg.ErrorAbort := False;
  537. Trigger.Close;
  538. end
  539. else if CopyDlg.UserAbort then
  540. begin
  541. CopyDlg.Meter2.Progress := CopyDlg.Meter2.MaxValue;
  542. CopyDlg.Meter2.Update;
  543. CopyDlg.lblPercent2.Caption := '100.0 %';
  544. CopyDlg.lblPercent2.Update;
  545. CopyDlg.lblRemaining2.Caption := TimeToString(0);
  546. CopyDlg.lblRemaining2.Update;
  547. CopyDlg.Messages.Lines.Add('Copyprocess terminated by user!');
  548. Trigger.Close;
  549. MessageDlg('Copyprocess terminated by user!',mtInformation,[mbOK],0);
  550. CopyDlg.Close;
  551. end
  552. else
  553. begin
  554. Trigger.Close;
  555. NextTrack := CopyDlg.FindNextTrack;
  556. if (NextTrack <> CopyDlg.CurTrack) then
  557. begin
  558. CopyDlg.CopyTrack(NextTrack)
  559. end
  560. else
  561. begin
  562. CopyDlg.Messages.Lines.Add('Copy completed without any errors.');
  563. CopyDlg.btnAbort.Caption := 'Close';
  564. CopyDlg.Meter2.Progress := CopyDlg.Meter2.MaxValue;
  565. CopyDlg.Meter2.Update;
  566. CopyDlg.lblPercent2.Caption := '100.0 %';
  567. CopyDlg.lblPercent2.Update;
  568. CopyDlg.lblRemaining2.Caption := TimeToString(0);
  569. CopyDlg.lblRemaining2.Update;
  570. end;
  571. end;
  572. end;
  573. {-- TMainForm -----------------------------------------------------------------}
  574. procedure TCDMainForm.TriggerClose(Sender: TObject);
  575. begin
  576. if CopyDlg.ErrorAbort then
  577. begin
  578. CopyDlg.Messages.Lines.Add('There where Errors, copy not completed.');
  579. CopyDlg.btnAbort.Caption := 'Close';
  580. CopyDlg.ErrorAbort := False;
  581. end
  582. end;
  583. {-- TMainForm -----------------------------------------------------------------}
  584. procedure TCDMainForm.WaveFileClose(Sender: TObject);
  585. begin
  586. if (trPlay in Trigger.State) then
  587. begin
  588. CopyDlg.Messages.Lines.Add('Can''t write to file, disk full ?');
  589. CopyDlg.ErrorAbort := True;
  590. Trigger.Stop;
  591. end;
  592. end;
  593. {-- TMainForm -----------------------------------------------------------------}
  594. procedure TCDMainForm.HeaderSized(Sender: TObject; ASection, AWidth: Integer);
  595. begin
  596. ListBox.Invalidate;
  597. end;
  598. {-- TMainForm -----------------------------------------------------------------}
  599. procedure TCDMainForm.ListBoxDrawItem(Control: TWinControl; Index: Integer;
  600. R: TRect; State: TOwnerDrawState);
  601. var
  602. P,Offset,i: Integer;
  603. C: array[0..255] of Char;
  604. S,S2: string;
  605. aBitmap: TBitmap;
  606. Clr: TColor;
  607. begin
  608. if (CDReader.Tracks[Index].TrackType = ttAudio) then
  609. aBitmap := AudioBitmap
  610. else
  611. aBitmap := DataBitmap;
  612. Clr := ListBox.Canvas.Brush.Color;
  613. ListBox.Canvas.Brush.Color := ListBox.Color;
  614. ListBox.Canvas.BrushCopy(Classes.Rect(0,R.Top,aBitmap.Width,R.Top+aBitmap.Height),
  615. aBitmap,
  616. Classes.Rect(0,0,aBitmap.Width,aBitmap.Height),
  617. clOlive);
  618. ListBox.Canvas.Brush.Color := Clr;
  619. Offset := aBitmap.Width;
  620. i := 0;
  621. S2 := ListBox.Items[Index];
  622. { find the separator in the string }
  623. P := Pos(#9, S2);
  624. while True do
  625. begin
  626. { draw the item }
  627. if (P = 0) then S := System.Copy(S2, 1, MaxInt)
  628. else S := System.Copy(S2, 1, P-1);
  629. R.Right := R.Left + (Header.SectionWidth[i]);
  630. ExtTextOut(ListBox.Canvas.Handle, R.Left, R.Top, ETO_CLIPPED or
  631. ETO_OPAQUE, @R, StrPCopy(C, S), Length(S), nil);
  632. { move the rectangle to the next column }
  633. if (i = 0) then dec(R.Right,Offset);
  634. R.Left := R.Right;
  635. if (P = 0) then exit;
  636. S2 := System.Copy(S2, P+1, MaxInt);
  637. { find the next separator in the string }
  638. P := Pos(#9, S2);
  639. inc(i);
  640. end;
  641. end;
  642. {-- TMainForm -----------------------------------------------------------------}
  643. procedure TCDMainForm.ListBoxClick(Sender: TObject);
  644. begin
  645. CopyBtn.Enabled := (ListBox.Items.Count > 0) and (ListBox.ItemIndex >= 0);
  646. CopyTracks1.Enabled := CopyBtn.Enabled;
  647. end;
  648. {-- TMainForm -----------------------------------------------------------------}
  649. procedure TCDMainForm.InfoClick(Sender: TObject);
  650. begin
  651. Show_AboutBox(0);
  652. end;
  653. {-- TMainForm -----------------------------------------------------------------}
  654. procedure TCDMainForm.PlayClick(Sender: TObject);
  655. var
  656. i: integer;
  657. Start,Length: Longint;
  658. begin
  659. if btnPlay.Enabled then
  660. begin
  661. Start := -1;
  662. Length := -1;
  663. for i := 0 to ListBox.Items.Count-1 do
  664. begin
  665. if ListBox.Selected[i] and (CDReader.Tracks[i].TrackType = ttAudio) then
  666. begin
  667. if (Start = -1) then
  668. begin
  669. Start := CDReader.Tracks[i].Start;
  670. Length := CDReader.Tracks[i].Length;
  671. end
  672. else inc(Length,CDReader.Tracks[i].Length);
  673. end
  674. else if (Start <> -1) then break;
  675. end;
  676. if (Start = -1) then
  677. begin
  678. MessageDlg('No Audio Track selected !',mtInformation,[mbOK],0);
  679. exit;
  680. end;
  681. CDReader.PlayAudio(Start,Length);
  682. end;
  683. end;
  684. {-- TMainForm -----------------------------------------------------------------}
  685. procedure TCDMainForm.PrevClick(Sender: TObject);
  686. var
  687. cTrack: integer;
  688. begin
  689. with CDReader do
  690. begin
  691. cTrack := GetCurrentTrack;
  692. dec(cTrack);
  693. if (cTrack < 1) then cTrack := Tracks.Count;
  694. PlayAudio(Tracks[cTrack-1].Start,Tracks[cTrack-1].Length);
  695. end;
  696. end;
  697. {-- TMainForm -----------------------------------------------------------------}
  698. procedure TCDMainForm.NextClick(Sender: TObject);
  699. var
  700. cTrack: integer;
  701. begin
  702. with CDReader do
  703. begin
  704. cTrack := GetCurrentTrack;
  705. inc(cTrack);
  706. if (cTrack > Tracks.Count) then cTrack := 1;
  707. PlayAudio(Tracks[cTrack-1].Start,Tracks[cTrack-1].Length);
  708. end;
  709. end;
  710. {-- TMainForm -----------------------------------------------------------------}
  711. procedure TCDMainForm.StopClick(Sender: TObject);
  712. begin
  713. CDReader.StopAudio;
  714. end;
  715. {-- TMainForm -----------------------------------------------------------------}
  716. procedure TCDMainForm.EjectClick(Sender: TObject);
  717. var
  718. status: TMMCDStatus;
  719. begin
  720. status := CDReader.DeviceStatus;
  721. if (status = cdOpen) then
  722. CDReader.LoadMedia(True)
  723. else
  724. CDReader.LoadMedia(False);
  725. end;
  726. {-- TMainForm -----------------------------------------------------------------}
  727. procedure TCDMainForm.ToolBar1Click(Sender: TObject);
  728. begin
  729. ToolBar.Visible := not ToolBar.Visible;
  730. ToolBar1.Checked := ToolBar.Visible;
  731. end;
  732. {-- TMainForm -----------------------------------------------------------------}
  733. procedure TCDMainForm.Statusbar1Click(Sender: TObject);
  734. begin
  735. StatusBar.Visible := not StatusBar.Visible;
  736. StatusBar1.Checked := StatusBar.Visible;
  737. end;
  738. {-- TMainForm -----------------------------------------------------------------}
  739. procedure TCDMainForm.SelectAll1Click(Sender: TObject);
  740. var
  741. i: integer;
  742. begin
  743. for i := 0 to ListBox.Items.Count-1 do
  744. begin
  745. ListBox.Selected[i] := True;
  746. end;
  747. end;
  748. {-- TMainForm -----------------------------------------------------------------}
  749. procedure TCDMainForm.InvertSelection1Click(Sender: TObject);
  750. var
  751. i: integer;
  752. begin
  753. for i := 0 to ListBox.Items.Count-1 do
  754. begin
  755. ListBox.Selected[i] := not ListBox.Selected[i];
  756. end;
  757. end;
  758. {-- TMainForm -----------------------------------------------------------------}
  759. procedure TCDMainForm.ConfigDriveClick(Sender: TObject);
  760. begin
  761. with TConfigDlg.Create(Self) do
  762. try
  763. ShowModal;
  764. finally
  765. Free;
  766. end;
  767. end;
  768. {-- TMainForm -----------------------------------------------------------------}
  769. procedure TCDMainForm.TriggerError(Sender: TObject);
  770. begin
  771. if (CopyDlg <> nil) then CopyDlg.ErrorAbort := True;
  772. end;
  773. {-- TMainForm -----------------------------------------------------------------}
  774. procedure TCDMainForm.miExitClick(Sender: TObject);
  775. begin
  776. Close;
  777. end;
  778. {-- TMainForm -----------------------------------------------------------------}
  779. procedure TCDMainForm.SelectWaveformat1Click(Sender: TObject);
  780. begin
  781. { choose a destination format for the ACM converter }
  782. if ACM.ChooseFormat(ACMConverter.PWaveFormat,'') then
  783. ACMConverter.PWaveFormat := ACM.PWaveFormat;
  784. end;
  785. end.