393 lines
12 KiB
ObjectPascal
393 lines
12 KiB
ObjectPascal
(* cd_rom kylix unit
|
|
translated from cdrom.h by andrei borovsky.
|
|
|
|
this unit contains declarations translated
|
|
from the huge cdrom.h header file. In fact
|
|
cdrom.h covers a lot of stuff concerning
|
|
CDs, DVDs, writable CDs, etc. Of all these
|
|
there are only the declarations needed for
|
|
reading/playing CDs in this unit. *)
|
|
(*
|
|
This file is a part of Audio Components Suite v 2.3.
|
|
Copyright (c) 2002-2005 Andrei Borovsky. All rights reserved.
|
|
See the LICENSE file for more details.
|
|
You can contact me at mail@z0m3ie.de
|
|
*)
|
|
|
|
{
|
|
$Log: cd_rom.pas,v $
|
|
Revision 1.3 2005/12/19 18:35:03 z0m3ie
|
|
*** empty log message ***
|
|
|
|
Revision 1.1 2005/09/12 22:04:52 z0m3ie
|
|
modified structure again, fileformats are now in an sperat folder.
|
|
all File In/Out classes are capsulated from TFileIn and TFileOut
|
|
|
|
Revision 1.1 2005/08/25 20:18:00 z0m3ie
|
|
Version 2.4 restructure
|
|
TCDPlayer removed (fits not in component structure)
|
|
TMP3ToWavConverter removed (fits not in component structure)
|
|
|
|
Revision 1.2 2005/08/22 20:17:01 z0m3ie
|
|
changed Headers to log
|
|
changed mail adress
|
|
|
|
}
|
|
|
|
|
|
unit cd_rom;
|
|
|
|
interface
|
|
|
|
uses
|
|
baseunix,unix;
|
|
|
|
type
|
|
__U8 = Byte;
|
|
request_sense = Byte;
|
|
(* request_sense is a bitmask : veeeeeee
|
|
v - valid
|
|
eeeeeee - error code
|
|
*)
|
|
PRequest_sense = ^request_sense;
|
|
|
|
//const
|
|
// EDRIVE_CANT_DO_THIS = EOPNOTSUPP;
|
|
|
|
(*
|
|
The CD-ROM IOCTL commands -- these should be supported by }
|
|
all the various cdrom drivers. For the CD-ROM ioctls, we }
|
|
will commandeer byte 0x53, or 'S'. *)
|
|
|
|
const
|
|
|
|
CDROMPAUSE = $5301; // Pause Audio Operation
|
|
CDROMRESUME = $5302; // Resume paused Audio Operation
|
|
CDROMPLAYMSF = $5303; // Play Audio MSF (struct cdrom_msf)
|
|
CDROMPLAYTRKIND = $5304; // Play Audio Track/index
|
|
CDROMREADTOCHDR = $5305; // Read TOC header
|
|
CDROMREADTOCENTRY = $5306; // Read TOC entry
|
|
CDROMSTOP = $5307; // Stop the cdrom drive
|
|
CDROMSTART = $5308; // Start the cdrom drive
|
|
CDROMEJECT = $5309; // Ejects the cdrom media
|
|
CDROMVOLCTRL = $530a; // Control output volume
|
|
CDROMSUBCHNL = $530b; // Read subchannel data
|
|
CDROMREADMODE2 = $530c; // Read CDROM mode 2 data (2336 Bytes)
|
|
CDROMREADMODE1 = $530d; // Read CDROM mode 1 data (2048 Bytes)
|
|
CDROMREADAUDIO = $530e; // (struct cdrom_read_audio)
|
|
CDROMEJECT_SW = $530; // enable(1)/disable(0) auto-ejecting
|
|
CDROMMULTISESSION = $5310; // Obtain the start-of-last-session
|
|
CDROM_GET_MCN = $5311; // Obtain the "Universal Product Code"
|
|
CDROM_GET_UPC = CDROM_GET_MCN; // depricated
|
|
CDROMRESET = $5312; // hard-reset the drive
|
|
CDROMVOLREAD = $5313; // Get the drive's volume setting
|
|
CDROMREADRAW = $5314; // read data in raw mode (2352 Bytes)
|
|
|
|
{ These ioctls are used only used in aztcd.c and optcd.c }
|
|
|
|
CDROMREADCOOKED = $5315; // read data in cooked mode
|
|
CDROMSEEK = $5316; // seek msf address
|
|
|
|
{ This ioctl is only used by the scsi-cd driver. }
|
|
{ It is for playing audio in logical block addressing mode. }
|
|
|
|
CDROMPLAYBLK = $5317; // (struct cdrom_blk)
|
|
|
|
{ These ioctls are only used in optcd.c }
|
|
|
|
CDROMREADALL = $5318; // read all 2646 bytes
|
|
|
|
(* These ioctls are (now) only in ide-cd.c for controlling
|
|
drive spindown time. They should be implemented in the
|
|
Uniform driver, via generic packet commands, GPCMD_MODE_SELECT_10,
|
|
GPCMD_MODE_SENSE_10 and the GPMODE_POWER_PAGE...
|
|
-Erik *)
|
|
|
|
const
|
|
|
|
CDROMGETSPINDOWN = $531d;
|
|
CDROMSETSPINDOWN = $531e;
|
|
|
|
(* These ioctls are implemented through the uniform CD-ROM driver
|
|
They _will_ be adopted by all CD-ROM drivers, when all the CD-ROM
|
|
drivers are eventually ported to the uniform CD-ROM driver interface. *)
|
|
|
|
const
|
|
|
|
CDROMCLOSETRAY = $5319; // pendant of CDROMEJECT
|
|
CDROM_SET_OPTIONS = $5320; // Set behavior options
|
|
CDROM_CLEAR_OPTIONS = $5321; // Clear behavior options
|
|
CDROM_SELECT_SPEED = $5322; // Set the CD-ROM speed
|
|
CDROM_SELECT_DISC = $5323; // Select disc (for juke-boxes)
|
|
CDROM_MEDIA_CHANGED = $5325; // Check is media changed
|
|
CDROM_DRIVE_STATUS = $5326; // Get tray position, etc.
|
|
CDROM_DISC_STATUS = $5327; // Get disc type, etc.
|
|
CDROM_CHANGER_NSLOTS = $5328; // Get number of slots
|
|
CDROM_LOCKDOOR = $5329; // lock or unlock door
|
|
CDROM_DEBUG = $5330; // Turn debug messages on/off
|
|
CDROM_GET_CAPABILITY = $5331; // get capabilities
|
|
|
|
// This ioctl is only used by sbpcd at the moment
|
|
|
|
CDROMAUDIOBUFSIZ = $5382; // set the audio buffer size
|
|
CDROM_SEND_PACKET = $5393; // send a packet to the drive
|
|
CDROM_NEXT_WRITABLE = $5394; // get next writable block
|
|
CDROM_LAST_WRITTEN = $5395; // get last block written on disc
|
|
|
|
//******************************************************}
|
|
// CDROM IOCTL structures
|
|
//******************************************************}
|
|
|
|
type
|
|
|
|
// Address in MSF format
|
|
cdrom_msf0 = record
|
|
minute: __U8;
|
|
second: __U8;
|
|
frame: __U8;
|
|
end;
|
|
|
|
// Address in either MSF or logical format
|
|
cdrom_addr = record
|
|
case Word of
|
|
1: (msf: cdrom_msf0;);
|
|
2: (lba: Integer;);
|
|
end;
|
|
|
|
|
|
|
|
(* cdrom_msf renamed to cdrom_msf_t since there is
|
|
also a cdrom_msf constant in this unit *)
|
|
|
|
// This struct is used by the CDROMPLAYMSF ioctl
|
|
cdrom_msf_t = record
|
|
cdmsf_min0: __U8; // start minute
|
|
cdmsf_sec0: __U8; // start second
|
|
cdmsf_frame0: __U8; // start frame
|
|
cdmsf_min1: __U8; // end minute
|
|
cdmsf_sec1: __U8; // end second
|
|
cdmsf_frame1: __U8; // end frame
|
|
end;
|
|
|
|
// This struct is used by the CDROMPLAYTRKIND ioctl
|
|
cdrom_ti = record
|
|
cdti_trk0: __U8; // start track
|
|
cdti_ind0: __U8; // start index
|
|
cdti_trk1: __U8; // end track
|
|
cdti_ind1: __U8; // end index
|
|
end;
|
|
|
|
// This struct is used by the CDROMREADTOCHDR ioctl
|
|
cdrom_tochdr = record
|
|
cdth_trk0: __U8; // start track
|
|
cdth_trk1: __U8; // end track
|
|
end;
|
|
|
|
// This struct is used by the CDROMVOLCTRL and CDROMVOLREAD ioctls
|
|
cdrom_volctrl = record
|
|
channel0: __U8;
|
|
channel1: __U8;
|
|
channel2: __U8;
|
|
channel3: __U8;
|
|
end;
|
|
|
|
// This struct is used by the CDROMSUBCHNL ioctl
|
|
cdrom_subchnl = record
|
|
cdsc_format: __U8;
|
|
cdsc_audiostatus: __U8;
|
|
CDSC_ADR_CTRL : __U8; // 4 bits - ADR, 4 bits - CTRL
|
|
cdsc_trk: __U8;
|
|
cdsc_ind: __U8;
|
|
cdsc_absaddr: cdrom_addr;
|
|
cdsc_reladdr: cdrom_addr;
|
|
end;
|
|
|
|
|
|
// This struct is used by the CDROMREADTOCENTRY ioctl
|
|
cdrom_tocentry = record
|
|
cdte_track: __U8;
|
|
cdte_adr_ctrl: __U8;
|
|
cdte_format: __U8;
|
|
cdte_addr: cdrom_addr;
|
|
cdte_datamode: __U8;
|
|
end;
|
|
|
|
// This struct is used by the CDROMREADMODE1, and CDROMREADMODE2 ioctls
|
|
cdrom_read = record
|
|
cdread_lba: Integer;
|
|
cdread_bufaddr: PChar;
|
|
cdread_buflen: Integer;
|
|
end;
|
|
|
|
// This struct is used by the CDROMREADAUDIO ioctl
|
|
cdrom_read_audio = record
|
|
addr: cdrom_addr; // frame address
|
|
addr_format: __U8; // CDROM_LBA or CDROM_MSF
|
|
nframes: Integer; // number of 2352-byte-frames to read at once
|
|
buf: PChar; // frame buffer (size: nframes*2352 bytes)
|
|
end;
|
|
|
|
// This struct is used with the CDROMMULTISESSION ioctl
|
|
cdrom_multisession = record
|
|
addr: cdrom_addr;
|
|
(* frame address: start-of-last-session
|
|
(not the new "frame 16"!). Only valid
|
|
if the "xa_flag" is true. *)
|
|
xa_flag: __U8; // 1: "is XA disk"
|
|
addr_format: __U8; // CDROM_LBA or CDROM_MSF }
|
|
end;
|
|
|
|
(* This struct is used with the CDROM_GET_MCN ioctl.
|
|
Very few audio discs actually have Universal Product Code information,
|
|
which should just be the Medium Catalog Number on the box. Also note
|
|
that the way the codeis written on CD is _not_ uniform across all discs! *)
|
|
|
|
cdrom_mcn = record
|
|
medium_catalog_number: array[0..13] of __U8;
|
|
{ 13 ASCII digits, null-terminated }
|
|
end;
|
|
|
|
// This is used by the CDROMPLAYBLK ioctl
|
|
type
|
|
cdrom_blk = record
|
|
from: Word;
|
|
len: Word;
|
|
end;
|
|
|
|
const
|
|
CDROM_PACKET_SIZE = 12;
|
|
CGC_DATA_UNKNOWN = 0;
|
|
CGC_DATA_WRITE = 1;
|
|
CGC_DATA_READ = 2;
|
|
CGC_DATA_NONE = 3;
|
|
|
|
// for CDROM_PACKET_COMMAND ioctl
|
|
type
|
|
cdrom_generic_command = record
|
|
cmd: array[0..CDROM_PACKET_SIZE-1] of Byte;
|
|
buffer: PByte;
|
|
buflen: Word;
|
|
stat: Integer;
|
|
sense: PREQUEST_SENSE;
|
|
data_direction: Byte;
|
|
quiet: Integer;
|
|
timeout: Integer;
|
|
reserved: array[0..0] of Pointer;
|
|
end;
|
|
|
|
// Some generally useful CD-ROM information -- mostly based on the above
|
|
const
|
|
|
|
CD_MINS = 74; // max. minutes per CD, not really a limit
|
|
CD_SECS = 60; // seconds per minute
|
|
CD_FRAMES = 75; // frames per second
|
|
CD_SYNC_SIZE = 12; // 12 sync bytes per raw data frame
|
|
CD_MSF_OFFSET = 150; // MSF numbering offset of first frame
|
|
CD_CHUNK_SIZE = 24; // lowest-level 'data bytes piece'
|
|
CD_NUM_OF_CHUNKS = 98; // chunks per frame
|
|
CD_FRAMESIZE_SUB = 96; // subchannel data 'frame' size
|
|
CD_HEAD_SIZE = 4; // header (address) bytes per raw data frame
|
|
CD_SUBHEAD_SIZE = 8; // subheader bytes per raw XA data frame
|
|
CD_EDC_SIZE = 4; // bytes EDC per most raw data frame types
|
|
CD_ZERO_SIZE = 8; // bytes zero per yellow book mode 1 frame
|
|
CD_ECC_SIZE = 276; // bytes ECC per most raw data frame types
|
|
CD_FRAMESIZE = 2048; // bytes per frame, 'cooked' mode
|
|
CD_FRAMESIZE_RAW = 2352; // bytes per frame, 'raw' mode
|
|
CD_FRAMESIZE_RAWER = 2646; // The maximum possible returned bytes
|
|
|
|
// most drives don't deliver everything:
|
|
|
|
CD_FRAMESIZE_RAW1 = (CD_FRAMESIZE_RAW-CD_SYNC_SIZE); //2340
|
|
CD_FRAMESIZE_RAW0 = (CD_FRAMESIZE_RAW-CD_SYNC_SIZE-CD_HEAD_SIZE); //2336
|
|
CD_XA_HEAD = (CD_HEAD_SIZE+CD_SUBHEAD_SIZE); // 'before data' part of raw XA frame
|
|
CD_XA_TAIL = (CD_EDC_SIZE+CD_ECC_SIZE); // 'after data' part of raw XA frame
|
|
CD_XA_SYNC_HEAD = (CD_SYNC_SIZE+CD_XA_HEAD); // sync bytes + header of XA frame
|
|
|
|
// CD-ROM address types (cdrom_tocentry.cdte_format)
|
|
|
|
CDROM_LBA = $01; // 'logical block': first frame is #0
|
|
CDROM_MSF = $02; // 'minute-second-frame': binary, not bcd here!
|
|
|
|
// bit to tell whether track is data or audio (cdrom_tocentry.cdte_ctrl)
|
|
|
|
CDROM_DATA_TRACK = $40;
|
|
|
|
// The leadout track is always 0xAA, regardless of # of tracks on disc
|
|
|
|
CDROM_LEADOUT = $AA;
|
|
|
|
// audio states (from SCSI-2, but seen with other drives, too)
|
|
|
|
CDROM_AUDIO_INVALID = $00; // audio status not supported
|
|
CDROM_AUDIO_PLAY = $11; // audio play operation in progress
|
|
CDROM_AUDIO_PAUSED = $12; // audio play operation paused
|
|
CDROM_AUDIO_COMPLETED = $13; // audio play successfully completed
|
|
CDROM_AUDIO_ERROR = $14; // audio play stopped due to error
|
|
CDROM_AUDIO_NO_STATUS = $15; // no current audio status to return
|
|
|
|
// capability flags used with the uniform CD-ROM driver
|
|
|
|
CDC_CLOSE_TRAY = $1; // caddy systems _can't_ close
|
|
CDC_OPEN_TRAY = $2; // but _can_ eject.
|
|
CDC_LOCK = $4; // disable manual eject
|
|
CDC_SELECT_SPEED = $8; // programmable speed
|
|
CDC_SELECT_DISC = $10; // select disc from juke-box
|
|
CDC_MULTI_SESSION = $20; // read sessions>1
|
|
CDC_MCN = $40; // Medium Catalog Number
|
|
CDC_MEDIA_CHANGED = $80; // media changed
|
|
CDC_PLAY_AUDIO = $100; // audio functions
|
|
CDC_RESET = $200; // hard reset device
|
|
CDC_IOCTLS = $400; // driver has non-standard ioctls
|
|
CDC_DRIVE_STATUS = $800; // driver implements drive status
|
|
CDC_GENERIC_PACKET = $1000; // driver implements generic packets
|
|
CDC_CD_R = $2000; // drive is a CD-R
|
|
CDC_CD_RW = $4000; // drive is a CD-RW
|
|
CDC_DVD = $8000; // drive is a DVD
|
|
CDC_DVD_R = $10000; // drive can write DVD-R
|
|
CDC_DVD_RAM = $20000; // drive can write DVD-RAM
|
|
|
|
// drive status possibilities returned by CDROM_DRIVE_STATUS ioctl
|
|
|
|
CDS_NO_INFO = 0; // if not implemented
|
|
CDS_NO_DISC = 1;
|
|
CDS_TRAY_OPEN = 2;
|
|
CDS_DRIVE_NOT_READY = 3;
|
|
CDS_DISC_OK = 4;
|
|
|
|
(* return values for the CDROM_DISC_STATUS ioctl
|
|
can also return CDS_NO_[INFO|DISC], from above *)
|
|
|
|
CDS_AUDIO = 100;
|
|
CDS_DATA_1 = 101;
|
|
CDS_DATA_2 = 102;
|
|
CDS_XA_2_1 = 103;
|
|
CDS_XA_2_2 = 104;
|
|
CDS_MIXED = 105;
|
|
|
|
// User-configurable behavior options for the uniform CD-ROM driver
|
|
|
|
CDO_AUTO_CLOSE = $1; // close tray on first open()
|
|
CDO_AUTO_EJECT = $2; // open tray on last release()
|
|
CDO_USE_FFLAGS = $4; // use O_NONBLOCK information on open
|
|
CDO_LOCK = $8; // lock tray on open files
|
|
CDO_CHECK_TYPE = $10; // check type on open for data
|
|
|
|
// Special codes used when specifying changer slots.
|
|
|
|
CDSL_NONE = $7FFFFFFE;
|
|
CDSL_CURRENT = $7FFFFFFF;
|
|
|
|
(* For partition based multisession access. IDE can handle 64 partitions
|
|
per drive - SCSI CD-ROM's use minors to differentiate between the
|
|
various drives, so we can't do multisessions the same way there.
|
|
Use the -o session=x option to mount on them. *)
|
|
|
|
CD_PART_MAX = 64;
|
|
CD_PART_MASK = (CD_PART_MAX - 1);
|
|
|
|
|
|
|
|
implementation
|
|
|
|
end.
|