684 lines
15 KiB
C
684 lines
15 KiB
C
/*++
|
|
|
|
Copyright (C) Microsoft Corporation, 1992 - 1999
|
|
|
|
--*/
|
|
|
|
#if DBG
|
|
|
|
//
|
|
// CdAudio debug level global variable
|
|
//
|
|
|
|
ULONG CdAudioDebug = 0;
|
|
|
|
//
|
|
// Remap CdDump to local routine
|
|
//
|
|
|
|
#define CdDump(X) CdAudioDebugPrint X
|
|
|
|
VOID
|
|
CdAudioDebugPrint(
|
|
ULONG DebugPrintLevel,
|
|
PCCHAR DebugMessage,
|
|
...
|
|
);
|
|
|
|
#else
|
|
|
|
#define CdDump(X)
|
|
|
|
#endif // DBG
|
|
|
|
#define CDAUDIO_NOT_ACTIVE 0
|
|
#define CDAUDIO_ATAPI 1
|
|
#define CDAUDIO_CDS535 2
|
|
#define CDAUDIO_CDS435 3
|
|
#define CDAUDIO_DENON 4
|
|
#define CDAUDIO_FUJITSU 5
|
|
#define CDAUDIO_HITACHI 6
|
|
#define CDAUDIO_HPCDR 7
|
|
#define CDAUDIO_NEC 8
|
|
#define CDAUDIO_PIONEER 9
|
|
#define CDAUDIO_PIONEER624 10
|
|
#define CDAUDIO_MAX_ACTIVE 10
|
|
//
|
|
// Registry values...
|
|
//
|
|
#define CDAUDIO_SEARCH_ACTIVE 0xFF
|
|
#define CDAUDIO_ACTIVE_KEY_NAME (L"MapType")
|
|
|
|
#define CDAUDIO_NOT_PAUSED 0
|
|
#define CDAUDIO_PAUSED 1
|
|
|
|
//
|
|
// Device Extension
|
|
//
|
|
|
|
typedef struct _CD_DEVICE_EXTENSION {
|
|
|
|
//
|
|
// Target Device Object
|
|
//
|
|
|
|
PDEVICE_OBJECT TargetDeviceObject;
|
|
|
|
//
|
|
// Physical Device Object
|
|
//
|
|
PDEVICE_OBJECT TargetPdo;
|
|
|
|
//
|
|
// Back pointer to device object
|
|
//
|
|
|
|
PDEVICE_OBJECT DeviceObject;
|
|
|
|
//
|
|
// paging path count
|
|
//
|
|
|
|
ULONG PagingPathCount;
|
|
KEVENT PagingPathCountEvent;
|
|
|
|
//
|
|
// A timer, DPC, and simple
|
|
// synchronization to assert
|
|
// on if non-serialized.
|
|
//
|
|
PRKDPC Dpc;
|
|
PKTIMER Timer;
|
|
LONG Sync;
|
|
|
|
//
|
|
// CdAudio active for this drive
|
|
//
|
|
|
|
UCHAR Active;
|
|
|
|
//
|
|
// For drives that don't support
|
|
// PAUSE/RESUME (Denon), a flag
|
|
// to signify when the drive is
|
|
// paused.
|
|
//
|
|
|
|
UCHAR Paused;
|
|
|
|
//
|
|
// For drives that don't support
|
|
// PAUSE/RESUME (Denon), this is the
|
|
// current position on the disc when
|
|
// a pause was last executed. This is
|
|
// stored in either BCD or binary,
|
|
// depending on the drive.
|
|
//
|
|
|
|
UCHAR PausedM;
|
|
UCHAR PausedS;
|
|
UCHAR PausedF;
|
|
|
|
//
|
|
// For drives that don't support
|
|
// PAUSE/RESUME (Denon), this is the
|
|
// last "ending" position on the disc when
|
|
// a play was last executed. This is
|
|
// stored in BCD or binary, depending on
|
|
// the drive.
|
|
//
|
|
|
|
UCHAR LastEndM;
|
|
UCHAR LastEndS;
|
|
UCHAR LastEndF;
|
|
|
|
//
|
|
// Indicates the CD is currently playing music.
|
|
//
|
|
|
|
BOOLEAN PlayActive;
|
|
|
|
} CD_DEVICE_EXTENSION, *PCD_DEVICE_EXTENSION;
|
|
|
|
#define AUDIO_TIMEOUT 10
|
|
#define CD_DEVICE_EXTENSION_SIZE sizeof(CD_DEVICE_EXTENSION)
|
|
#define MAXIMUM_RETRIES 4
|
|
|
|
//
|
|
// Convert BCD character to decimal equivalent
|
|
//
|
|
|
|
#define BCD_TO_DEC(x) ((((x & 0xF0)>>4)*10) + (x & 0x0F))
|
|
#define DEC_TO_BCD(x) (((x / 10) << 4) + (x % 10))
|
|
|
|
//
|
|
// Defines for NEC CDR cdrom drives
|
|
//
|
|
|
|
#define NEC_READ_TOC_CODE 0xDE
|
|
#define NEC_AUDIO_TRACK_SEARCH_CODE 0xD8
|
|
#define NEC_PLAY_AUDIO_CODE 0xD9
|
|
#define NEC_STILL_CODE 0xDA
|
|
#define NEC_EJECT_CODE 0xDC
|
|
#define NEC_READ_SUB_Q_CHANNEL_CODE 0xDD
|
|
#define NEC_Q_CHANNEL_TRANSFER_SIZE 10
|
|
|
|
#define NEC_ENTER_PLAY_MODE 0x01
|
|
#define NEC_TYPE_LOGICAL 0x00
|
|
#define NEC_TYPE_ATIME 0x40
|
|
#define NEC_TYPE_TRACK_NUMBER 0x80
|
|
#define NEC_TYPE_NO_CHANGE 0xC0
|
|
#define NEC_PLAY_STEREO 0x03
|
|
#define NEC_TRANSFER_WHOLE_TOC 0x03
|
|
#define NEC_TOC_TYPE_DISK 0xA0
|
|
#define NEC_TOC_TYPE_SESSION 0xB0
|
|
|
|
//
|
|
// The NEC cdrom TOC size is:
|
|
// 2 bytes for size
|
|
// 10 bytes first track data
|
|
// 10 bytes last track data
|
|
// 10 bytes total disk data
|
|
// 10 bytes per track 99 track maximum.
|
|
//
|
|
|
|
#define NEC_CDROM_TOC_SIZE 1022
|
|
|
|
//
|
|
// NEC SENSE CODES
|
|
//
|
|
|
|
#define NEC_SCSI_ERROR_NO_DISC 0x0B
|
|
#define NEC_SCSI_ERROR_ILLEGAL_DISC 0x0C
|
|
#define NEC_SCSI_ERROR_TRAY_OPEN 0x0D
|
|
#define NEC_SCSI_ERROR_SEEK_ERROR 0x15
|
|
#define NEC_SCSI_ERROR_MUSIC_AREA 0x1D
|
|
#define NEC_SCSI_ERROR_DATA_AREA 0x1C
|
|
#define NEC_SCSI_ERROR_PARITY_ERROR 0x30
|
|
#define NEC_SCSI_ERROR_INVALID_COMMAND 0x20
|
|
#define NEC_SCSI_ERROR_INVALID_ADDRESS 0x21
|
|
#define NEC_SCSI_ERROR_INVALID_PARAMETER 0x22
|
|
#define NEC_SCSI_ERROR_INVALID_CMD_SEQUENCE 0x24
|
|
#define NEC_SCSI_ERROR_END_OF_VOLUME 0x25
|
|
#define NEC_SCSI_ERROR_MEDIA_CHANGED 0x28
|
|
#define NEC_SCSI_ERROR_DEVICE_RESET 0x29
|
|
|
|
//
|
|
// NEC 10-byte cdb definitions.
|
|
//
|
|
|
|
typedef union _NEC_CDB {
|
|
|
|
//
|
|
// NEC Read TOC CDB
|
|
//
|
|
|
|
struct _NEC_READ_TOC {
|
|
UCHAR OperationCode;
|
|
UCHAR Type : 2;
|
|
UCHAR Reserved1 : 6;
|
|
UCHAR TrackNumber;
|
|
UCHAR Reserved2[6];
|
|
UCHAR Control;
|
|
} NEC_READ_TOC, *PNEC_READ_TOC;
|
|
|
|
//
|
|
// NEC Play CDB
|
|
//
|
|
|
|
struct _NEC_PLAY_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR PlayMode : 3;
|
|
UCHAR Reserved1 : 5;
|
|
UCHAR Minute;
|
|
UCHAR Second;
|
|
UCHAR Frame;
|
|
UCHAR Reserved2[4];
|
|
UCHAR Control;
|
|
} NEC_PLAY_AUDIO, *PNEC_PLAY_AUDIO;
|
|
|
|
//
|
|
// NEC Seek Audio
|
|
//
|
|
|
|
struct _NEC_SEEK_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR Play : 1;
|
|
UCHAR Reserved1 : 7;
|
|
UCHAR Minute;
|
|
UCHAR Second;
|
|
UCHAR Frame;
|
|
UCHAR Reserved2[4];
|
|
UCHAR Control;
|
|
} NEC_SEEK_AUDIO, *PNEC_SEEK_AUDIO;
|
|
|
|
//
|
|
// NEC Pause Audio
|
|
//
|
|
|
|
struct _NEC_PAUSE_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1[8];
|
|
UCHAR Control;
|
|
} NEC_PAUSE_AUDIO, *PNEC_PAUSE_AUDIO;
|
|
|
|
//
|
|
// NEC Read Q Channel
|
|
//
|
|
|
|
struct _NEC_READ_Q_CHANNEL {
|
|
UCHAR OperationCode;
|
|
UCHAR TransferSize : 5;
|
|
UCHAR Reserved1 : 3;
|
|
UCHAR Reserved2[7];
|
|
UCHAR Control;
|
|
} NEC_READ_Q_CHANNEL, *PNEC_READ_Q_CHANNEL;
|
|
|
|
//
|
|
// NEC Eject Disc
|
|
//
|
|
|
|
struct _NEC_EJECT {
|
|
UCHAR OperationCode;
|
|
UCHAR Immediate : 1;
|
|
UCHAR Reserved1 : 7;
|
|
UCHAR Reserved2[7];
|
|
UCHAR Control;
|
|
} NEC_EJECT, *PNEC_EJECT;
|
|
|
|
} NEC_CDB, *PNEC_CDB;
|
|
|
|
//
|
|
// Defines for PIONEER DRM-600
|
|
//
|
|
|
|
#define PIONEER_REZERO_UNIT_CODE 0x01
|
|
#define PIONEER_EJECT_CODE 0xC0
|
|
#define PIONEER_READ_TOC_CODE 0xC1
|
|
#define PIONEER_READ_SUB_Q_CHANNEL_CODE 0xC2
|
|
#define PIONEER_Q_CHANNEL_TRANSFER_SIZE 9
|
|
#define PIONEER_AUDIO_STATUS_TRANSFER_SIZE 6
|
|
#define PIONEER_AUDIO_TRACK_SEARCH_CODE 0xC8
|
|
#define PIONEER_PLAY_AUDIO_CODE 0xC9
|
|
#define PIONEER_PAUSE_CODE 0xCA
|
|
#define PIONEER_AUDIO_STATUS_CODE 0xCC
|
|
#define PIONEER_READ_STATUS_CODE 0xE0
|
|
|
|
|
|
#define PIONEER_READ_FIRST_AND_LAST 0x00
|
|
#define PIONEER_READ_TRACK_INFO 0x02
|
|
#define PIONEER_READ_LEAD_OUT_INFO 0x01
|
|
#define PIONEER_TRANSFER_SIZE 0x04
|
|
#define PIONEER_TYPE_ATIME 0x01
|
|
#define PIONEER_STOP_ADDRESS 0x10
|
|
|
|
//
|
|
// Page codes for the READ_STATUS command.
|
|
//
|
|
|
|
#define PIONEER_PC_DRIVE_STATUS 0x01
|
|
#define PIONEER_PC_AUDIO_STATUS 0x02
|
|
|
|
typedef struct _PIONEER_DRIVE_STATUS_BUFFER {
|
|
UCHAR PageCode : 6;
|
|
UCHAR Reserved : 2;
|
|
UCHAR PageLengthMsb;
|
|
UCHAR PageLengthLsb;
|
|
UCHAR DriveStatusLsb;
|
|
UCHAR DriveStatusMsb;
|
|
} PIONEER_DRIVE_STATUS_BUFFER, *PPIONEER_DRIVE_STATUS_BUFFER;
|
|
|
|
#define PIONEER_DISC_PRESENT 0x08
|
|
|
|
//
|
|
// Pioneer cdb definitions.
|
|
//
|
|
|
|
typedef union _PIONEER_CDB {
|
|
|
|
|
|
//
|
|
// Pioneer Start/Stop Unit
|
|
//
|
|
|
|
struct _PNR_START_STOP {
|
|
UCHAR OperationCode;
|
|
UCHAR Immediate : 1;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved2 : 7;
|
|
UCHAR PCF : 1;
|
|
UCHAR Reserved3;
|
|
UCHAR Start : 1;
|
|
UCHAR Eject : 1;
|
|
UCHAR Reserved4 : 6;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved5 : 4;
|
|
UCHAR Vendor : 2;
|
|
} PNR_START_STOP, *PPNR_START_STOP;
|
|
|
|
//
|
|
// Pioneer Read TOC CDB
|
|
//
|
|
|
|
struct _PNR_READ_TOC {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 5;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved2[3];
|
|
UCHAR TrackNumber;
|
|
UCHAR Reserved3;
|
|
UCHAR AssignedLength[2];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved4 : 4;
|
|
UCHAR Type : 2;
|
|
} PNR_READ_TOC, *PPNR_READ_TOC;
|
|
|
|
//
|
|
// Pioneer Play CDB
|
|
//
|
|
|
|
struct _PNR_PLAY_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR PlayMode : 4;
|
|
UCHAR StopAddr : 1;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved1;
|
|
UCHAR Minute;
|
|
UCHAR Second;
|
|
UCHAR Frame;
|
|
UCHAR Reserved2[3];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR Type : 2;
|
|
} PNR_PLAY_AUDIO, *PPNR_PLAY_AUDIO;
|
|
|
|
//
|
|
// Pioneer Seek Audio
|
|
//
|
|
|
|
struct _PNR_SEEK_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR PlayMode : 4;
|
|
UCHAR PlayBack : 1;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved1;
|
|
UCHAR Minute;
|
|
UCHAR Second;
|
|
UCHAR Frame;
|
|
UCHAR Reserved2[3];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR Type : 2;
|
|
} PNR_SEEK_AUDIO, *PPNR_SEEK_AUDIO;
|
|
|
|
//
|
|
// Pioneer Pause Audio
|
|
//
|
|
|
|
struct _PNR_PAUSE_AUDIO {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Pause : 1;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved2[7];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR Reserved4 : 2;
|
|
} PNR_PAUSE_AUDIO, *PPNR_PAUSE_AUDIO;
|
|
|
|
//
|
|
// Pioneer Audio Status
|
|
//
|
|
|
|
struct _PNR_AUDIO_STATUS {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Reserved2 : 1;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved3[6];
|
|
UCHAR AssignedLength;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved4 : 4;
|
|
UCHAR Reserved5 : 2;
|
|
} PNR_AUDIO_STATUS, *PPNR_AUDIO_STATUS;
|
|
|
|
//
|
|
// Pioneer Read Q Channel
|
|
//
|
|
|
|
struct _PNR_READ_Q_CHANNEL {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Reserved2 : 1;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved3[6];
|
|
UCHAR AssignedLength;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved4 : 4;
|
|
UCHAR Reserved5 : 2;
|
|
} PNR_READ_Q_CHANNEL, *PPNR_READ_Q_CHANNEL;
|
|
|
|
//
|
|
// Pioneer Eject Disc
|
|
//
|
|
|
|
struct _PNR_EJECT {
|
|
UCHAR OperationCode;
|
|
UCHAR Immediate : 1;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved2[7];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved4 : 4;
|
|
UCHAR Reserved5 : 2;
|
|
} PNR_EJECT, *PPNR_EJECT;
|
|
|
|
struct _PNR_READ_STATUS {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved1 : 4;
|
|
UCHAR Lun : 3;
|
|
UCHAR PageCode : 5;
|
|
UCHAR PCField : 1;
|
|
UCHAR Reserved2[5];
|
|
UCHAR AllocationLengthMsb;
|
|
UCHAR AllocationLengthLsb;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR Reserved4 : 2;
|
|
} PNR_READ_STATUS, *PPNR_READ_STATUS;
|
|
|
|
} PNR_CDB, *PPNR_CDB;
|
|
|
|
|
|
//
|
|
// Defines for DENON DRD-253
|
|
//
|
|
|
|
#define DENON_READ_TOC_CODE 0xE9
|
|
#define DENON_EJECT_CODE 0xE6
|
|
#define DENON_PLAY_AUDIO_EXTENDED_CODE 0x22
|
|
#define DENON_STOP_AUDIO_CODE 0xE7
|
|
#define DENON_READ_SUB_Q_CHANNEL_CODE 0xEB
|
|
|
|
//
|
|
// Defines for HITACHI 1750s
|
|
//
|
|
|
|
#define HITACHI_READ_TOC_CODE 0xE8
|
|
#define HITACHI_EJECT_CODE 0xE4
|
|
#define HITACHI_PLAY_AUDIO_MSF_CODE 0xE0
|
|
#define HITACHI_PAUSE_AUDIO_CODE 0xE1
|
|
#define HITACHI_READ_SUB_Q_CHANNEL_CODE 0xE5
|
|
|
|
//
|
|
// 12 byte cdbs for Hitachi and Atapi
|
|
//
|
|
|
|
|
|
typedef union _HITACHICDB {
|
|
|
|
//
|
|
// Disc Information
|
|
//
|
|
|
|
struct _READ_DISC_INFO {
|
|
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved : 5;
|
|
UCHAR LogicalUnitNumber : 3;
|
|
UCHAR Reserved1[7];
|
|
UCHAR AllocationLength[2];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved2 : 4;
|
|
UCHAR VendorUniqueBits : 2;
|
|
|
|
} READ_DISC_INFO, *PREAD_DISC_INFO;
|
|
|
|
//
|
|
// Play Audio
|
|
//
|
|
|
|
struct {
|
|
|
|
UCHAR OperationCode;
|
|
UCHAR Immediate : 1;
|
|
UCHAR Right : 1;
|
|
UCHAR Left : 1;
|
|
UCHAR Reserved : 2;
|
|
UCHAR Lun : 3;
|
|
UCHAR StartingM;
|
|
UCHAR StartingS;
|
|
UCHAR StartingF;
|
|
UCHAR Reserved1[2];
|
|
UCHAR EndingM;
|
|
UCHAR EndingS;
|
|
UCHAR EndingF;
|
|
UCHAR Reserved2;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR VendorUniqueBits : 2;
|
|
|
|
} PLAY_AUDIO, *PPLAY_AUDIO;
|
|
|
|
//
|
|
// Pause Audio
|
|
//
|
|
|
|
struct _PAUSE {
|
|
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved : 5;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved1[9];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved2 : 4;
|
|
UCHAR VendorUnqiueBits : 2;
|
|
|
|
} PAUSE_AUDIO, *PPAUSE_AUDIO;
|
|
|
|
//
|
|
// Eject media
|
|
//
|
|
|
|
struct _EJECT {
|
|
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved : 5;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved1[8];
|
|
UCHAR Eject : 1;
|
|
UCHAR Mode : 1;
|
|
UCHAR Reserved2 : 6;
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved3 : 4;
|
|
UCHAR VendorUnqiueBits : 2;
|
|
|
|
} EJECT, *PEJECT;
|
|
|
|
//
|
|
// Audio Status
|
|
//
|
|
|
|
struct _AUDIO_STATUS {
|
|
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved : 5;
|
|
UCHAR Lun : 3;
|
|
UCHAR Reserved1[9];
|
|
UCHAR Link : 1;
|
|
UCHAR Flag : 1;
|
|
UCHAR Reserved2 : 4;
|
|
UCHAR VendorUnqiueBits : 2;
|
|
|
|
} AUDIO_STATUS, *PAUDIO_STATUS;
|
|
|
|
//
|
|
// Stop play
|
|
//
|
|
|
|
struct _STOP_PLAY {
|
|
UCHAR OperationCode;
|
|
UCHAR Reserved[11];
|
|
} STOP_PLAY, *PSTOP_PLAY;
|
|
|
|
} HITACHICDB, *PHITACHICDB;
|
|
|
|
//
|
|
// Defines for Chinon CDS-535 CDROM Drive
|
|
//
|
|
|
|
#define CDS535_READ_TOC_CODE 0x43
|
|
#define CDS535_EJECT_CODE 0xC0
|
|
#define CDS535_READ_SUB_Q_CHANNEL_CODE 0x42
|
|
#define CDS535_STOP_AUDIO 0xC6
|
|
#define CDS535_GET_LAST_SESSION 0x26
|
|
|
|
//
|
|
// Defines for Chinon CDS-435 CDROM Drive
|
|
//
|
|
|
|
#define CDS435_READ_TOC_CODE 0x43
|
|
#define CDS435_EJECT_CODE 0xC0
|
|
#define CDS435_STOP_AUDIO_CODE 0xC6
|
|
#define CDS435_PLAY_AUDIO_EXTENDED_CODE 0x47
|
|
#define CDS435_READ_SUB_Q_CHANNEL_CODE 0x42
|
|
|
|
//
|
|
// Define for Fujitsu CDROM device.
|
|
//
|
|
|
|
#define FUJITSU_READ_TOC_CODE 0xE3
|
|
|
|
|
|
//
|
|
// Algebraically equal to:
|
|
// 75*60*Minutes +
|
|
// 75*Seconds +
|
|
// Frames - 150
|
|
//
|
|
#define MSF_TO_LBA(Minutes,Seconds,Frames) \
|
|
(ULONG)(75 * ((60 * (Minutes)) + (Seconds)) + (Frames) - 150)
|
|
|
|
|
|
#define LBA_TO_MSF(Lba,Minutes,Seconds,Frames) \
|
|
{ \
|
|
(Minutes) = (UCHAR)( (Lba) / (60 * 75) ); \
|
|
(Seconds) = (UCHAR)(((Lba) % (60 * 75)) / 75); \
|
|
(Frames) = (UCHAR)(((Lba) % (60 * 75)) % 75); \
|
|
}
|
|
|