home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 10 Tools
/
10-Tools.zip
/
cdbase.pas
< prev
next >
Wrap
Pascal/Delphi Source File
|
1996-11-24
|
24KB
|
633 lines
(*--------------------------------------------------------------------*)
(* *)
(* Module . . . . . . . CDBASE *)
(* Source file . . . . CDBASE.PAS *)
(* Language . . . . . . Object Pascal *)
(* Compiler . . . . . . Virtual Pascal/2 V1.10 *)
(* Operating system . . OS/2 Warp V3 *)
(* Author . . . . . . . Th. Trepl, Munich Germany *)
(* 101353,671@CompuServ.com *)
(* Reference . . . . . Control Program Programming Guide *)
(* Example program CDPLAY of VP/2 *)
(* *)
(*--------------------------------------------------------------------*)
(* *)
(* Description *)
(* ----------- *)
(* *)
(* Functions and procedures to access a CDROM-drive. *)
(* Also providing low level functions and procedures to control the *)
(* playback of audio tracks. *)
(* *)
(*--------------------------------------------------------------------*)
Unit CdBase;
Interface
(*--------------------------------------------------------------------*)
(* Interface *)
(*--------------------------------------------------------------------*)
Uses Os2Def, Os2Base;
{----------------------------------------------------------------------}
{ Api-Call Return Value }
{----------------------------------------------------------------------}
Const
IOCtlResult : ApiRet = 0;
{----------------------------------------------------------------------}
{ Error Messages }
{----------------------------------------------------------------------}
Const
NO_ERROR = $0000;
DRIVE_NOT_READY = $0002;
REQUEST_UNSUPPORTED = $0003;
ACCESS_DENIED = $0005;
SEEK_ERROR = $0006;
UNKNOWN_MEDIA = $0007;
SECTOR_NOT_FOUND = $0008;
UNCERTAIN_MEDIA = $0010;
INVALID_PARAMETER = $0013;
DRIVE_IN_USE = $0014;
{----------------------------------------------------------------------}
{ Device Status Masks }
{----------------------------------------------------------------------}
Const
DOOR_OPEN = $0001;
DOOR_LOCKED = $0002;
COOKED_AND_RAW = $0004;
READ_AND_WRITE = $0008;
AUDIO_DEVICE = $0010;
ISO_INTERLEAVE = $0020;
{ RESERVED = $0040; }
PREFETCH_SUPPORT = $0080;
AUDIO_MANIPULATION = $0100;
LBF_AND_MSF_ADDRESS = $0200;
FORM1_AND_FORM2 = $0400;
NO_DISK_PRESENT = $0800;
PLAYING_AUDIO = $1000;
{----------------------------------------------------------------------}
{ Common Types }
{----------------------------------------------------------------------}
Type
tReadBlock = Record
Synch : Array[0..11] Of Byte;
Header : Array[0..3] Of Byte;
Data : Array[0..2047] Of Byte;
EDCECC : Array[0..287] Of Byte;
End;
Type
tUPCStruct = Record
CtrlAddr : Byte;
UPC : Array[0..6] Of Char;
Reserved : Byte;
Frame : Byte;
End;
Type
tChannelCtrl = Record
InpCnl : Array[0..3] Of Byte;
Volume : Array[0..3] Of Byte;
End;
Type
tAudioDiskInfo = Record
FirstTrack : Byte;
LastTrack : Byte;
LeadOutAddr: LongInt;
End;
Type
tAudioTrackInfo = Record
TrackAddr : LongInt;
TrackCtrl : Byte;
End;
Type
tSubCnlInfo = Record
CtrlADR : Byte;
TrackNr : Byte;
Index : Byte;
RunTrckMin : Byte;
RunTrckSec : Byte;
RunTrckFrm : Byte;
Reserved : Byte;
RunDiskMin : Byte;
RunDiskSec : Byte;
RunDiskFrm : Byte;
End;
Type
tAudioStatus = Record
AudioStatus : Word;
StartLoc : LongInt;
EndingLoc : LongInt;
End;
{----------------------------------------------------------------------}
{ Basic Device-IO Functions }
{----------------------------------------------------------------------}
Function OpenDevice(Drive : Char; ReadOnly : Boolean) : HFile;
Procedure CloseDevice(Var DevHndl : HFile);
{----------------------------------------------------------------------}
{ CDROM-Disk-Device Functions }
{----------------------------------------------------------------------}
Procedure CDResetDrive(DevHndl : HFile);
Procedure CDEjectDisk(DevHndl : HFile);
Procedure CDCloseTray(DevHndl : HFile);
Procedure CDLockDoor(DevHndl : HFile);
Procedure CDUnlockDoor(DevHndl : HFile);
Procedure CDSeekSector(DevHndl : HFile; StartingSector : LongInt);
Procedure CDSeekMSF(DevHndl : HFile; MSF : LongInt);
Function CDGetDiskStatus(DevHndl : HFile) : LongInt;
Function CDGetDriver(DevHndl : HFile) : String;
Function CDGetSectorSize(DevHndl : HFile) : Word;
Procedure CDGetHeadLocLBF(DevHndl : HFile; Var LBF : LongInt);
Procedure CDGetHeadLocMSF(DevHndl : HFile; Var MSF : LongInt);
Procedure CDReadLong(DevHndl : HFile; StartSector : LongInt; Var Buf : tReadBlock);
Function CDGetVolumeSize(DevHndl : HFile) : LongInt;
Procedure CDGetUPC(DevHndl : HFile; Var UPC : tUPCStruct);
Function CDSignature : String;
{----------------------------------------------------------------------}
{ CDROM-Audio Functions }
{----------------------------------------------------------------------}
Procedure CDSetChannelCtrl(DevHndl : HFile; Data : tChannelCtrl);
Procedure CDPlayTrackMSF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
Procedure CDPlayTrackLBF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
Procedure CDStopAudio(DevHndl : HFile);
Procedure CDResumeAudio(DevHndl : HFile);
Procedure CDGetChannelCtrl(DevHndl : HFile; Var Data : tChannelCtrl);
Procedure CDGetAudioDisk(DevHndl : HFile; Var Data : tAudioDiskInfo);
Procedure CDGetAudioTrack(DevHndl : HFile; TrackNr : Byte; Var Data : tAudioTrackInfo);
Procedure CDGetSubChannelQ(DevHndl : HFile; Var Data : tSubCnlInfo);
Procedure CDGetAudioStatus(DevHndl : HFile; Var Data : tAudioStatus);
(*--------------------------------------------------------------------*)
(* Implementation *)
(*--------------------------------------------------------------------*)
Implementation
Const
CDROMDISK_CATEGORY = $80;
CDROMDISK_RESETDRIVE = $40;
CDROMDISK_EJECTDISK = $44;
CDROMDISK_CLOSETRAY = $45;
CDROMDISK_LOCKUNLOCKDOOR = $46;
CDROMDISK_SEEK = $50;
CDROMDISK_DEVICESTATUS = $60;
CDROMDISK_GETDRIVER = $61;
CDROMDISK_GETSECTORSIZE = $63;
CDROMDISK_GETHEADLOC = $70;
CDROMDISK_READLONG = $72;
CDROMDISK_GETVOLUMESIZE = $78;
CDROMDISK_GETUPC = $79;
Const
CDROMAUDIO_CATEGORY = $81;
CDROMAUDIO_SETCHANNELCTRL= $40;
CDROMAUDIO_PLAYAUDIO = $50;
CDROMAUDIO_STOPAUDIO = $51;
CDROMAUDIO_RESUMEAUDIO = $52;
CDROMAUDIO_GETCHANNEL = $60;
CDROMAUDIO_GETAUDIODISK = $61;
CDROMAUDIO_GETAUDIOTRACK = $62;
CDROMAUDIO_GETSUBCHANNELQ= $63;
CDROMAUDIO_GETAUDIOSTATUS= $65;
Type
tCDSignature = Array[0..3] Of Char;
Const
CD_Signature : tCDSignature = ('C','D','0','1');
Type
tCommandStrct = Record
Signature : tCDSignature;
Case Byte Of
CDROMDISK_LOCKUNLOCKDOOR : (LockDoor : Byte);
CDROMDISK_SEEK : (SeekAddrMode : Byte;
SeekSector : LongInt);
CDROMDISK_GETHEADLOC : (HdLocAddrMode: Byte);
CDROMDISK_READLONG : (ReadAddrMode : Byte;
NrOfSectors : Word;
StartSector : LongInt;
Reserved : Char;
Interleave : Byte);
CDROMAUDIO_PLAYAUDIO : (PlayAddrMode : Byte;
PlayStartSect: LongInt;
PlayStopSect : LongInt);
CDROMAUDIO_GETAUDIOTRACK : (TrackNbr : Byte);
End;
Type
tRtnDataStrct = Record
Case Byte Of
CDROMDISK_DEVICESTATUS : (DevStatus : LongInt);
CDROMDISK_GETDRIVER : (Signature : Array[0..3] Of Char);
CDROMDISK_GETSECTORSIZE : (SectorSize : Word);
CDROMDISK_GETHEADLOC : (HeadLocation : LongInt);
CDROMDISK_GETVOLUMESIZE : (VolumeSize : LongInt);
CDROMAUDIO_SETCHANNELCTRL: (InputCnl0 : Byte;
VolumeCnl0 : Byte;
InputCnl1 : Byte;
VolumeCnl1 : Byte;
InputCnl2 : Byte;
VolumeCnl2 : Byte;
InputCnl3 : Byte;
VolumeCnl3 : Byte);
End;
{----------------------------------------------------------------------}
{ Utility Functions }
{----------------------------------------------------------------------}
Function CDROMDISK_IoCtl(DevHndl : HFile; Fnct : LongInt;
Var CmdStrct; CmdSize : LongInt;
Var ParmStrct; ParmSize : LongInt) : ApiRet;
Begin
Result := DosDevIOCtl(DevHndl, CDROMDISK_CATEGORY, Fnct,
@CmdStrct, CmdSize, @CmdSize,
@ParmStrct, ParmSize, @ParmSize);
IOCtlResult := Result;
End;
Function CDROMAUDIO_IoCtl(DevHndl : HFile; Fnct : LongInt;
Var CmdStrct; CmdSize : LongInt;
Var ParmStrct; ParmSize : LongInt) : ApiRet;
Begin
Result := DosDevIOCtl(DevHndl, CDROMAUDIO_CATEGORY, Fnct,
@CmdStrct, CmdSize, @CmdSize,
@ParmStrct, ParmSize, @ParmSize);
IOCtlResult := Result;
End;
{----------------------------------------------------------------------}
{ Basic Device-IO Functions }
{----------------------------------------------------------------------}
Function OpenDevice(Drive : Char; ReadOnly : Boolean) : HFile;
Var FName : Array[0..2] Of Char;
Action : LongInt;
Attributes : LongInt;
OpenFlags : LongInt;
OpenMode : LongInt;
EAs : pEAOp2;
DevHndl : HFile;
Begin
FName[0] := Drive;
FName[1] := ':';
FName[2] := #0;
Attributes := File_Normal;
OpenFlags := File_Open Or Open_Action_Open_If_Exists Or Open_Action_Fail_If_New;
If ReadOnly
Then OpenMode := Open_Access_ReadOnly Or Open_Share_DenyNone Or Open_Flags_Dasd
Else OpenMode := Open_Access_ReadWrite Or Open_Share_DenyNone Or Open_Flags_Dasd;
EAs := Nil;
IOCtlResult := DosOpen(@FName, DevHndl, Action, 0, Attributes, OpenFlags, OpenMode, EAs);
If IOCtlResult = 0
Then Result := DevHndl
Else Result := $FFFFFFFF;
End;
Procedure CloseDevice(Var DevHndl : HFile);
Begin
IOCtlResult := DosClose(DevHndl);
If IoCtlResult = 0 Then DevHndl := $FFFFFFFF;
End;
{----------------------------------------------------------------------}
{ CDROM-Disk-Device Functions }
{----------------------------------------------------------------------}
Procedure CDResetDrive(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_RESETDRIVE,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDEjectDisk(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_EJECTDISK,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDCloseTray(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_CLOSETRAY,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDLockDoor(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.LockDoor := $01;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_LOCKUNLOCKDOOR,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDUnlockDoor(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.LockDoor := $00;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_LOCKUNLOCKDOOR,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDSeekSector(DevHndl : HFile; StartingSector : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.SeekAddrMode := $00; // Logical-Block Format
CmdStrct.SeekSector := StartingSector;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_SEEK,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDSeekMSF(DevHndl : HFile; MSF : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.SeekAddrMode := $01; // Minute/Second/Frame Format
CmdStrct.SeekSector := MSF;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_SEEK,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Function CDGetDiskStatus(DevHndl : HFile) : LongInt;
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_DEVICESTATUS,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
Result := ParmStrct.DevStatus;
End;
Function CDGetDriver(DevHndl : HFile) : String;
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETDRIVER,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
Result := ParmStrct.Signature;
End;
Function CDGetSectorSize(DevHndl : HFile) : Word;
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETSECTORSIZE,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
Result := ParmStrct.SectorSize;
End;
Procedure CDGetHeadLocLBF(DevHndl : HFile; Var LBF : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.SeekAddrMode := $00; // Logical-Block Format
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETHEADLOC,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
LBF := ParmStrct.HeadLocation;
End;
Procedure CDGetHeadLocMSF(DevHndl : HFile; Var MSF : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.SeekAddrMode := $01; // Minute/Second/Frame Format
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETHEADLOC,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
MSF := ParmStrct.HeadLocation;
End;
Procedure CDReadLong(DevHndl : HFile; StartSector : LongInt; Var Buf : tReadBlock);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.ReadAddrMode := $00; // Logical-Block Format
CmdStrct.NrOfSectors := 1;
CmdStrct.StartSector := StartSector;
CmdStrct.Reserved := #$00;
CmdStrct.Interleave := $00;
FillChar(Buf, SizeOf(Buf), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_READLONG,
CmdStrct, SizeOf(CmdStrct),
Buf, SizeOf(Buf));
End;
Function CDGetVolumeSize(DevHndl : HFile) : LongInt;
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETVOLUMESIZE,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
Result := ParmStrct.VolumeSize;
End;
Procedure CDGetUPC(DevHndl : HFile; Var UPC : tUPCStruct);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(UPC, SizeOf(UPC), 0);
CDROMDISK_IOCtl(DevHndl, CDROMDISK_GETUPC,
CmdStrct, SizeOf(CmdStrct),
UPC, SizeOf(UPC));
End;
Function CDSignature : String;
Begin
Result := CD_Signature;
End;
{----------------------------------------------------------------------}
{ CDROM-Audio Functions }
{----------------------------------------------------------------------}
Procedure CDSetChannelCtrl(DevHndl : HFile; Data : tChannelCtrl);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
ParmStrct.InputCnl0 := Data.InpCnl[0];
ParmStrct.VolumeCnl0:= Data.Volume[0];
ParmStrct.InputCnl1 := Data.InpCnl[1];
ParmStrct.VolumeCnl1:= Data.Volume[1];
ParmStrct.InputCnl2 := Data.InpCnl[2];
ParmStrct.VolumeCnl2:= Data.Volume[2];
ParmStrct.InputCnl3 := Data.InpCnl[3];
ParmStrct.VolumeCnl3:= Data.Volume[3];
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_SETCHANNELCTRL,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDPlayTrackMSF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.PlayAddrMode := $01; // Minute/Second/Frame Format
CmdStrct.PlayStartSect:= StartTrack;
CmdStrct.PlayStopSect := StopTrack;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_PLAYAUDIO,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDPlayTrackLBF(DevHndl : HFile; StartTrack, StopTrack : LongInt);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.PlayAddrMode := $00; // Logical-Block Format
CmdStrct.PlayStartSect:= StartTrack;
CmdStrct.PlayStopSect := StopTrack;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_PLAYAUDIO,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDStopAudio(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_STOPAUDIO,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDResumeAudio(DevHndl : HFile);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_RESUMEAUDIO,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
End;
Procedure CDGetChannelCtrl(DevHndl : HFile; Var Data : tChannelCtrl);
Var CmdStrct : tCommandStrct;
ParmStrct: tRtnDataStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(ParmStrct, SizeOf(ParmStrct), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETCHANNEL,
CmdStrct, SizeOf(CmdStrct),
ParmStrct, SizeOf(ParmStrct));
If IOCtlResult = NO_ERROR Then
Begin
Data.InpCnl[0] := ParmStrct.InputCnl0;
Data.Volume[0] := ParmStrct.VolumeCnl0;
Data.InpCnl[1] := ParmStrct.InputCnl1;
Data.Volume[1] := ParmStrct.VolumeCnl1;
Data.InpCnl[2] := ParmStrct.InputCnl2;
Data.Volume[2] := ParmStrct.VolumeCnl2;
Data.InpCnl[3] := ParmStrct.InputCnl3;
Data.Volume[3] := ParmStrct.VolumeCnl3;
End;
End;
Procedure CDGetAudioDisk(DevHndl : HFile; Var Data : tAudioDiskInfo);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(Data, SizeOf(Data), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIODISK,
CmdStrct, SizeOf(CmdStrct),
Data, SizeOf(Data));
End;
Procedure CDGetAudioTrack(DevHndl : HFile; TrackNr : Byte; Var Data : tAudioTrackInfo);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
CmdStrct.TrackNbr := TrackNr;
FillChar(Data, SizeOf(Data), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIOTRACK,
CmdStrct, SizeOf(CmdStrct),
Data, SizeOf(Data));
End;
Procedure CDGetSubChannelQ(DevHndl : HFile; Var Data : tSubCnlInfo);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(Data, SizeOf(Data), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETSUBCHANNELQ,
CmdStrct, SizeOf(CmdStrct),
Data, SizeOf(Data));
If IOCtlResult = NO_ERROR Then
Begin
// Convert from BCD to binary format
Data.TrackNr := (Data.TrackNr And $0F) + (Data.TrackNr Shr 4) * 10;
Data.Index := (Data.Index And $0F) + (Data.Index Shr 4) * 10;
End;
End;
Procedure CDGetAudioStatus(DevHndl : HFile; Var Data : tAudioStatus);
Var CmdStrct : tCommandStrct;
Begin
CmdStrct.Signature := CD_Signature;
FillChar(Data, SizeOf(Data), 0);
CDROMAUDIO_IOCtl(DevHndl, CDROMAUDIO_GETAUDIOSTATUS,
CmdStrct, SizeOf(CmdStrct),
Data, SizeOf(Data));
End;
End.