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

  1. (*--------------------------------------------------------------------*)
  2. (*                                                                    *)
  3. (* Module . . . . . . .  CDBASE                                       *)
  4. (* Source file  . . . .  CDBASE.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  . . . . .  Control Program Programming Guide            *)
  11. (*                       Example program CDPLAY of VP/2               *)
  12. (*                                                                    *)
  13. (*--------------------------------------------------------------------*)
  14. (*                                                                    *)
  15. (* Description                                                        *)
  16. (* -----------                                                        *)
  17. (*                                                                    *)
  18. (* Functions and procedures to access a CDROM-drive.                  *)
  19. (* Also providing low level functions and procedures to control the   *)
  20. (* playback of audio tracks.                                          *)
  21. (*                                                                    *)
  22. (*--------------------------------------------------------------------*)
  23. Unit CdBase;
  24. Interface
  25. (*--------------------------------------------------------------------*)
  26. (* Interface                                                          *)
  27. (*--------------------------------------------------------------------*)
  28. Uses Os2Def, Os2Base;
  29.  
  30. {----------------------------------------------------------------------}
  31. { Api-Call Return Value                                                }
  32. {----------------------------------------------------------------------}
  33. Const
  34.   IOCtlResult  : ApiRet = 0;
  35.  
  36. {----------------------------------------------------------------------}
  37. { Error Messages                                                       }
  38. {----------------------------------------------------------------------}
  39. Const
  40.   NO_ERROR              = $0000;
  41.   DRIVE_NOT_READY       = $0002;
  42.   REQUEST_UNSUPPORTED   = $0003;
  43.   ACCESS_DENIED         = $0005;
  44.   SEEK_ERROR            = $0006;
  45.   UNKNOWN_MEDIA         = $0007;
  46.   SECTOR_NOT_FOUND      = $0008;
  47.   UNCERTAIN_MEDIA       = $0010;
  48.   INVALID_PARAMETER     = $0013;
  49.   DRIVE_IN_USE          = $0014;
  50.  
  51. {----------------------------------------------------------------------}
  52. { Device Status Masks                                                  }
  53. {----------------------------------------------------------------------}
  54.  
  55. Const
  56.   DOOR_OPEN             = $0001;
  57.   DOOR_LOCKED           = $0002;
  58.   COOKED_AND_RAW        = $0004;
  59.   READ_AND_WRITE        = $0008;
  60.   AUDIO_DEVICE          = $0010;
  61.   ISO_INTERLEAVE        = $0020;
  62. { RESERVED              = $0040; }
  63.   PREFETCH_SUPPORT      = $0080;
  64.   AUDIO_MANIPULATION    = $0100;
  65.   LBF_AND_MSF_ADDRESS   = $0200;
  66.   FORM1_AND_FORM2       = $0400;
  67.   NO_DISK_PRESENT       = $0800;
  68.   PLAYING_AUDIO         = $1000;
  69.  
  70. {----------------------------------------------------------------------}
  71. { Common Types                                                         }
  72. {----------------------------------------------------------------------}
  73. Type
  74.   tReadBlock = Record
  75.     Synch  : Array[0..11] Of Byte;
  76.     Header : Array[0..3] Of Byte;
  77.     Data   : Array[0..2047] Of Byte;
  78.     EDCECC : Array[0..287] Of Byte;
  79.   End;
  80.  
  81. Type
  82.   tUPCStruct = Record
  83.     CtrlAddr : Byte;
  84.     UPC      : Array[0..6] Of Char;
  85.     Reserved : Byte;
  86.     Frame    : Byte;
  87.   End;
  88.  
  89. Type
  90.   tChannelCtrl = Record
  91.     InpCnl : Array[0..3] Of Byte;
  92.     Volume : Array[0..3] Of Byte;
  93.   End;
  94.  
  95. Type
  96.   tAudioDiskInfo = Record
  97.     FirstTrack : Byte;
  98.     LastTrack  : Byte;
  99.     LeadOutAddr: LongInt;
  100.   End;
  101.  
  102. Type
  103.   tAudioTrackInfo = Record
  104.     TrackAddr : LongInt;
  105.     TrackCtrl : Byte;
  106.   End;
  107.  
  108. Type
  109.   tSubCnlInfo = Record
  110.     CtrlADR    : Byte;
  111.     TrackNr    : Byte;
  112.     Index      : Byte;
  113.     RunTrckMin : Byte;
  114.     RunTrckSec : Byte;
  115.     RunTrckFrm : Byte;
  116.     Reserved   : Byte;
  117.     RunDiskMin : Byte;
  118.     RunDiskSec : Byte;
  119.     RunDiskFrm : Byte;
  120.   End;
  121.  
  122. Type
  123.   tAudioStatus = Record
  124.     AudioStatus : Word;
  125.     StartLoc    : LongInt;
  126.     EndingLoc   : LongInt;
  127.   End;
  128.  
  129. {----------------------------------------------------------------------}
  130. { Basic Device-IO Functions                                            }
  131. {----------------------------------------------------------------------}
  132. Function OpenDevice(Drive : Char; ReadOnly : Boolean) : HFile;
  133. Procedure CloseDevice(Var DevHndl : HFile);
  134.  
  135. {----------------------------------------------------------------------}
  136. { CDROM-Disk-Device Functions                                          }
  137. {----------------------------------------------------------------------}
  138. Procedure CDResetDrive(DevHndl : HFile);
  139. Procedure CDEjectDisk(DevHndl : HFile);
  140. Procedure CDCloseTray(DevHndl : HFile);
  141. Procedure CDLockDoor(DevHndl : HFile);
  142. Procedure CDUnlockDoor(DevHndl : HFile);
  143. Procedure CDSeekSector(DevHndl : HFile; StartingSector : LongInt);
  144. Procedure CDSeekMSF(DevHndl : HFile; MSF : LongInt);
  145. Function  CDGetDiskStatus(DevHndl : HFile) : LongInt;
  146. Function  CDGetDriver(DevHndl : HFile) : String;
  147. Function  CDGetSectorSize(DevHndl : HFile) : Word;
  148. Procedure CDGetHeadLocLBF(DevHndl : HFile; Var LBF : LongInt);
  149. Procedure CDGetHeadLocMSF(DevHndl : HFile; Var MSF : LongInt);
  150. Procedure CDReadLong(DevHndl : HFile; StartSector : LongInt; Var Buf : tReadBlock);
  151. Function  CDGetVolumeSize(DevHndl : HFile) : LongInt;
  152. Procedure CDGetUPC(DevHndl : HFile; Var UPC : tUPCStruct);
  153. Function  CDSignature : String;
  154.  
  155. {----------------------------------------------------------------------}
  156. { CDROM-Audio Functions                                                }
  157. {----------------------------------------------------------------------}
  158. Procedure CDSetChannelCtrl(DevHndl : HFile; Data : tChannelCtrl);
  159. Procedure CDPlayTrackMSF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
  160. Procedure CDPlayTrackLBF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
  161. Procedure CDStopAudio(DevHndl : HFile);
  162. Procedure CDResumeAudio(DevHndl : HFile);
  163. Procedure CDGetChannelCtrl(DevHndl : HFile; Var Data : tChannelCtrl);
  164. Procedure CDGetAudioDisk(DevHndl : HFile; Var Data : tAudioDiskInfo);
  165. Procedure CDGetAudioTrack(DevHndl : HFile; TrackNr : Byte; Var Data : tAudioTrackInfo);
  166. Procedure CDGetSubChannelQ(DevHndl : HFile; Var Data : tSubCnlInfo);
  167. Procedure CDGetAudioStatus(DevHndl : HFile; Var Data : tAudioStatus);
  168.  
  169. (*--------------------------------------------------------------------*)
  170. (* Implementation                                                     *)
  171. (*--------------------------------------------------------------------*)
  172. Implementation
  173.  
  174. Const
  175.   CDROMDISK_CATEGORY       = $80;
  176.   CDROMDISK_RESETDRIVE     = $40;
  177.   CDROMDISK_EJECTDISK      = $44;
  178.   CDROMDISK_CLOSETRAY      = $45;
  179.   CDROMDISK_LOCKUNLOCKDOOR = $46;
  180.   CDROMDISK_SEEK           = $50;
  181.   CDROMDISK_DEVICESTATUS   = $60;
  182.   CDROMDISK_GETDRIVER      = $61;
  183.   CDROMDISK_GETSECTORSIZE  = $63;
  184.   CDROMDISK_GETHEADLOC     = $70;
  185.   CDROMDISK_READLONG       = $72;
  186.   CDROMDISK_GETVOLUMESIZE  = $78;
  187.   CDROMDISK_GETUPC         = $79;
  188.  
  189. Const
  190.   CDROMAUDIO_CATEGORY      = $81;
  191.   CDROMAUDIO_SETCHANNELCTRL= $40;
  192.   CDROMAUDIO_PLAYAUDIO     = $50;
  193.   CDROMAUDIO_STOPAUDIO     = $51;
  194.   CDROMAUDIO_RESUMEAUDIO   = $52;
  195.   CDROMAUDIO_GETCHANNEL    = $60;
  196.   CDROMAUDIO_GETAUDIODISK  = $61;
  197.   CDROMAUDIO_GETAUDIOTRACK = $62;
  198.   CDROMAUDIO_GETSUBCHANNELQ= $63;
  199.   CDROMAUDIO_GETAUDIOSTATUS= $65;
  200.  
  201. Type
  202.   tCDSignature = Array[0..3] Of Char;
  203.  
  204. Const
  205.   CD_Signature : tCDSignature = ('C','D','0','1');
  206.  
  207. Type
  208.   tCommandStrct = Record
  209.     Signature : tCDSignature;
  210.     Case Byte Of
  211.       CDROMDISK_LOCKUNLOCKDOOR : (LockDoor     : Byte);
  212.       CDROMDISK_SEEK           : (SeekAddrMode : Byte;
  213.                                   SeekSector   : LongInt);
  214.       CDROMDISK_GETHEADLOC     : (HdLocAddrMode: Byte);
  215.       CDROMDISK_READLONG       : (ReadAddrMode : Byte;
  216.                                   NrOfSectors  : Word;
  217.                                   StartSector  : LongInt;
  218.                                   Reserved     : Char;
  219.                                   Interleave   : Byte);
  220.       CDROMAUDIO_PLAYAUDIO     : (PlayAddrMode : Byte;
  221.                                   PlayStartSect: LongInt;
  222.                                   PlayStopSect : LongInt);
  223.       CDROMAUDIO_GETAUDIOTRACK : (TrackNbr     : Byte);
  224.   End;
  225.  
  226. Type
  227.   tRtnDataStrct = Record
  228.     Case Byte Of
  229.       CDROMDISK_DEVICESTATUS   : (DevStatus    : LongInt);
  230.       CDROMDISK_GETDRIVER      : (Signature    : Array[0..3] Of Char);
  231.       CDROMDISK_GETSECTORSIZE  : (SectorSize   : Word);
  232.       CDROMDISK_GETHEADLOC     : (HeadLocation : LongInt);
  233.       CDROMDISK_GETVOLUMESIZE  : (VolumeSize   : LongInt);
  234.       CDROMAUDIO_SETCHANNELCTRL: (InputCnl0    : Byte;
  235.                                   VolumeCnl0   : Byte;
  236.                                   InputCnl1    : Byte;
  237.                                   VolumeCnl1   : Byte;
  238.                                   InputCnl2    : Byte;
  239.                                   VolumeCnl2   : Byte;
  240.                                   InputCnl3    : Byte;
  241.                                   VolumeCnl3   : Byte);
  242.   End;
  243.  
  244. {----------------------------------------------------------------------}
  245. { Utility Functions                                                    }
  246. {----------------------------------------------------------------------}
  247. Function CDROMDISK_IoCtl(DevHndl : HFile; Fnct : LongInt;
  248.                          Var CmdStrct; CmdSize : LongInt;
  249.                          Var ParmStrct; ParmSize : LongInt) : ApiRet;
  250. Begin
  251.   Result := DosDevIOCtl(DevHndl, CDROMDISK_CATEGORY, Fnct,
  252.                         @CmdStrct, CmdSize, @CmdSize,
  253.                         @ParmStrct, ParmSize, @ParmSize);
  254.   IOCtlResult := Result;
  255. End;
  256.  
  257. Function CDROMAUDIO_IoCtl(DevHndl : HFile; Fnct : LongInt;
  258.                           Var CmdStrct; CmdSize : LongInt;
  259.                           Var ParmStrct; ParmSize : LongInt) : ApiRet;
  260. Begin
  261.   Result := DosDevIOCtl(DevHndl, CDROMAUDIO_CATEGORY, Fnct,
  262.                         @CmdStrct, CmdSize, @CmdSize,
  263.                         @ParmStrct, ParmSize, @ParmSize);
  264.   IOCtlResult := Result;
  265. End;
  266.  
  267. {----------------------------------------------------------------------}
  268. { Basic Device-IO Functions                                            }
  269. {----------------------------------------------------------------------}
  270. Function OpenDevice(Drive : Char; ReadOnly : Boolean) : HFile;
  271. Var FName  : Array[0..2] Of Char;
  272.     Action : LongInt;
  273.     Attributes : LongInt;
  274.     OpenFlags  : LongInt;
  275.     OpenMode   : LongInt;
  276.     EAs        : pEAOp2;
  277.     DevHndl    : HFile;
  278. Begin
  279.   FName[0] := Drive;
  280.   FName[1] := ':';
  281.   FName[2] := #0;
  282.  
  283.   Attributes := File_Normal;
  284.   OpenFlags  := File_Open Or Open_Action_Open_If_Exists Or Open_Action_Fail_If_New;
  285.   If ReadOnly
  286.     Then OpenMode := Open_Access_ReadOnly  Or Open_Share_DenyNone Or Open_Flags_Dasd
  287.     Else OpenMode := Open_Access_ReadWrite Or Open_Share_DenyNone Or Open_Flags_Dasd;
  288.   EAs        := Nil;
  289.   IOCtlResult := DosOpen(@FName, DevHndl, Action, 0, Attributes, OpenFlags, OpenMode, EAs);
  290.   If IOCtlResult = 0
  291.     Then Result := DevHndl
  292.     Else Result := $FFFFFFFF;
  293. End;
  294.  
  295. Procedure CloseDevice(Var DevHndl : HFile);
  296. Begin
  297.   IOCtlResult := DosClose(DevHndl);
  298.   If IoCtlResult = 0 Then DevHndl := $FFFFFFFF;
  299. End;
  300.  
  301. {----------------------------------------------------------------------}
  302. { CDROM-Disk-Device Functions                                          }
  303. {----------------------------------------------------------------------}
  304. Procedure CDResetDrive(DevHndl : HFile);
  305. Var CmdStrct : tCommandStrct;
  306.     ParmStrct: tRtnDataStrct;
  307. Begin
  308.   CmdStrct.Signature := CD_Signature;
  309.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  310.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_RESETDRIVE,
  311.                            CmdStrct, SizeOf(CmdStrct),
  312.                            ParmStrct, SizeOf(ParmStrct));
  313. End;
  314.  
  315. Procedure CDEjectDisk(DevHndl : HFile);
  316. Var CmdStrct : tCommandStrct;
  317.     ParmStrct: tRtnDataStrct;
  318. Begin
  319.   CmdStrct.Signature := CD_Signature;
  320.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  321.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_EJECTDISK,
  322.                            CmdStrct, SizeOf(CmdStrct),
  323.                            ParmStrct, SizeOf(ParmStrct));
  324. End;
  325.  
  326. Procedure CDCloseTray(DevHndl : HFile);
  327. Var CmdStrct : tCommandStrct;
  328.     ParmStrct: tRtnDataStrct;
  329. Begin
  330.   CmdStrct.Signature := CD_Signature;
  331.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  332.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_CLOSETRAY,
  333.                            CmdStrct, SizeOf(CmdStrct),
  334.                            ParmStrct, SizeOf(ParmStrct));
  335. End;
  336.  
  337. Procedure CDLockDoor(DevHndl : HFile);
  338. Var CmdStrct : tCommandStrct;
  339.     ParmStrct: tRtnDataStrct;
  340. Begin
  341.   CmdStrct.Signature := CD_Signature;
  342.   CmdStrct.LockDoor := $01;
  343.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  344.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_LOCKUNLOCKDOOR,
  345.                            CmdStrct, SizeOf(CmdStrct),
  346.                            ParmStrct, SizeOf(ParmStrct));
  347. End;
  348.  
  349. Procedure CDUnlockDoor(DevHndl : HFile);
  350. Var CmdStrct : tCommandStrct;
  351.     ParmStrct: tRtnDataStrct;
  352. Begin
  353.   CmdStrct.Signature := CD_Signature;
  354.   CmdStrct.LockDoor  := $00;
  355.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  356.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_LOCKUNLOCKDOOR,
  357.                            CmdStrct, SizeOf(CmdStrct),
  358.                            ParmStrct, SizeOf(ParmStrct));
  359. End;
  360.  
  361. Procedure CDSeekSector(DevHndl : HFile; StartingSector : LongInt);
  362. Var CmdStrct : tCommandStrct;
  363.     ParmStrct: tRtnDataStrct;
  364. Begin
  365.   CmdStrct.Signature := CD_Signature;
  366.   CmdStrct.SeekAddrMode := $00;    // Logical-Block Format
  367.   CmdStrct.SeekSector := StartingSector;
  368.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  369.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_SEEK,
  370.                            CmdStrct, SizeOf(CmdStrct),
  371.                            ParmStrct, SizeOf(ParmStrct));
  372. End;
  373.  
  374. Procedure CDSeekMSF(DevHndl : HFile; MSF : LongInt);
  375. Var CmdStrct : tCommandStrct;
  376.     ParmStrct: tRtnDataStrct;
  377. Begin
  378.   CmdStrct.Signature := CD_Signature;
  379.   CmdStrct.SeekAddrMode := $01;    // Minute/Second/Frame Format
  380.   CmdStrct.SeekSector := MSF;
  381.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  382.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_SEEK,
  383.                            CmdStrct, SizeOf(CmdStrct),
  384.                            ParmStrct, SizeOf(ParmStrct));
  385. End;
  386.  
  387. Function CDGetDiskStatus(DevHndl : HFile) : LongInt;
  388. Var CmdStrct : tCommandStrct;
  389.     ParmStrct: tRtnDataStrct;
  390. Begin
  391.   CmdStrct.Signature := CD_Signature;
  392.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  393.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_DEVICESTATUS,
  394.                            CmdStrct, SizeOf(CmdStrct),
  395.                            ParmStrct, SizeOf(ParmStrct));
  396.   Result := ParmStrct.DevStatus;
  397. End;
  398.  
  399. Function CDGetDriver(DevHndl : HFile) : String;
  400. Var CmdStrct : tCommandStrct;
  401.     ParmStrct: tRtnDataStrct;
  402. Begin
  403.   CmdStrct.Signature := CD_Signature;
  404.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  405.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETDRIVER,
  406.                            CmdStrct, SizeOf(CmdStrct),
  407.                            ParmStrct, SizeOf(ParmStrct));
  408.   Result := ParmStrct.Signature;
  409. End;
  410.  
  411. Function CDGetSectorSize(DevHndl : HFile) : Word;
  412. Var CmdStrct : tCommandStrct;
  413.     ParmStrct: tRtnDataStrct;
  414. Begin
  415.   CmdStrct.Signature := CD_Signature;
  416.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  417.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETSECTORSIZE,
  418.                            CmdStrct, SizeOf(CmdStrct),
  419.                            ParmStrct, SizeOf(ParmStrct));
  420.   Result := ParmStrct.SectorSize;
  421. End;
  422.  
  423. Procedure CDGetHeadLocLBF(DevHndl : HFile; Var LBF : LongInt);
  424. Var CmdStrct : tCommandStrct;
  425.     ParmStrct: tRtnDataStrct;
  426. Begin
  427.   CmdStrct.Signature := CD_Signature;
  428.   CmdStrct.SeekAddrMode := $00;    // Logical-Block Format
  429.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  430.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETHEADLOC,
  431.                            CmdStrct, SizeOf(CmdStrct),
  432.                            ParmStrct, SizeOf(ParmStrct));
  433.   LBF := ParmStrct.HeadLocation;
  434. End;
  435.  
  436. Procedure CDGetHeadLocMSF(DevHndl : HFile; Var MSF : LongInt);
  437. Var CmdStrct : tCommandStrct;
  438.     ParmStrct: tRtnDataStrct;
  439. Begin
  440.   CmdStrct.Signature := CD_Signature;
  441.   CmdStrct.SeekAddrMode := $01;    // Minute/Second/Frame Format
  442.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  443.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETHEADLOC,
  444.                            CmdStrct, SizeOf(CmdStrct),
  445.                            ParmStrct, SizeOf(ParmStrct));
  446.   MSF := ParmStrct.HeadLocation;
  447. End;
  448.  
  449. Procedure CDReadLong(DevHndl : HFile; StartSector : LongInt; Var Buf : tReadBlock);
  450. Var CmdStrct : tCommandStrct;
  451. Begin
  452.   CmdStrct.Signature := CD_Signature;
  453.   CmdStrct.ReadAddrMode := $00;    // Logical-Block Format
  454.   CmdStrct.NrOfSectors  := 1;
  455.   CmdStrct.StartSector  := StartSector;
  456.   CmdStrct.Reserved     := #$00;
  457.   CmdStrct.Interleave   := $00;
  458.   FillChar(Buf, SizeOf(Buf), 0);
  459.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_READLONG,
  460.                            CmdStrct, SizeOf(CmdStrct),
  461.                            Buf, SizeOf(Buf));
  462. End;
  463.  
  464. Function  CDGetVolumeSize(DevHndl : HFile) : LongInt;
  465. Var CmdStrct : tCommandStrct;
  466.     ParmStrct: tRtnDataStrct;
  467. Begin
  468.   CmdStrct.Signature := CD_Signature;
  469.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  470.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETVOLUMESIZE,
  471.                            CmdStrct, SizeOf(CmdStrct),
  472.                            ParmStrct, SizeOf(ParmStrct));
  473.   Result := ParmStrct.VolumeSize;
  474. End;
  475.  
  476. Procedure CDGetUPC(DevHndl : HFile; Var UPC : tUPCStruct);
  477. Var CmdStrct : tCommandStrct;
  478. Begin
  479.   CmdStrct.Signature := CD_Signature;
  480.   FillChar(UPC, SizeOf(UPC), 0);
  481.   CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETUPC,
  482.                            CmdStrct, SizeOf(CmdStrct),
  483.                            UPC, SizeOf(UPC));
  484. End;
  485.  
  486. Function  CDSignature : String;
  487. Begin
  488.   Result := CD_Signature;
  489. End;
  490.  
  491. {----------------------------------------------------------------------}
  492. { CDROM-Audio Functions                                                }
  493. {----------------------------------------------------------------------}
  494. Procedure CDSetChannelCtrl(DevHndl : HFile; Data : tChannelCtrl);
  495. Var CmdStrct : tCommandStrct;
  496.     ParmStrct: tRtnDataStrct;
  497. Begin
  498.   CmdStrct.Signature  := CD_Signature;
  499.   ParmStrct.InputCnl0 := Data.InpCnl[0];
  500.   ParmStrct.VolumeCnl0:= Data.Volume[0];
  501.   ParmStrct.InputCnl1 := Data.InpCnl[1];
  502.   ParmStrct.VolumeCnl1:= Data.Volume[1];
  503.   ParmStrct.InputCnl2 := Data.InpCnl[2];
  504.   ParmStrct.VolumeCnl2:= Data.Volume[2];
  505.   ParmStrct.InputCnl3 := Data.InpCnl[3];
  506.   ParmStrct.VolumeCnl3:= Data.Volume[3];
  507.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_SETCHANNELCTRL,
  508.                             CmdStrct, SizeOf(CmdStrct),
  509.                             ParmStrct, SizeOf(ParmStrct));
  510. End;
  511.  
  512. Procedure CDPlayTrackMSF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
  513. Var CmdStrct : tCommandStrct;
  514.     ParmStrct: tRtnDataStrct;
  515. Begin
  516.   CmdStrct.Signature  := CD_Signature;
  517.   CmdStrct.PlayAddrMode := $01;    // Minute/Second/Frame Format
  518.   CmdStrct.PlayStartSect:= StartTrack;
  519.   CmdStrct.PlayStopSect := StopTrack;
  520.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  521.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_PLAYAUDIO,
  522.                             CmdStrct, SizeOf(CmdStrct),
  523.                             ParmStrct, SizeOf(ParmStrct));
  524. End;
  525.  
  526. Procedure CDPlayTrackLBF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
  527. Var CmdStrct : tCommandStrct;
  528.     ParmStrct: tRtnDataStrct;
  529. Begin
  530.   CmdStrct.Signature  := CD_Signature;
  531.   CmdStrct.PlayAddrMode := $00;    // Logical-Block Format
  532.   CmdStrct.PlayStartSect:= StartTrack;
  533.   CmdStrct.PlayStopSect := StopTrack;
  534.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  535.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_PLAYAUDIO,
  536.                             CmdStrct, SizeOf(CmdStrct),
  537.                             ParmStrct, SizeOf(ParmStrct));
  538. End;
  539.  
  540. Procedure CDStopAudio(DevHndl : HFile);
  541. Var CmdStrct : tCommandStrct;
  542.     ParmStrct: tRtnDataStrct;
  543. Begin
  544.   CmdStrct.Signature  := CD_Signature;
  545.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  546.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_STOPAUDIO,
  547.                             CmdStrct, SizeOf(CmdStrct),
  548.                             ParmStrct, SizeOf(ParmStrct));
  549. End;
  550.  
  551. Procedure CDResumeAudio(DevHndl : HFile);
  552. Var CmdStrct : tCommandStrct;
  553.     ParmStrct: tRtnDataStrct;
  554. Begin
  555.   CmdStrct.Signature  := CD_Signature;
  556.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  557.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_RESUMEAUDIO,
  558.                             CmdStrct, SizeOf(CmdStrct),
  559.                             ParmStrct, SizeOf(ParmStrct));
  560. End;
  561.  
  562. Procedure CDGetChannelCtrl(DevHndl : HFile; Var Data : tChannelCtrl);
  563. Var CmdStrct : tCommandStrct;
  564.     ParmStrct: tRtnDataStrct;
  565. Begin
  566.   CmdStrct.Signature  := CD_Signature;
  567.   FillChar(ParmStrct, SizeOf(ParmStrct), 0);
  568.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETCHANNEL,
  569.                             CmdStrct, SizeOf(CmdStrct),
  570.                             ParmStrct, SizeOf(ParmStrct));
  571.   If IOCtlResult = NO_ERROR Then
  572.     Begin
  573.       Data.InpCnl[0] := ParmStrct.InputCnl0;
  574.       Data.Volume[0] := ParmStrct.VolumeCnl0;
  575.       Data.InpCnl[1] := ParmStrct.InputCnl1;
  576.       Data.Volume[1] := ParmStrct.VolumeCnl1;
  577.       Data.InpCnl[2] := ParmStrct.InputCnl2;
  578.       Data.Volume[2] := ParmStrct.VolumeCnl2;
  579.       Data.InpCnl[3] := ParmStrct.InputCnl3;
  580.       Data.Volume[3] := ParmStrct.VolumeCnl3;
  581.     End;
  582. End;
  583.  
  584. Procedure CDGetAudioDisk(DevHndl : HFile; Var Data : tAudioDiskInfo);
  585. Var CmdStrct : tCommandStrct;
  586. Begin
  587.   CmdStrct.Signature  := CD_Signature;
  588.   FillChar(Data, SizeOf(Data), 0);
  589.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIODISK,
  590.                             CmdStrct, SizeOf(CmdStrct),
  591.                             Data, SizeOf(Data));
  592. End;
  593.  
  594. Procedure CDGetAudioTrack(DevHndl : HFile; TrackNr : Byte; Var Data : tAudioTrackInfo);
  595. Var CmdStrct : tCommandStrct;
  596. Begin
  597.   CmdStrct.Signature  := CD_Signature;
  598.   CmdStrct.TrackNbr   := TrackNr;
  599.   FillChar(Data, SizeOf(Data), 0);
  600.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIOTRACK,
  601.                             CmdStrct, SizeOf(CmdStrct),
  602.                             Data, SizeOf(Data));
  603. End;
  604.  
  605. Procedure CDGetSubChannelQ(DevHndl : HFile; Var Data : tSubCnlInfo);
  606. Var CmdStrct : tCommandStrct;
  607. Begin
  608.   CmdStrct.Signature  := CD_Signature;
  609.   FillChar(Data, SizeOf(Data), 0);
  610.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETSUBCHANNELQ,
  611.                             CmdStrct, SizeOf(CmdStrct),
  612.                             Data, SizeOf(Data));
  613.   If IOCtlResult = NO_ERROR Then
  614.     Begin
  615.       // Convert from BCD to binary format
  616.       Data.TrackNr := (Data.TrackNr And $0F) + (Data.TrackNr Shr 4) * 10;
  617.       Data.Index   := (Data.Index   And $0F) + (Data.Index   Shr 4) * 10;
  618.     End;
  619. End;
  620.  
  621. Procedure CDGetAudioStatus(DevHndl : HFile; Var Data : tAudioStatus);
  622. Var CmdStrct : tCommandStrct;
  623. Begin
  624.   CmdStrct.Signature  := CD_Signature;
  625.   FillChar(Data, SizeOf(Data), 0);
  626.   CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIOSTATUS,
  627.                             CmdStrct, SizeOf(CmdStrct),
  628.                             Data, SizeOf(Data));
  629. End;
  630.  
  631. End.
  632.  
  633.