Blame dao/CdrDriver.h

Packit Service 3e823c
/*  cdrdao - write audio CD-Rs in disc-at-once mode
Packit Service 3e823c
 *
Packit Service 3e823c
 *  Copyright (C) 1998-2002  Andreas Mueller <andreas@daneb.de>
Packit Service 3e823c
 *
Packit Service 3e823c
 *  This program is free software; you can redistribute it and/or modify
Packit Service 3e823c
 *  it under the terms of the GNU General Public License as published by
Packit Service 3e823c
 *  the Free Software Foundation; either version 2 of the License, or
Packit Service 3e823c
 *  (at your option) any later version.
Packit Service 3e823c
 *
Packit Service 3e823c
 *  This program is distributed in the hope that it will be useful,
Packit Service 3e823c
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 3e823c
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 3e823c
 *  GNU General Public License for more details.
Packit Service 3e823c
 *
Packit Service 3e823c
 *  You should have received a copy of the GNU General Public License
Packit Service 3e823c
 *  along with this program; if not, write to the Free Software
Packit Service 3e823c
 *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Packit Service 3e823c
 */
Packit Service 3e823c
Packit Service 3e823c
#ifndef __CDRDRIVER_H__
Packit Service 3e823c
#define __CDRDRIVER_H__
Packit Service 3e823c
Packit Service 3e823c
#include "ScsiIf.h"
Packit Service 3e823c
#include "Msf.h"
Packit Service 3e823c
#include "TrackData.h"
Packit Service 3e823c
#include "SubChannel.h"
Packit Service 3e823c
#include "remote.h"
Packit Service 3e823c
Packit Service 3e823c
class Toc;
Packit Service 3e823c
class Track;
Packit Service 3e823c
Packit Service 3e823c
#define OPT_DRV_GET_TOC_GENERIC   0x00010000
Packit Service 3e823c
#define OPT_DRV_SWAP_READ_SAMPLES 0x00020000
Packit Service 3e823c
#define OPT_DRV_NO_PREGAP_READ    0x00040000
Packit Service 3e823c
#define OPT_DRV_RAW_TOC_BCD       0x00080000
Packit Service 3e823c
#define OPT_DRV_RAW_TOC_HEX       0x00100000
Packit Service 3e823c
#define OPT_DRV_NO_CDTEXT_READ    0x00200000
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
// reading capabilities
Packit Service 3e823c
#define CDR_READ_CAP_AUDIO_PW_RAW    0x001
Packit Service 3e823c
#define CDR_READ_CAP_AUDIO_RW_COOKED 0x002
Packit Service 3e823c
#define CDR_READ_CAP_AUDIO_RW_RAW    0x004
Packit Service 3e823c
#define CDR_READ_CAP_AUDIO_PQ_BCD    0x008
Packit Service 3e823c
#define CDR_READ_CAP_AUDIO_PQ_HEX    0x010
Packit Service 3e823c
#define CDR_READ_CAP_DATA_PW_RAW     0x020
Packit Service 3e823c
#define CDR_READ_CAP_DATA_RW_COOKED  0x040
Packit Service 3e823c
#define CDR_READ_CAP_DATA_RW_RAW     0x080
Packit Service 3e823c
#define CDR_READ_CAP_DATA_PQ_BCD     0x100
Packit Service 3e823c
#define CDR_READ_CAP_DATA_PQ_HEX     0x200
Packit Service 3e823c
Packit Service 3e823c
#define CDR_AUDIO_SCAN_CAP (CDR_READ_CAP_AUDIO_PW_RAW|CDR_READ_CAP_AUDIO_PQ_BCD|CDR_READ_CAP_AUDIO_PQ_HEX)
Packit Service 3e823c
Packit Service 3e823c
struct DiskInfo {
Packit Service 3e823c
  long capacity;          // recordable capacity of medium
Packit Service 3e823c
  Msf  manufacturerId;    // disk identification
Packit Service 3e823c
  int  recSpeedLow;       // lowest recording speed
Packit Service 3e823c
  int  recSpeedHigh;      // highest recording speed
Packit Service 3e823c
Packit Service 3e823c
  int sessionCnt;         // number of closed sessions
Packit Service 3e823c
  int lastTrackNr;        // number of last track on disk
Packit Service 3e823c
Packit Service 3e823c
  long lastSessionLba;    // start lba of first track of last closed session
Packit Service 3e823c
  long thisSessionLba;    // start lba of this session
Packit Service 3e823c
Packit Service 3e823c
  int diskTocType;        // type of CD TOC, only valid if CD-R is not empty
Packit Service 3e823c
Packit Service 3e823c
  unsigned int empty  : 1; // 1 for empty disk, else 0
Packit Service 3e823c
  unsigned int append : 1; // 1 if CD-R is appendable, else 0
Packit Service 3e823c
  unsigned int cdrw   : 1; // 1 if disk is a CD-RW
Packit Service 3e823c
  
Packit Service 3e823c
  struct {
Packit Service 3e823c
    unsigned int empty : 1;
Packit Service 3e823c
    unsigned int append : 1;
Packit Service 3e823c
    unsigned int cdrw : 1;
Packit Service 3e823c
    unsigned int capacity : 1;
Packit Service 3e823c
    unsigned int manufacturerId : 1;
Packit Service 3e823c
    unsigned int recSpeed : 1;
Packit Service 3e823c
  } valid;
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
struct DriveInfo {
Packit Service 3e823c
  int maxReadSpeed;
Packit Service 3e823c
  int currentReadSpeed;
Packit Service 3e823c
  int maxWriteSpeed;
Packit Service 3e823c
  int currentWriteSpeed;
Packit Service 3e823c
Packit Service 3e823c
  unsigned int accurateAudioStream : 1;
Packit Service 3e823c
  unsigned int burnProof : 1;
Packit Service 3e823c
  unsigned int ricohJustLink : 1;
Packit Service 3e823c
  unsigned int ricohJustSpeed : 1;
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
struct CdTextPack {
Packit Service 3e823c
  unsigned char packType;
Packit Service 3e823c
  unsigned char trackNumber;
Packit Service 3e823c
  unsigned char sequenceNumber;
Packit Service 3e823c
  unsigned char blockCharacter;
Packit Service 3e823c
  unsigned char data[12];
Packit Service 3e823c
  unsigned char crc0;
Packit Service 3e823c
  unsigned char crc1;
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
struct CdToc {
Packit Service 3e823c
  int track;            // number
Packit Service 3e823c
  long start;           // LBA of track start
Packit Service 3e823c
  unsigned char adrCtl; // ADR/CTL field
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
struct CdRawToc {
Packit Service 3e823c
  int sessionNr;
Packit Service 3e823c
  int point;
Packit Service 3e823c
  int min;
Packit Service 3e823c
  int sec;
Packit Service 3e823c
  int frame;
Packit Service 3e823c
  int pmin;
Packit Service 3e823c
  int psec;
Packit Service 3e823c
  int pframe;
Packit Service 3e823c
  unsigned char adrCtl;
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
struct TrackInfo {
Packit Service 3e823c
  int trackNr;          // track number
Packit Service 3e823c
  unsigned char ctl;    // flags
Packit Service 3e823c
  TrackData::Mode mode; // track data mode
Packit Service 3e823c
  long start;           // absolute start position from CD TOC
Packit Service 3e823c
  long pregap;          // pre-gap length of track in blocks
Packit Service 3e823c
  long fill;            // number of blocks to fill with zero data at end
Packit Service 3e823c
  int indexCnt;         // number of index increments
Packit Service 3e823c
  long index[98];       // index marks
Packit Service 3e823c
  char isrcCode[13];    // ISRC code, valid if 'isrcCode[0] != 0'
Packit Service 3e823c
  char *filename;       // data file name
Packit Service 3e823c
  long bytesWritten;    // number of bytes written to file
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
class CdrDriver {
Packit Service 3e823c
public:
Packit Service 3e823c
  CdrDriver(ScsiIf *scsiIf, unsigned long options);
Packit Service 3e823c
  virtual ~CdrDriver();
Packit Service 3e823c
Packit Service 3e823c
  // returns stored SCSI interface object
Packit Service 3e823c
  virtual ScsiIf *scsiIf() const { return scsiIf_; }
Packit Service 3e823c
Packit Service 3e823c
  // sets SCSI interface object
Packit Service 3e823c
  void scsiIf(ScsiIf *i) { scsiIf_ = i; }
Packit Service 3e823c
Packit Service 3e823c
  // returns name of driver
Packit Service 3e823c
  virtual const char *driverName() const { return driverName_; }
Packit Service 3e823c
Packit Service 3e823c
  // returns options flags
Packit Service 3e823c
  virtual unsigned long options() const { return options_; }
Packit Service 3e823c
Packit Service 3e823c
  // returns 1 if drive takes audio samples in big endian byte order or
Packit Service 3e823c
  // 0 for little endian byte order
Packit Service 3e823c
  virtual int bigEndianSamples() const = 0;
Packit Service 3e823c
Packit Service 3e823c
  // return information about drive
Packit Service 3e823c
  virtual const DriveInfo *driveInfo(bool showErrorMsg) { return NULL; }
Packit Service 3e823c
Packit Service 3e823c
  // returns current writing speed
Packit Service 3e823c
  virtual int speed() { return speed_; }
Packit Service 3e823c
  
Packit Service 3e823c
  // returns current reading speed
Packit Service 3e823c
  virtual int rspeed() { return rspeed_; }
Packit Service 3e823c
Packit Service 3e823c
  // sets writing speed, returns 0 for OK or 1 for illegal speed,
Packit Service 3e823c
  // this function may send SCSI commands to the drive
Packit Service 3e823c
  virtual int speed(int) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // sets reading speed, returns 0 for OK or 1 for illegal speed,
Packit Service 3e823c
  // this function may send SCSI commands to the drive
Packit Service 3e823c
  virtual bool rspeed(int);
Packit Service 3e823c
Packit Service 3e823c
  // sets/return buffer under run protection setting (if supported by
Packit Service 3e823c
  // the drive: 1 = enabled, 0 = disbaled
Packit Service 3e823c
  virtual int bufferUnderRunProtection() const {
Packit Service 3e823c
    return enableBufferUnderRunProtection_;
Packit Service 3e823c
  }
Packit Service 3e823c
Packit Service 3e823c
  virtual void bufferUnderRunProtection(int s) {
Packit Service 3e823c
    enableBufferUnderRunProtection_ = s != 0 ? 1 : 0;
Packit Service 3e823c
  }
Packit Service 3e823c
    
Packit Service 3e823c
  // sets/return writing speed control setting (if supported by
Packit Service 3e823c
  // the drive: 1 = enabled, 0 = disbaled
Packit Service 3e823c
  virtual int writeSpeedControl() const { return enableWriteSpeedControl_; }
Packit Service 3e823c
Packit Service 3e823c
  virtual void writeSpeedControl(int s) {
Packit Service 3e823c
    enableWriteSpeedControl_ = s != 0 ? 1 : 0; }
Packit Service 3e823c
Packit Service 3e823c
  // returns 1 if simulation mode, 0 for real writing
Packit Service 3e823c
  virtual bool simulate() const { return simulate_; }
Packit Service 3e823c
Packit Service 3e823c
  // sets simulation mode, returns 0 for OK, 1 if given mode is not supported
Packit Service 3e823c
  virtual void simulate(bool s) { simulate_ = s; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets multi session mode (0: close session, 1: open next session).
Packit Service 3e823c
  // Returns 1 if multi session is not supported by driver, else 0
Packit Service 3e823c
  virtual int multiSession(bool);
Packit Service 3e823c
Packit Service 3e823c
  // Returns mutli session mode.
Packit Service 3e823c
  virtual bool multiSession() const { return multiSession_; }
Packit Service 3e823c
Packit Service 3e823c
  // Returns/sets fast toc reading flag (no sub-channel analysis)
Packit Service 3e823c
  virtual bool fastTocReading() const { return fastTocReading_; }
Packit Service 3e823c
  virtual void fastTocReading(bool f) { fastTocReading_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  // Returns/sets raw data track reading flag
Packit Service 3e823c
  virtual bool rawDataReading() const { return rawDataReading_; }
Packit Service 3e823c
  virtual void rawDataReading(bool f) { rawDataReading_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  // Returns/sets mode2 mixed track reading flag
Packit Service 3e823c
  virtual bool mode2Mixed() const { return mode2Mixed_; }
Packit Service 3e823c
  virtual void mode2Mixed(bool f) { mode2Mixed_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  virtual TrackData::SubChannelMode subChanReadMode() const { return subChanReadMode_; }
Packit Service 3e823c
  virtual void subChanReadMode(TrackData::SubChannelMode m) { subChanReadMode_ = m; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets/returns the pad first pre-gap flag
Packit Service 3e823c
  virtual int padFirstPregap() const { return padFirstPregap_; }
Packit Service 3e823c
  virtual void padFirstPregap(int f) { padFirstPregap_ = f != 0 ? 1 : 0; }
Packit Service 3e823c
Packit Service 3e823c
  // Returns the on-thy-fly flag.
Packit Service 3e823c
  virtual int onTheFly() const { return onTheFly_; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets file descriptor for on the fly data and sets the on-the-fly flag
Packit Service 3e823c
  // if 'fd' is >= 0 and clears it otherwise
Packit Service 3e823c
  virtual void onTheFly(int fd);
Packit Service 3e823c
Packit Service 3e823c
  // Returns force flag
Packit Service 3e823c
  virtual bool force() const { return force_; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets force flag
Packit Service 3e823c
  virtual void force(bool f) { force_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  // Returns TAO source flag
Packit Service 3e823c
  virtual bool taoSource() const { return taoSource_; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets TAO source flag
Packit Service 3e823c
  virtual void taoSource(bool f) { taoSource_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  // Return number of adjust sectors for reading TAO source disks
Packit Service 3e823c
  virtual int taoSourceAdjust() const { return taoSourceAdjust_; }
Packit Service 3e823c
Packit Service 3e823c
  // Sets number of adjust sectors for reading TAO source disks
Packit Service 3e823c
  virtual void taoSourceAdjust(int val);
Packit Service 3e823c
Packit Service 3e823c
  // Sets remote mode
Packit Service 3e823c
  virtual void remote(int flag, int fd);
Packit Service 3e823c
Packit Service 3e823c
  // Return remote mode flag
Packit Service 3e823c
  virtual int remote() { return remote_; }
Packit Service 3e823c
  
Packit Service 3e823c
  // Sets cdda paranoia mode
Packit Service 3e823c
  void paranoiaMode(int);
Packit Service 3e823c
  
Packit Service 3e823c
  // Sets user defined capacity
Packit Service 3e823c
  virtual void userCapacity(int c) { userCapacity_ = c; }
Packit Service 3e823c
  
Packit Service 3e823c
  // Sets burning to the outer edge mode
Packit Service 3e823c
  virtual void fullBurn(bool f) { fullBurn_ = f; }
Packit Service 3e823c
Packit Service 3e823c
  // Return byte order of host (0: little endian, 1: big endian)
Packit Service 3e823c
  int hostByteOrder() const { return hostByteOrder_; }
Packit Service 3e823c
Packit Service 3e823c
  // general commands
Packit Service 3e823c
  virtual int testUnitReady(int) const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int startStopUnit(int) const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int preventMediumRemoval(int) const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int rezeroUnit(int showMessage = 1) const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int loadUnload(int) const = 0;
Packit Service 3e823c
Packit Service 3e823c
  virtual int flushCache() const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int readCapacity(long *length, int showMessage = 1);
Packit Service 3e823c
Packit Service 3e823c
  virtual bool readBufferCapacity(long* total, long* available) {
Packit Service 3e823c
    return false;
Packit Service 3e823c
  }
Packit Service 3e823c
Packit Service 3e823c
  // CD-RW specific commands
Packit Service 3e823c
  
Packit Service 3e823c
  enum BlankingMode { BLANK_FULL, BLANK_MINIMAL };
Packit Service 3e823c
  virtual int blankDisk(BlankingMode);
Packit Service 3e823c
Packit Service 3e823c
  // disk at once recording related commands
Packit Service 3e823c
Packit Service 3e823c
  // Returns acceptable sub-channel encoding mode for given sub-channel type:
Packit Service 3e823c
  //  -1: writing of sub-channel type not supported at all
Packit Service 3e823c
  //   0: accepts plain data without encoding
Packit Service 3e823c
  //   1: accepts only completely encoded data
Packit Service 3e823c
  virtual int subChannelEncodingMode(TrackData::SubChannelMode) const;
Packit Service 3e823c
Packit Service 3e823c
  // Should check if toc is suitable for DAO writing with the actual driver.
Packit Service 3e823c
  // Returns 0 if toc is OK, else 1.
Packit Service 3e823c
  // Usually all tocs are suitable for writing so that the base class
Packit Service 3e823c
  // implementation simply returns 0.
Packit Service 3e823c
  virtual int checkToc(const Toc *);
Packit Service 3e823c
Packit Service 3e823c
  // Used to make necessary initializations but without touching the CD-R.
Packit Service 3e823c
  // It should be possible to abort the writing process after this function
Packit Service 3e823c
  // has been called without destroying the CD-R.
Packit Service 3e823c
  virtual int initDao(const Toc *) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Performs all steps that must be done before the first user data block
Packit Service 3e823c
  // is written, e.g. sending cue sheet, writing lead-in.
Packit Service 3e823c
  virtual int startDao() = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Performs all steps for successfully finishing the writing process,
Packit Service 3e823c
  // e.g. writing lead-out, flushing the cache.
Packit Service 3e823c
  virtual int finishDao() = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Aborts writing process. Called if an error occurs or the user aborts
Packit Service 3e823c
  // recording prematurely.
Packit Service 3e823c
  virtual void abortDao() = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Sends given data to drive. 'lba' should be the current writing address
Packit Service 3e823c
  // and will be updated according to the written number of blocks.
Packit Service 3e823c
  virtual int writeData(TrackData::Mode, TrackData::SubChannelMode sm,
Packit Service 3e823c
			long &lba, const char *buf, long len);
Packit Service 3e823c
Packit Service 3e823c
  // returns mode for main channel data encoding, the value is used by
Packit Service 3e823c
  // Track::readData()
Packit Service 3e823c
  // 0: raw audio mode, all sectors must be encoded as audio sectors
Packit Service 3e823c
  // 1: no encoding for MODE1 and MODE2 sectors, MODE2_FORM1 and MODE2_FORM2
Packit Service 3e823c
  //    are extended by sub header and zero EDC/ECC data
Packit Service 3e823c
  int encodingMode() const { return encodingMode_; }
Packit Service 3e823c
Packit Service 3e823c
  // disk read commands
Packit Service 3e823c
  
Packit Service 3e823c
  // analyzes the CD structure (Q sub-channels) of the inserted CD
Packit Service 3e823c
  virtual Toc *readDiskToc(int session, const char *);
Packit Service 3e823c
Packit Service 3e823c
  // analyzes the CD structure and reads data
Packit Service 3e823c
  virtual Toc *readDisk(int session, const char *);
Packit Service 3e823c
Packit Service 3e823c
  // returns information about inserted medium
Packit Service 3e823c
  virtual DiskInfo *diskInfo() { return 0; }
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
  // Returns block size depending on given sector mode and 'encodingMode_'
Packit Service 3e823c
  // that must be used to send data to the recorder.
Packit Service 3e823c
  virtual long blockSize(TrackData::Mode, TrackData::SubChannelMode) const;
Packit Service 3e823c
Packit Service 3e823c
  // sends a status message to the driving application if in remote mode
Packit Service 3e823c
  enum WriteCdProgressType { WCD_LEADIN = PGSMSG_WCD_LEADIN,
Packit Service 3e823c
			     WCD_DATA = PGSMSG_WCD_DATA,
Packit Service 3e823c
			     WCD_LEADOUT = PGSMSG_WCD_LEADOUT };
Packit Service 3e823c
  int sendWriteCdProgressMsg(WriteCdProgressType type, int totalTracks,
Packit Service 3e823c
			     int track, int trackProgress, int totalProgress,
Packit Service 3e823c
			     int bufferFillRate, int writeBufferFill = 0);
Packit Service 3e823c
Packit Service 3e823c
  int sendBlankCdProgressMsg(int totalProgress);
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
  // static functions
Packit Service 3e823c
Packit Service 3e823c
  // Selects driver id for given vendor/model string. NULL is returned if
Packit Service 3e823c
  // no driver could be selected.
Packit Service 3e823c
  // readWrite: 0: select a driver for read operations
Packit Service 3e823c
  //            1: select a driver for write operations
Packit Service 3e823c
  // options: filled with option flags for vendor/model
Packit Service 3e823c
  static const char *selectDriver(int readWrite, const char *vendor,
Packit Service 3e823c
				  const char *model, unsigned long *options);
Packit Service 3e823c
Packit Service 3e823c
  // Creates instance of driver with specified id.
Packit Service 3e823c
  static CdrDriver *createDriver(const char *driverId, unsigned long options,
Packit Service 3e823c
				 ScsiIf *);
Packit Service 3e823c
Packit Service 3e823c
  // Try to autodetect a driver on given Scsi interface.
Packit Service 3e823c
  static const char *detectDriver(ScsiIf *, unsigned long *options);
Packit Service 3e823c
Packit Service 3e823c
  // Prints list of all available driver ids.
Packit Service 3e823c
  static void printDriverIds();
Packit Service 3e823c
Packit Service 3e823c
  // returns vendor/type of CD-R medium
Packit Service 3e823c
  static int cdrVendor(Msf &, const char **vendor, const char** mediumType);
Packit Service 3e823c
Packit Service 3e823c
protected:
Packit Service 3e823c
  struct ReadDiskInfo {
Packit Service 3e823c
    int tracks;    // total number of tracks
Packit Service 3e823c
    long startLba;      // LBA where extraction starts
Packit Service 3e823c
    long endLba;        // LBA where extraction ends
Packit Service 3e823c
  };
Packit Service 3e823c
Packit Service 3e823c
  unsigned long options_; // driver option flags
Packit Service 3e823c
  ScsiIf *scsiIf_;
Packit Service 3e823c
  int scsiMaxDataLen_;
Packit Service 3e823c
  const char *driverName_;
Packit Service 3e823c
Packit Service 3e823c
  int hostByteOrder_; // 0: little endian, 1: big endian
Packit Service 3e823c
Packit Service 3e823c
  unsigned long readCapabilities_;
Packit Service 3e823c
Packit Service 3e823c
  int blockLength_; // length of data block for 'writeData' command
Packit Service 3e823c
  long blocksPerWrite_; // number of blocks that can be written with a
Packit Service 3e823c
                        // single SCSI WRITE command
Packit Service 3e823c
  char *zeroBuffer_; // zeroed buffer for writing zeros
Packit Service 3e823c
Packit Service 3e823c
  int enableBufferUnderRunProtection_;
Packit Service 3e823c
  int enableWriteSpeedControl_;
Packit Service 3e823c
  int speed_;
Packit Service 3e823c
  int rspeed_;
Packit Service 3e823c
  bool simulate_;
Packit Service 3e823c
  bool multiSession_;
Packit Service 3e823c
  int encodingMode_; // mode for encoding data sectors
Packit Service 3e823c
  bool fastTocReading_;
Packit Service 3e823c
  bool rawDataReading_;
Packit Service 3e823c
  int mode2Mixed_;
Packit Service 3e823c
  TrackData::SubChannelMode subChanReadMode_;
Packit Service 3e823c
  int padFirstPregap_; // used by 'read-toc': defines if the first audio 
Packit Service 3e823c
                       // track's pre-gap is padded with zeros in the toc-file
Packit Service 3e823c
                       // or if it is taken from the data file
Packit Service 3e823c
  int onTheFly_; // 1 if operating in on-the-fly mode
Packit Service 3e823c
  int onTheFlyFd_; // file descriptor for on the fly data
Packit Service 3e823c
  bool force_; // force flag to allow certain operations
Packit Service 3e823c
  int remote_; // 1 for remote mode, else 0
Packit Service 3e823c
  int remoteFd_; // file descriptor for remote messages
Packit Service 3e823c
  bool taoSource_; // 1 to indicate a TAO writting source CD for read-cd/read-toc
Packit Service 3e823c
  int taoSourceAdjust_; // number of unreadable sectors between two tracks
Packit Service 3e823c
                        // written in TAO mode
Packit Service 3e823c
  const Toc *toc_;
Packit Service 3e823c
Packit Service 3e823c
  SubChannel **scannedSubChannels_;
Packit Service 3e823c
  long maxScannedSubChannels_;
Packit Service 3e823c
Packit Service 3e823c
  unsigned char *transferBuffer_;
Packit Service 3e823c
Packit Service 3e823c
  // Byte order of audio samples read from the drive, e.g. with 
Packit Service 3e823c
  // 'readSubChannels()'. 0: little endian, 1: big endian
Packit Service 3e823c
  int audioDataByteOrder_; 
Packit Service 3e823c
  
Packit Service 3e823c
  int userCapacity_;
Packit Service 3e823c
  bool fullBurn_;
Packit Service 3e823c
Packit Service 3e823c
  static unsigned char syncPattern[12];
Packit Service 3e823c
  static char REMOTE_MSG_SYNC_[4];
Packit Service 3e823c
Packit Service 3e823c
  static int speed2Mult(int);
Packit Service 3e823c
  static int mult2Speed(int);
Packit Service 3e823c
Packit Service 3e823c
  virtual int sendCmd(const unsigned char *cmd, int cmdLen,
Packit Service 3e823c
		      const unsigned char *dataOut, int dataOutLen,
Packit Service 3e823c
		      unsigned char *dataIn, int dataInLen,
Packit Service 3e823c
		      int showErrorMsg = 1) const;
Packit Service 3e823c
Packit Service 3e823c
  virtual int getModePage(int pageCode, unsigned char *buf, long bufLen,
Packit Service 3e823c
			  unsigned char *modePageHeader,
Packit Service 3e823c
			  unsigned char *blockDesc, int showErrorMsg);
Packit Service 3e823c
  virtual int setModePage(const unsigned char *buf,
Packit Service 3e823c
			  const unsigned char *modePageHeader,
Packit Service 3e823c
			  const unsigned char *blockDesc, int showErrorMsg);
Packit Service 3e823c
Packit Service 3e823c
  // some drives (e.g. Yamaha CDR100) don't implement mode sense/select(10)
Packit Service 3e823c
  virtual int getModePage6(int pageCode, unsigned char *buf, long bufLen,
Packit Service 3e823c
			   unsigned char *modePageHeader,
Packit Service 3e823c
			   unsigned char *blockDesc, int showErrorMsg);
Packit Service 3e823c
  virtual int setModePage6(const unsigned char *buf,
Packit Service 3e823c
			   const unsigned char *modePageHeader,
Packit Service 3e823c
			   const unsigned char *blockDesc, int showErrorMsg);
Packit Service 3e823c
Packit Service 3e823c
  virtual int writeZeros(TrackData::Mode, TrackData::SubChannelMode,
Packit Service 3e823c
			 long &lba, long encLba, long count);
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
  // Returns track control flags for given track, bits 0-3 are always zero
Packit Service 3e823c
  virtual unsigned char trackCtl(const Track *track);
Packit Service 3e823c
Packit Service 3e823c
  // Returns session format code for point A0 TOC entry, generated from
Packit Service 3e823c
  // stored 'toc_' object.
Packit Service 3e823c
  virtual unsigned char sessionFormat();
Packit Service 3e823c
Packit Service 3e823c
  // readToc related functions:
Packit Service 3e823c
Packit Service 3e823c
  // returns TOC data of specified session of inserted CD,
Packit Service 3e823c
  // a generic function is implemented in 'CdrDriver.cc', it will return
Packit Service 3e823c
  // the tracks of all session or of the first session depending on the
Packit Service 3e823c
  // drive
Packit Service 3e823c
  virtual CdToc *getToc(int sessionNr, int *nofTracks);
Packit Service 3e823c
Packit Service 3e823c
  // Generic function to retrieve basic TOC data. Cannot distinguish
Packit Service 3e823c
  // between different sessions.
Packit Service 3e823c
  CdToc *getTocGeneric(int *nofTracks);
Packit Service 3e823c
Packit Service 3e823c
  // Reads raw toc data of inserted CD. Used by base implementation of
Packit Service 3e823c
  // 'getToc()' and must be implemented by the actual driver.
Packit Service 3e823c
  virtual CdRawToc *getRawToc(int sessionNr, int *len) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Reads CD-TEXT packs from the lead-in of a CD. The base implementation
Packit Service 3e823c
  // uses the SCSI-3/mmc commands.
Packit Service 3e823c
  virtual CdTextPack *readCdTextPacks(long *);
Packit Service 3e823c
Packit Service 3e823c
  // reads CD-TEXT data and adds it to given 'Toc' object
Packit Service 3e823c
  int readCdTextData(Toc *);
Packit Service 3e823c
Packit Service 3e823c
  // Tries to determine the data mode of specified track.
Packit Service 3e823c
  virtual TrackData::Mode getTrackMode(int trackNr, long trackStartLba);
Packit Service 3e823c
Packit Service 3e823c
  // Determines mode of given sector, 'buf' should contain the sector header
Packit Service 3e823c
  // at the first 4 bytes followed by the sub-header for XA tracks.
Packit Service 3e823c
  // If an illegal mode is found in the sector header 'MODE0' will be
Packit Service 3e823c
  // returned.
Packit Service 3e823c
  TrackData::Mode determineSectorMode(unsigned char *buf);
Packit Service 3e823c
Packit Service 3e823c
  // analyzes given 8 byte sub header and returns wether the sector is
Packit Service 3e823c
  // a MODE2, MODE2_FORM1 or MODE2_FORM2 sector
Packit Service 3e823c
  TrackData::Mode analyzeSubHeader(unsigned char *);
Packit Service 3e823c
Packit Service 3e823c
  virtual unsigned long getReadCapabilities(const CdToc *, int) const = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Called by 'readDiskToc()' to retrieve following information about
Packit Service 3e823c
  // the track 'trackNr' with given start/end lba addresses:
Packit Service 3e823c
  // - all index increments, filled into 'index'/'indexCnt'
Packit Service 3e823c
  // - ISRC Code, filled into provided buffer 'isrcCode' (13 bytes)
Packit Service 3e823c
  // - length of pre-gap of next track, filled into 'pregap'
Packit Service 3e823c
  // - control nibbles read from track, filled into bits 0-3 of 'ctrl',
Packit Service 3e823c
  //   bit 7 must be set to indicate valid data
Packit Service 3e823c
  // This function must be overloaded by an actual driver.
Packit Service 3e823c
  // return: 0: OK, 1: error occured
Packit Service 3e823c
  virtual int analyzeTrack(TrackData::Mode, int trackNr, long startLba,
Packit Service 3e823c
			   long endLba, Msf *index,
Packit Service 3e823c
			   int *indexCnt, long *pregap, char *isrcCode,
Packit Service 3e823c
			   unsigned char *ctl) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Track analysis algorithm using the binary search method. The base
Packit Service 3e823c
  // class implements the basic algorithm. It uses 'findIndex()' which
Packit Service 3e823c
  // can be implemented by an actual driver to get the track and index
Packit Service 3e823c
  // number at a specific block address. This base class contains an
Packit Service 3e823c
  // implementation of 'findIndex()', too, that can be usually used.
Packit Service 3e823c
  // It'll be always better to use the linear scan algorithm (see below)
Packit Service 3e823c
  // if possible.
Packit Service 3e823c
  int analyzeTrackSearch(TrackData::Mode, int trackNr, long startLba,
Packit Service 3e823c
			   long endLba, Msf *index,
Packit Service 3e823c
			   int *indexCnt, long *pregap, char *isrcCode,
Packit Service 3e823c
			   unsigned char *ctl);
Packit Service 3e823c
Packit Service 3e823c
  // finds position (lba) where index for given track number switches to
Packit Service 3e823c
  // 'index' (binary search, base algorithm is implemented in 'CdrDriver').
Packit Service 3e823c
  // It uses the method 'getTrackIndex()' which must be overloaded by
Packit Service 3e823c
  // the actual driver.
Packit Service 3e823c
  virtual long findIndex(int track, int index, long trackStart, long trackEnd);
Packit Service 3e823c
Packit Service 3e823c
  // Retrieves track, index and control nibbles at given lba address. Must
Packit Service 3e823c
  // be implemented by the driver if the binary search method 
Packit Service 3e823c
  // ('analyzeTrackSearch()') should be used.
Packit Service 3e823c
  virtual int getTrackIndex(long lba, int *trackNr, int *indexNr, 
Packit Service 3e823c
			    unsigned char *ctl);
Packit Service 3e823c
Packit Service 3e823c
  // Basic track analyzis using the linear scan algorithm. The base class
Packit Service 3e823c
  // implements the basic algorithm which calls 'readSubChannels()' to
Packit Service 3e823c
  // read the sub-channel data. Actual drivers should overload the
Packit Service 3e823c
  // 'readSubChannels()' function.
Packit Service 3e823c
  int analyzeTrackScan(TrackData::Mode, int trackNr, long startLba,
Packit Service 3e823c
		       long endLba, Msf *index, int *indexCnt, long *pregap,
Packit Service 3e823c
		       char *isrcCode, unsigned char *ctl);
Packit Service 3e823c
Packit Service 3e823c
  // Reads 'len' sub-channels from sectors starting  at 'lba'.
Packit Service 3e823c
  // The returned vector contains 'len' pointers to 'SubChannel' objects.
Packit Service 3e823c
  // Audio data that is usually retrieved with the sub-channels is placed
Packit Service 3e823c
  // in 'buf' if it is not NULL.
Packit Service 3e823c
  // Used by 'analyzeTrackScan()' and 'readAudioRangeParanoia()'.
Packit Service 3e823c
  virtual int readSubChannels(TrackData::SubChannelMode, long lba, long len,
Packit Service 3e823c
			      SubChannel ***, Sample *buf) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Determines the readable length of a data track and the pre-gap length
Packit Service 3e823c
  // of the following track. The implementation in the base class should
Packit Service 3e823c
  // be suitable for all drivers.
Packit Service 3e823c
  virtual int analyzeDataTrack(TrackData::Mode mode, int trackNr,
Packit Service 3e823c
			       long startLba, long endLba, long *pregap);
Packit Service 3e823c
Packit Service 3e823c
  // Reads 'len' data sectors starting at 'lba' and returns the number of
Packit Service 3e823c
  // successfully read sectors. If the end of the current track is encountered
Packit Service 3e823c
  // the returned value will be smaller than 'len' down to 0. If a read
Packit Service 3e823c
  // error occus -1 is returned. If a L-EC error occures -2 is returned.
Packit Service 3e823c
  // This method is used by 'readDataTrack'/'analyzeDataTrack' and must be
Packit Service 3e823c
  // overloaded by the driver.
Packit Service 3e823c
  virtual long readTrackData(TrackData::Mode, TrackData::SubChannelMode,
Packit Service 3e823c
			     long lba, long len, unsigned char *buf) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Reads a complete data track and saves data to a file.
Packit Service 3e823c
  virtual int readDataTrack(ReadDiskInfo *, int fp, long start, long end,
Packit Service 3e823c
			    TrackInfo *trackInfo);
Packit Service 3e823c
Packit Service 3e823c
  // Reads the audio data of given audio track range 'startTrack', 'endTrack'.
Packit Service 3e823c
  // 'trackInfo' is am array of TrackInfo structures for all tracks. 
Packit Service 3e823c
  // This function is called by 'readDisk()' and must be overloaded by the
Packit Service 3e823c
  // actual driver.
Packit Service 3e823c
  virtual int readAudioRange(ReadDiskInfo *, int fp, long start, long end,
Packit Service 3e823c
			     int startTrack, int endTrack, 
Packit Service 3e823c
			     TrackInfo *) = 0;
Packit Service 3e823c
Packit Service 3e823c
  virtual int readAudioRangeStream(ReadDiskInfo *, int fd, long start,
Packit Service 3e823c
				   long end, int startTrack, int endTrack, 
Packit Service 3e823c
				   TrackInfo *);
Packit Service 3e823c
Packit Service 3e823c
  // Reads catalog number by scanning the sub-channels.
Packit Service 3e823c
  // Uses 'readSubChannels()' to read the the sub-channels.
Packit Service 3e823c
  int readCatalogScan(char *mcnCode, long startLba, long endLba);
Packit Service 3e823c
Packit Service 3e823c
  // Reads catalog number and stores it in given 'Toc' object. Must be
Packit Service 3e823c
  // implemented by the actual driver. 'startLba' and 'endLba' specify
Packit Service 3e823c
  // the allowed range for sub-channel scanning.
Packit Service 3e823c
  virtual int readCatalog(Toc *toc, long startLba, long endLba) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Reads ISRC code and writes into provided 13 bytes buffer. Must be
Packit Service 3e823c
  // implemented by the actual driver.
Packit Service 3e823c
  virtual int readIsrc(int trackNr, char *) = 0;
Packit Service 3e823c
Packit Service 3e823c
  // Build Toc object from gathered TrackInfo data
Packit Service 3e823c
  Toc *buildToc(TrackInfo *trackInfos, long nofTrackInfos, int padFirstPregap);
Packit Service 3e823c
Packit Service 3e823c
  // sets block size for read/write operations
Packit Service 3e823c
  virtual int setBlockSize(long blocksize, unsigned char density = 0);
Packit Service 3e823c
Packit Service 3e823c
  // checks if drive capabilities support requested sub-channel reading mode
Packit Service 3e823c
  int checkSubChanReadCaps(TrackData::Mode, unsigned long caps);
Packit Service 3e823c
Packit Service 3e823c
  void printCdToc(CdToc *toc, int tocLen);
Packit Service 3e823c
Packit Service 3e823c
  enum ReadCdProgressType { RCD_ANALYZING = PGSMSG_RCD_ANALYZING,
Packit Service 3e823c
			    RCD_EXTRACTING = PGSMSG_RCD_EXTRACTING };
Packit Service 3e823c
  void sendReadCdProgressMsg(ReadCdProgressType, int totalTracks, int track,
Packit Service 3e823c
			     int trackProgress, int totalProgress);
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
public:
Packit Service 3e823c
  // function to read audio data and also the sub-channel data from
Packit Service 3e823c
  // specified lba,
Packit Service 3e823c
  // this function is called from 'cdda_read()', so that it is currently
Packit Service 3e823c
  // public because I did not manage to define a friend function that has
Packit Service 3e823c
  // C linkage :)
Packit Service 3e823c
  long audioRead(TrackData::SubChannelMode, int byteOrder,
Packit Service 3e823c
		 Sample *buffer, long startLba, long len);
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
  // Interface for Monty's paranoia library:
Packit Service 3e823c
protected:
Packit Service 3e823c
  // Extracts audio data for given track range with the help of 
Packit Service 3e823c
  // Monty's paranoia library.
Packit Service 3e823c
  int readAudioRangeParanoia(ReadDiskInfo *, int fp, long start, long end,
Packit Service 3e823c
			     int startTrack, int endTrack, 
Packit Service 3e823c
			     TrackInfo *trackInfo);
Packit Service 3e823c
Packit Service 3e823c
private:
Packit Service 3e823c
  // dynamic data
Packit Service 3e823c
  void *paranoia_;                    // paranoia structure
Packit Service 3e823c
  struct cdrom_drive *paranoiaDrive_; // paranoia device
Packit Service 3e823c
  int paranoiaMode_;                  // paranoia mode
Packit Service 3e823c
  ReadDiskInfo *audioReadInfo_;
Packit Service 3e823c
  TrackInfo *audioReadTrackInfo_;
Packit Service 3e823c
  int audioReadStartTrack_;
Packit Service 3e823c
  int audioReadEndTrack_;
Packit Service 3e823c
  long audioReadLastLba_;
Packit Service 3e823c
  long audioReadActLba_;
Packit Service 3e823c
  int audioReadActTrack_;
Packit Service 3e823c
  int audioReadActIndex_;
Packit Service 3e823c
  long audioReadCrcCount_;
Packit Service 3e823c
  int audioReadError_;
Packit Service 3e823c
  long audioReadProgress_;
Packit Service 3e823c
  
Packit Service 3e823c
  // callback for the paranoia library, does nothing, currently
Packit Service 3e823c
  static void paranoiaCallback(long, int);
Packit Service 3e823c
Packit Service 3e823c
Packit Service 3e823c
  // friend classes:
Packit Service 3e823c
  friend class CDD2600Base;
Packit Service 3e823c
};
Packit Service 3e823c
Packit Service 3e823c
#endif