1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
This directory contains some CD-ROM support routines for Free Pascal.
The routines are demonstrated by the 'getdiscid' and 'showcds' programs.
The latter shows the available CD-rom drives on the system, the former
calculates a disc-id and query for use with a freecddb server.
Unit cdrom
----------
The unit 'cdrom' implements a cross-platform interface for handling CD-roms.
Currently, it is implemented for Linux and Windows only.
The other units are support units, needed by various implementations.
The unit presents 2 calls:
Type
TTocEntry = Record
min, sec, frame : Integer
end;
PTocEntry = ^TTocEntry;
Function GetCDRomDevices(Var Devices : Array of string) : Integer;
Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer;
The GetCDRomDevices call retrieves a list of available CD-ROM devices/drives
on the system. The algorithm used to detect these devices depends on the
system. The function returns the number of devices found, or a negative
number on error. The 'Devices' array is filled with strings that describe
the devices. For unix like systems, these are the device files (/dev/hdc
etc), for windows, these can be drive letters (D: etc) or ASPI Adaptor,
Target, lun IDs triples, for example ASPI[1;0;0].
(an algorithm mapping these to drive letters would be appreciated)
The ReadCDTOC call retrieves the table of contents of a CD in the CD-rom
drive (Device) This returns the number of tracks on the CD-ROM. On return,
The CDTOC array will be filled with the length of the tracks, and the frame
number, manipulated to be usable in a disc ID calculation. There will be one
extra entry at the end of the array, describing the lead-out.
unit discid
-----------
The DISCID unit calculates a DISC-ID as needed by a freecddb server to
query for the contents of a disc.
Function CDDBDiscID(Const CDTOC : Array of TTocEntry; Count : Integer) : integer ;
The count is the number of tracks, the array should contain Count+1
elements, the last one being the lead out. The output of the ReadCDToc
function can be used as input for this function.
Function GetCDDBQueryString(Const Tracks : Array of TTocEntry; Count : Integer) : String;
This function returns a query string as expected by a freecddb server.
It consists of the disc id, number of tracks, and the frame fields of the
TCDToc records in the tracks array.
unit lincd
----------
Essentially translation of the linux/cdrom.h include file, plus 2 functions
Function IsCDDevice(Device : String) : Boolean;
Returns True if the device file is a cdrom.
Function DetectCd : String;
Detects the first cd in the system; it does this by checking a number of
well-known common device files; the first once for which IsCDDevice returns
True is returned. Note that this can take some time.
unit major
----------
Definitions of the major device numbers under linux. used by the lincd unit.
unit wincd
----------
Some CD-routines. Essentially the low-level counterpart of the cd-rom unit.
The unit tries to use the windows ASPI layer to detect cd-roms. If the layer
is not present, the common IOCTL or SPTI interfaces are used.
TCDAccessMethod = (camNone,camASPI,camSPTI,camIOCTL);
Determines which access method is used.
Records used in the low-level calls:
TTOCTrack = packed record
rsvd,
ADR,
trackNumber,
rsvd2 : Byte;
addr : Array[0..3] of byte;
end;
TTOC = packed Record
toclen : word;
firsttrack,
lastTrack : byte;
toctrack: Array[0..99] of TTocTrack;
end;
Const
AccessMethodNames : Array[TCDAccessMethod] of string
= ('None','ASPI','SPTI','IOCTL');
Function GetCDAccessMethod : TCDAccessMethod;
Returns the current CD-rom detection method.
Procedure SetCDAccessMethod (Value : TCDAccessMethod);
Sets the current CD-rom detection method.
Function ReadTOC(Device : String; Var TOC : TTOc) : Integer;
Reads the CD-Rom devices. Device is a drive letter, or if ASPI is used
a string of the form [Aid,TgID,LunID] (Adapter ID, Target ID, LUN id)
Function EnumCDDrives(Var Drives : Array of String) : Integer;
Returns the CD-ROM drive letters of the system, or strings describing ASPI
drives.
Function GetNumDrives : Integer;
Returns the number of drives.
NOTE: A function mapping an ASPI triple to a drive letter would be
appreciated.
unit Wnaspi32:
--------------
Low-level ASPI unit. Contains all structures, plus the following:
TSendASPI32Command = function( LPSRB : Pointer ) : DWORD; cdecl;
TGetASPI32SupportInfo = function : DWORD; cdecl;
SendASPI32Command : TSendASPI32Command = nil;
GetASPI32SupportInfo : TGetASPI32SupportInfo = nil;
These procedural variables map to the actual API calls. They are only valid
and usable if ASPILoaded returns TRUE.
Function ASPILoaded : Boolean;
Returns TRUE if ASPI is available and loaded.
Procedure CheckASPI;
Checks whether ASPI is available. After calling this it is possible to use
the ASPIAvailable function. This procedure is called in the initialization
section of the unit.
procedure UnloadASPI;
Unloads the ASPI library if it was loaded. This procedure is called in the
finalization section of the unit.
scsidefs.pp
-----------
Bare translation of the scsidefs.h windows SDK header.
cdromioctl.pp
-------------
This unit contains some records and constants defined in window's
cdromioctl.h
Michael.
|