home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / cdaudio.pas < prev    next >
Pascal/Delphi Source File  |  1996-12-12  |  8KB  |  260 lines

  1. (*--------------------------------------------------------------------*)
  2. (*                                                                    *)
  3. (* Module . . . . . . .  CDAUDIO                                      *)
  4. (* Source file  . . . .  CDAUDIO.PAS                                  *)
  5. (* Language . . . . . .  Object Pascal                                *)
  6. (* Compiler . . . . . .  Virtual Pascal/2 V1.10                       *)
  7. (* Operating system . .  OS/2 Warp V3                                 *)
  8. (* Author . . . . . . .  Th. Trepl, Munich Germany                    *)
  9. (*                       101353,671@CompuServ.com                     *)
  10. (* Reference  . . . . .  -                                            *)
  11. (*                                                                    *)
  12. (*--------------------------------------------------------------------*)
  13. (*                                                                    *)
  14. (* Description                                                        *)
  15. (* -----------                                                        *)
  16. (*                                                                    *)
  17. (* Advanced procedures and function to access a CD-ROM drive as an    *)
  18. (* audio CD-Player.                                                   *)
  19. (*                                                                    *)
  20. (*--------------------------------------------------------------------*)
  21. Unit CdAudio;
  22. Interface
  23. (*--------------------------------------------------------------------*)
  24. (* Interface                                                          *)
  25. (*--------------------------------------------------------------------*)
  26. Uses
  27.   Os2Def, Os2Base, Classes,
  28.   CdBase;
  29.  
  30. Const
  31.   cDefaultDrive = #0;
  32.  
  33. Type
  34.   tAudioTrack = Record
  35.     TrackNr         : Byte;
  36.     StartAddr       : LongInt;
  37.     EndAddr         : LongInt;
  38.     TITwoChannel    : Boolean;        // True = Stereo;                 False = Mono
  39.     TIAudioTrack    : Boolean;        // True = Audio;                  False = Data
  40.     TICopyProhibited: Boolean;        // True = Prohibited;             False = Copy permitted
  41.     TIPreemphasis   : Boolean;        // True = Audio with preemphasis; False = Audio without preemph.
  42.     TIADR_Data      : Byte;           // ADR-Data
  43.   End;
  44.   tAudioTrackArray = Array[1..255] Of tAudioTrack;
  45.   pAudioTrackArray = ^tAudioTrackArray;
  46.  
  47. Type
  48.   tCDPlayer = Class(TComponent)
  49.     Private
  50.       DevHndl       : HFile;
  51.       DskFirstTrack : LongInt;
  52.       DskLastTrack  : LongInt;
  53.       DskLeadOutAddr: LongInt;
  54.       NrOfTracks    : Byte;
  55.       Tracks        : pAudioTrackArray;
  56.     Protected
  57.       Function OpenCdRom(Drive : Char) : Boolean;
  58.       Function IsDiskInDrive : Boolean;
  59.       Function IsPlaying : Boolean;
  60.       Procedure ReloadDiskInfo;
  61.     Public
  62.       Constructor Create(AOwner : TComponent);
  63.       Destructor  Destroy; Override;
  64.       Procedure   OpenPlayer(Drive : Char);
  65.       Procedure   Play(TNr : Byte);
  66.       Procedure   Stop;
  67.       Procedure   Resume;
  68.       Procedure   CurrentPos(Var Track, Minute, Second : Byte);
  69.     Property Handle      : HFile    Read DevHndl;
  70.     Property DiskInDrive : Boolean  Read IsDiskInDrive;
  71.     Property Playing     : Boolean  Read IsPlaying;
  72.     Property FirstTrack  : LongInt  Read DskFirstTrack;
  73.     Property LastTrack   : LongInt  Read DskLastTrack;
  74.     Property LeadOutAddr : LongInt  Read DskLeadOutAddr;
  75.   End;
  76.  
  77. (*--------------------------------------------------------------------*)
  78. (* Implementation                                                     *)
  79. (*--------------------------------------------------------------------*)
  80. Implementation
  81.  
  82. Type
  83.   tMSFData = Record
  84.     Case Byte Of
  85.       1 : (Frame   : Byte;
  86.            Second  : Byte;
  87.            Minute  : Byte;
  88.            Reserved: Byte);
  89.       2 : (TrackAddr : LongInt);
  90.   End;
  91.  
  92. {----------------------------------------------------------------------}
  93. { Basic Device Functions                                               }
  94. {----------------------------------------------------------------------}
  95. Function tCDPlayer.OpenCDRom(Drive : Char) : Boolean;
  96. Var Status : LongInt;
  97. Begin
  98.   Result := False;   // A little pessimistic but useful
  99.  
  100.   DevHndl := OpenDevice(Drive, False);
  101.   If IoCtlResult <> NO_ERROR Then Exit;
  102.  
  103.   If CDGetDriver(DevHndl) <> CDSignature Then
  104.     Begin
  105.       CloseDevice(DevHndl);
  106.       Exit;
  107.     End;
  108.  
  109.   Status := CDGetDiskStatus(DevHndl);
  110.   If IoCtlResult <> NO_ERROR Then
  111.     Begin
  112.       CloseDevice(DevHndl);
  113.       Exit;
  114.     End;
  115.  
  116.   If (Status And AUDIO_DEVICE) = 0 Then
  117.     Begin
  118.       CloseDevice(DevHndl);
  119.       Exit;
  120.     End;
  121.  
  122.   Result := True;
  123. End;
  124.  
  125. Function tCDPlayer.IsDiskInDrive : Boolean;
  126. Var Status : LongInt;
  127. Begin
  128.   Result := False;
  129.   Status := CDGetDiskStatus(DevHndl);
  130.   If IoCtlResult <> NO_ERROR Then Exit;
  131.   If (Status And NO_DISK_PRESENT) = NO_DISK_PRESENT Then Exit;
  132.   Result := True;
  133. End;
  134.  
  135. Function tCDPlayer.IsPlaying : Boolean;
  136. Var Status : LongInt;
  137. Begin
  138.   Result := False;
  139.   Status := CDGetDiskStatus(DevHndl);
  140.   If IoCtlResult <> NO_ERROR Then Exit;
  141.   If (Status And PLAYING_AUDIO) = 0 Then Exit;
  142.   Result := True;
  143. End;
  144.  
  145. Procedure tCDPlayer.ReloadDiskInfo;
  146. Var Disk : tAudioDiskInfo;
  147.     TNr  : Byte;
  148.     Idx  : Integer;
  149.     Trck : TAudioTrackInfo;
  150. Begin
  151.   CDGetAudioDisk(DevHndl, Disk);
  152.   If IoCtlResult = NO_ERROR Then
  153.     Begin
  154.       DskFirstTrack := Disk.FirstTrack;
  155.       DskLastTrack  := Disk.LastTrack;
  156.       DskLeadOutAddr:= Disk.LeadOutAddr;
  157.       NrOfTracks := (Disk.LastTrack-Disk.FirstTrack)+1;
  158.       GetMem(Tracks,NrOfTracks*SizeOf(tAudioTrack));
  159.       Idx := 1;
  160.       For TNr:=Disk.FirstTrack To Disk.LastTrack Do
  161.         Begin
  162.           CDGetAudioTrack(Handle, TNr, Trck);
  163.           With Tracks^[Idx] Do
  164.             Begin
  165.               If Idx > 1 Then Tracks^[Idx-1].EndAddr := Trck.TrackAddr;
  166.               StartAddr := Trck.TrackAddr;
  167.               TITwoChannel     := (Trck.TrackCtrl And $80) = 0;
  168.               TIAudioTrack     := (Trck.TrackCtrl And $40) = 0;
  169.               TICopyProhibited := (Trck.TrackCtrl And $20) = 0;
  170.               TIPreemphasis    := (Trck.TrackCtrl And $10) = 0;
  171.               TIADR_Data       := (Trck.TrackCtrl And $0F);
  172.             End;
  173.           Inc(Idx);
  174.         End;
  175.       Tracks^[Idx-1].EndAddr := LeadOutAddr;
  176.     End;
  177. End;
  178.  
  179. {----------------------------------------------------------------------}
  180. { Public Functions                                                     }
  181. {----------------------------------------------------------------------}
  182. Constructor tCDPlayer.Create(AOwner : TComponent);
  183. Begin
  184.   Inherited Create(AOwner);
  185.   DevHndl := $FFFFFFFF;
  186.   DskFirstTrack := 0;
  187.   DskLastTrack  := 0;
  188.   DskLeadOutAddr:= 0;
  189.   Tracks := Nil;
  190.   NrOfTracks := 0;
  191. End;
  192.  
  193. Procedure tCDPlayer.OpenPlayer(Drive : Char);
  194. Var C : Char;
  195.     Found : Boolean;
  196. Begin
  197.   If Drive = cDefaultDrive Then
  198.     Begin
  199.       c := 'C';
  200.       Found := False;
  201.       While (c <= 'Z') And Not Found Do
  202.         Begin
  203.           If OpenCDRom(C)
  204.             Then Found := True
  205.             Else Inc(C);
  206.         End;
  207.     End
  208.   Else
  209.     Begin
  210.       Found := OpenCDRom(Drive);
  211.     End;
  212.  
  213.   If Not Found Then
  214.     Begin
  215.       // No CD drive found: Do something like raise an
  216.       // exception ...
  217.       Exit;
  218.     End;
  219.  
  220.   If DiskInDrive Then ReloadDiskInfo;
  221. End;
  222.  
  223. Procedure tCDPlayer.Play(TNr : Byte);
  224. Begin
  225.   CDPlayTrackMSF(Handle, Tracks^[TNr].StartAddr, Tracks^[TNr].EndAddr);
  226. End;
  227.  
  228. Procedure TCDPlayer.Stop;
  229. Begin
  230.   If Playing Then CDStopAudio(DevHndl);
  231. End;
  232.  
  233. Procedure TCDPlayer.Resume;
  234. Begin
  235.   CDResumeAudio(DevHndl);
  236. End;
  237.  
  238. Procedure TCDPlayer.CurrentPos(Var Track, Minute, Second : Byte);
  239. Var D : TSubCnlInfo;
  240. Begin
  241.   CDGetSubChannelQ(DevHndl, D);
  242.   Track  := D.TrackNr;
  243.   Minute := D.RunTrckMin;
  244.   Second := D.RunTrckSec;
  245. End;
  246.  
  247. Destructor tCDPlayer.Destroy;
  248. Begin
  249.   If DevHndl <> $FFFFFFFF Then
  250.     Begin
  251.       Stop;
  252.       CloseDevice(DevHndl);
  253.     End;
  254.   If Assigned(Tracks) Then FreeMem(Tracks,NrOfTracks*SizeOf(tAudioTrack));
  255.   Inherited Destroy;
  256. End;
  257.  
  258. End.
  259.  
  260.