CdrDriver.h
上传用户:weiliju62
上传日期:2007-01-06
资源大小:619k
文件大小:20k
源码类别:

SCSI/ASPI

开发平台:

MultiPlatform

  1. /*  cdrdao - write audio CD-Rs in disc-at-once mode
  2.  *
  3.  *  Copyright (C) 1998, 1999  Andreas Mueller <mueller@daneb.ping.de>
  4.  *
  5.  *  This program is free software; you can redistribute it and/or modify
  6.  *  it under the terms of the GNU General Public License as published by
  7.  *  the Free Software Foundation; either version 2 of the License, or
  8.  *  (at your option) any later version.
  9.  *
  10.  *  This program is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  *  GNU General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU General Public License
  16.  *  along with this program; if not, write to the Free Software
  17.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19. /*
  20.  * $Log: CdrDriver.h,v $
  21.  * Revision 1.14  1999/04/05 18:47:11  mueller
  22.  * Added CD-TEXT support.
  23.  *
  24.  * Revision 1.13  1999/03/27 20:52:17  mueller
  25.  * Added data track support for writing and toc analysis.
  26.  *
  27.  * Revision 1.12  1999/02/06 20:41:21  mueller
  28.  * Added virtual member function 'checkToc()'.
  29.  *
  30.  * Revision 1.11  1998/10/24 14:28:59  mueller
  31.  * Changed prototype of 'readDiskToc()'. It now accepts the name of the
  32.  * audio file that should be placed into the generated toc-file.
  33.  * Added virtual function 'readDisk()' that for reading disk toc and
  34.  * ripping audio data at the same time.
  35.  *
  36.  * Revision 1.10  1998/10/03 15:10:38  mueller
  37.  * Added function 'writeZeros()'.
  38.  * Updated function 'writeData()'.
  39.  *
  40.  * Revision 1.9  1998/09/27 19:19:18  mueller
  41.  * Added retrieval of control nibbles for track with 'analyzeTrack()'.
  42.  * Added multi session mode.
  43.  *
  44.  * Revision 1.8  1998/09/22 19:15:13  mueller
  45.  * Removed memory allocations during write process.
  46.  *
  47.  * Revision 1.7  1998/09/08 11:54:22  mueller
  48.  * Extended disk info structure because CDD2000 does not support the
  49.  * 'READ DISK INFO' command.
  50.  *
  51.  * Revision 1.6  1998/09/07 15:20:20  mueller
  52.  * Reorganized read-toc related code.
  53.  *
  54.  * Revision 1.5  1998/08/30 19:12:19  mueller
  55.  * Added supressing of error messages for some commands.
  56.  * Added structure 'DriveInfo'.
  57.  *
  58.  * Revision 1.4  1998/08/25 19:24:07  mueller
  59.  * Moved basic index extraction algorithm for read-toc to this class.
  60.  * Added vendor codes.
  61.  *
  62.  */
  63. #ifndef __CDRDRIVER_H__
  64. #define __CDRDRIVER_H__
  65. #include "ScsiIf.h"
  66. #include "Msf.h"
  67. #include "TrackData.h"
  68. #include "SubChannel.h"
  69. class Toc;
  70. class Track;
  71. #define OPT_DRV_GET_TOC_GENERIC   0x00010000
  72. #define OPT_DRV_SWAP_READ_SAMPLES 0x00020000
  73. #define OPT_DRV_NO_PREGAP_READ    0x00040000
  74. struct DiskInfo {
  75.   long capacity;          // recordable capacity of medium
  76.   Msf  manufacturerId;    // disk identification
  77.   int  recSpeedLow;       // lowest recording speed
  78.   int  recSpeedHigh;      // highest recording speed
  79.   int sessionCnt;         // number of closed sessions
  80.   int lastTrackNr;        // number of last track on disk
  81.   long lastSessionLba;    // start lba of first track of last closed session
  82.   long thisSessionLba;    // start lba of this session
  83.   int diskTocType;        // type of CD TOC, only valid if CD-R is not empty
  84.   unsigned int empty  : 1; // 1 for empty disk, else 0
  85.   unsigned int append : 1; // 1 if CD-R is appendable, else 0
  86.   unsigned int cdrw   : 1; // 1 if disk is a CD-RW
  87.   
  88.   struct {
  89.     unsigned int empty : 1;
  90.     unsigned int append : 1;
  91.     unsigned int cdrw : 1;
  92.     unsigned int capacity : 1;
  93.     unsigned int manufacturerId : 1;
  94.     unsigned int recSpeed : 1;
  95.   } valid;
  96. };
  97. struct DriveInfo {
  98.   int maxReadSpeed;
  99.   int currentReadSpeed;
  100.   int maxWriteSpeed;
  101.   int currentWriteSpeed;
  102.   unsigned int accurateAudioStream : 1;
  103. };
  104. struct CdToc {
  105.   int track;            // number
  106.   long start;           // LBA of track start
  107.   unsigned char adrCtl; // ADR/CTL field
  108. };
  109. struct CdRawToc {
  110.   int sessionNr;
  111.   int point;
  112.   int min;
  113.   int sec;
  114.   int frame;
  115.   int pmin;
  116.   int psec;
  117.   int pframe;
  118.   unsigned char adrCtl;
  119. };
  120. struct TrackInfo {
  121.   int trackNr;          // track number
  122.   unsigned char ctl;    // flags
  123.   TrackData::Mode mode; // track data mode
  124.   long start;           // absolute start position from CD TOC
  125.   long pregap;          // pre-gap length of track in blocks
  126.   long fill;            // number of blocks to fill with zero data at end
  127.   int indexCnt;         // number of index increments
  128.   long index[98];       // index marks
  129.   char isrcCode[13];    // ISRC code, valid if 'isrcCode[0] != 0'
  130.   char *filename;       // data file name
  131.   long bytesWritten;    // number of bytes written to file
  132. };
  133. struct CdTextPack {
  134.   unsigned char packType;
  135.   unsigned char trackNumber;
  136.   unsigned char sequenceNumber;
  137.   unsigned char blockCharacter;
  138.   unsigned char data[12];
  139.   unsigned char crc0;
  140.   unsigned char crc1;
  141. };
  142. class CdrDriver {
  143. public:
  144.   CdrDriver(ScsiIf *scsiIf, unsigned long options);
  145.   virtual ~CdrDriver();
  146.   // returns stored SCSI interface object
  147.   virtual ScsiIf *scsiIf() const { return scsiIf_; }
  148.   // returns name of driver
  149.   virtual const char *driverName() const { return driverName_; }
  150.   // returns options flags
  151.   virtual unsigned long options() const { return options_; }
  152.   // returns 1 if drive takes audio samples in big endian byte order or
  153.   // 0 for little endian byte order
  154.   virtual int bigEndianSamples() const = 0;
  155.   // returns current writing speed
  156.   virtual int speed() { return speed_; }
  157.   
  158.   // sets writing speed, returns 0 for OK or 1 for illegal speed,
  159.   // this function may send SCSI commands to the drive
  160.   virtual int speed(int) = 0;
  161.   // returns 1 if simulation mode, 0 for real writing
  162.   virtual int simulate() const { return simulate_; }
  163.   // sets simulation mode, returns 0 for OK, 1 if given mode is not supported
  164.   virtual int simulate(int s) { simulate_ = s != 0 ? 1 : 0; return 0; }
  165.   // Sets multi session mode (0: close session, 1: open next session).
  166.   // Returns 1 if multi session is not supported by driver, else 0
  167.   virtual int multiSession(int);
  168.   // Returns mutli session mode.
  169.   virtual int multiSession() const { return multiSession_; }
  170.   // Returns/sets fast toc reading flag (no sub-channel analysis)
  171.   virtual int fastTocReading() const { return fastTocReading_; }
  172.   virtual void fastTocReading(int f) { fastTocReading_ = f != 0 ? 1 : 0; }
  173.   // Returns/sets raw data track reading flag
  174.   virtual int rawDataReading() const { return rawDataReading_; }
  175.   virtual void rawDataReading(int f) { rawDataReading_ = f != 0 ? 1 : 0; }
  176.   // Sets/returns the pad first pre-gap flag
  177.   virtual int padFirstPregap() const { return padFirstPregap_; }
  178.   virtual void padFirstPregap(int f) { padFirstPregap_ = f != 0 ? 1 : 0; }
  179.   // Returns the on-thy-fly flag.
  180.   virtual int onTheFly() const { return onTheFly_; }
  181.   // Sets file descriptor for on the fly data and sets the on-the-fly flag
  182.   // if 'fd' is >= 0 and clears it otherwise
  183.   virtual void onTheFly(int fd);
  184.   // Sets cdda paranoia mode
  185.   void paranoiaMode(int);
  186.   // general commands
  187.   virtual int testUnitReady(int) const;
  188.   virtual int startStopUnit(int) const;
  189.   virtual int preventMediumRemoval(int) const;
  190.   virtual int rezeroUnit(int showMessage = 1) const;
  191.   virtual int loadUnload(int) const = 0;
  192.   virtual int flushCache() const;
  193.   virtual int readCapacity(long *length, int showMessage = 1);
  194.   // CD-RW specific commands
  195.   virtual int blankDisk();
  196.   // disk at once recording related commands
  197.   // Should check if toc is suitable for DAO writing with the actual driver.
  198.   // Returns 0 if toc is OK, else 1.
  199.   // Usually all tocs are suitable for writing so that the base class
  200.   // implementation simply returns 0.
  201.   virtual int checkToc(const Toc *);
  202.   // Used to make necessary initializations but without touching the CD-R.
  203.   // It should be possible to abort the writing process after this function
  204.   // has been called without destroying the CD-R.
  205.   virtual int initDao(const Toc *) = 0;
  206.   // Performs all steps that must be done before the first user data block
  207.   // is written, e.g. sending cue sheet, writing lead-in.
  208.   virtual int startDao() = 0;
  209.   // Performs all steps for successfully finishing the writing process,
  210.   // e.g. writing lead-out, flushing the cache.
  211.   virtual int finishDao() = 0;
  212.   // Aborts writing process. Called if an error occurs or the user aborts
  213.   // recording prematurely.
  214.   virtual void abortDao() = 0;
  215.   // Sends given data to drive. 'lba' should be the current writing address
  216.   // and will be updated according to the written number of blocks.
  217.   virtual int writeData(TrackData::Mode, long &lba, const char *buf, long len);
  218.   // returns mode for main channel data encoding, the value is used by
  219.   // Track::readData()
  220.   // 0: raw audio mode, all sectors must be encoded as audio sectors
  221.   // 1: no encoding for MODE1 and MODE2 sectors, MODE2_FORM1 and MODE2_FORM2
  222.   //    are extended by sub header and zero EDC/ECC data
  223.   int encodingMode() const { return encodingMode_; }
  224.   // disk read commands
  225.   
  226.   // analyzes the CD structure (Q sub-channels) of the inserted CD
  227.   virtual Toc *readDiskToc(int session, const char *);
  228.   // analyzes the CD structure and reads data
  229.   virtual Toc *readDisk(int session, const char *);
  230.   // returns information about inserted medium
  231.   virtual DiskInfo *diskInfo() { return 0; }
  232.   // Returns block size depending on given sector mode and 'encodingMode_'
  233.   // that must be used to send data to the recorder.
  234.   virtual long blockSize(TrackData::Mode) const;
  235.   // static functions
  236.   // Selects driver id for given vendor/model string. NULL is returned if
  237.   // no driver could be selected.
  238.   // readWrite: 0: select a driver for read operations
  239.   //            1: select a driver for write operations
  240.   // options: filled with option flags for vendor/model
  241.   static const char *selectDriver(int readWrite, const char *vendor,
  242.   const char *model, unsigned long *options);
  243.   // Creates instance of driver with specified id.
  244.   static CdrDriver *createDriver(const char *driverId, unsigned long options,
  245.  ScsiIf *);
  246.   // Prints list of all available driver ids.
  247.   static void printDriverIds();
  248.   // returns vendor/type of CD-R medium
  249.   static int cdrVendor(Msf &, const char **vendor, const char** mediumType);
  250. protected:
  251.   unsigned long options_; // driver option flags
  252.   ScsiIf *scsiIf_;
  253.   char *driverName_;
  254.   int hostByteOrder_; // 0: little endian, 1: big endian
  255.   int blockLength_; // length of data block for 'writeData' command
  256.   long blocksPerWrite_; // number of blocks that can be written with a
  257.                         // single SCSI WRITE command
  258.   char *zeroBuffer_; // zeroed buffer for writing zeros
  259.   
  260.   int speed_;
  261.   int simulate_;
  262.   int multiSession_;
  263.   int encodingMode_; // mode for encoding data sectors
  264.   int fastTocReading_;
  265.   int rawDataReading_;
  266.   int padFirstPregap_; // used by 'read-toc': defines if the first audio 
  267.                        // track's pre-gap is padded with zeros in the toc-file
  268.                        // or if it is taken from the data file
  269.   int onTheFly_; // 1 if operating in on-the-fly mode
  270.   int onTheFlyFd_; // file descriptor for on the fly data
  271.   const Toc *toc_;
  272.   SubChannel **scannedSubChannels_;
  273.   long maxScannedSubChannels_;
  274.   unsigned char *transferBuffer_;
  275.   // Byte order of audio samples read from the drive, e.g. with 
  276.   // 'readSubChannels()'. 0: little endian, 1: big endian
  277.   int audioDataByteOrder_; 
  278.   static unsigned char syncPattern[12];
  279.   static int speed2Mult(int);
  280.   static int mult2Speed(int);
  281.   virtual int sendCmd(const unsigned char *cmd, int cmdLen,
  282.       const unsigned char *dataOut, int dataOutLen,
  283.       unsigned char *dataIn, int dataInLen,
  284.       int showErrorMsg = 1) const;
  285.   virtual int getModePage(int pageCode, unsigned char *buf, long bufLen,
  286.   unsigned char *modePageHeader,
  287.   unsigned char *blockDesc, int showErrorMsg);
  288.   virtual int setModePage(const unsigned char *buf,
  289.   const unsigned char *modePageHeader,
  290.   const unsigned char *blockDesc, int showErrorMsg);
  291.   // some drives (e.g. Yamaha CDR100) don't implement mode sense/select(10)
  292.   virtual int getModePage6(int pageCode, unsigned char *buf, long bufLen,
  293.    unsigned char *modePageHeader,
  294.    unsigned char *blockDesc, int showErrorMsg);
  295.   virtual int setModePage6(const unsigned char *buf,
  296.    const unsigned char *modePageHeader,
  297.    const unsigned char *blockDesc, int showErrorMsg);
  298.   virtual int writeZeros(TrackData::Mode, long &lba, long encLba, long count);
  299.   // Returns track control flags for given track, bits 0-3 are always zero
  300.   virtual unsigned char trackCtl(const Track *track);
  301.   // Returns session format code for point A0 TOC entry, generated from
  302.   // stored 'toc_' object.
  303.   virtual unsigned char sessionFormat();
  304.   // readToc related functions:
  305.   // returns TOC data of specified session of inserted CD,
  306.   // a generic function is implemented in 'CdrDriver.cc', it will return
  307.   // the tracks of all session or of the first session depending on the
  308.   // drive
  309.   virtual CdToc *getToc(int sessionNr, int *nofTracks);
  310.   // Generic function to retrieve basic TOC data. Cannot distinguish
  311.   // between different sessions.
  312.   CdToc *getTocGeneric(int *nofTracks);
  313.   // Reads raw toc data of inserted CD. Used by base implementation of
  314.   // 'getToc()' and must be implemented by the actual driver.
  315.   virtual CdRawToc *getRawToc(int sessionNr, int *len) = 0;
  316.   // Reads CD-TEXT packs from the lead-in of a CD. The base implementation
  317.   // uses the SCSI-3/mmc commands.
  318.   virtual CdTextPack *readCdTextPacks(long *);
  319.   // reads CD-TEXT data and adds it to given 'Toc' object
  320.   int readCdTextData(Toc *);
  321.   // Tries to determine the data mode of specified track.
  322.   virtual TrackData::Mode getTrackMode(int trackNr, long trackStartLba);
  323.   // Determines mode of given sector, 'buf' should contain the sector header
  324.   // at the first 4 bytes followed by the sub-header for XA tracks.
  325.   // If an illegal mode is found in the sector header 'MODE0' will be
  326.   // returned.
  327.   TrackData::Mode determineSectorMode(unsigned char *buf);
  328.   // analyzes given 8 byte sub header and returns wether the sector is
  329.   // a MODE2, MODE2_FORM1 or MODE2_FORM2 sector
  330.   TrackData::Mode analyzeSubHeader(unsigned char *);
  331.   // Called by 'readDiskToc()' to retrieve following information about
  332.   // the track 'trackNr' with given start/end lba addresses:
  333.   // - all index increments, filled into 'index'/'indexCnt'
  334.   // - ISRC Code, filled into provided buffer 'isrcCode' (13 bytes)
  335.   // - length of pre-gap of next track, filled into 'pregap'
  336.   // - control nibbles read from track, filled into bits 0-3 of 'ctrl',
  337.   //   bit 7 must be set to indicate valid data
  338.   // This function must be overloaded by an actual driver.
  339.   // return: 0: OK, 1: error occured
  340.   virtual int analyzeTrack(TrackData::Mode, int trackNr, long startLba,
  341.    long endLba, Msf *index,
  342.    int *indexCnt, long *pregap, char *isrcCode,
  343.    unsigned char *ctl) = 0;
  344.   // Track analysis algorithm using the binary search method. The base
  345.   // class implements the basic algorithm. It uses 'findIndex()' which
  346.   // can be implemented by an actual driver to get the track and index
  347.   // number at a specific block address. This base class contains an
  348.   // implementation of 'findIndex()', too, that can be usually used.
  349.   // It'll be always better to use the linear scan algorithm (see below)
  350.   // if possible.
  351.   int analyzeTrackSearch(TrackData::Mode, int trackNr, long startLba,
  352.    long endLba, Msf *index,
  353.    int *indexCnt, long *pregap, char *isrcCode,
  354.    unsigned char *ctl);
  355.   // finds position (lba) where index for given track number switches to
  356.   // 'index' (binary search, base algorithm is implemented in 'CdrDriver').
  357.   // It uses the method 'getTrackIndex()' which must be overloaded by
  358.   // the actual driver.
  359.   virtual long findIndex(int track, int index, long trackStart, long trackEnd);
  360.   // Retrieves track, index and control nibbles at given lba address. Must
  361.   // be implemented by the driver if the binary search method 
  362.   // ('analyzeTrackSearch()') should be used.
  363.   virtual int getTrackIndex(long lba, int *trackNr, int *indexNr, 
  364.     unsigned char *ctl);
  365.   // Basic track analyzis using the linear scan algorithm. The base class
  366.   // implements the basic algorithm which calls 'readSubChannels()' to
  367.   // read the sub-channel data. Actual drivers should overload the
  368.   // 'readSubChannels()' function.
  369.   int analyzeTrackScan(TrackData::Mode, int trackNr, long startLba,
  370.        long endLba, Msf *index, int *indexCnt, long *pregap,
  371.        char *isrcCode, unsigned char *ctl);
  372.   // Reads 'len' sub-channels from sectors starting  at 'lba'.
  373.   // The returned vector contains 'len' pointers to 'SubChannel' objects.
  374.   // Audio data that is usually retrieved with the sub-channels is placed
  375.   // in 'buf' if it is not NULL.
  376.   // Used by 'analyzeTrackScan()' and 'readAudioRangeParanoia()'.
  377.   virtual int readSubChannels(long lba, long len, SubChannel ***, Sample *buf);
  378.   // Determines the readable length of a data track and the pre-gap length
  379.   // of the following track. The implementation in the base class should
  380.   // be suitable for all drivers.
  381.   virtual int analyzeDataTrack(TrackData::Mode mode, int trackNr,
  382.        long startLba, long endLba, long *pregap);
  383.   // Reads 'len' data sectors starting at 'lba' and returns the number of
  384.   // successfully read sectors. If the end of the current track is encountered
  385.   // the returned value will be smaller than 'len' down to 0. If a read
  386.   // error occus -1 is returned. If a L-EC error occures -2 is returned.
  387.   // This method is used by 'readDataTrack'/'analyzeDataTrack' and must be
  388.   // overloaded by the actual driver.
  389.   virtual long readTrackData(TrackData::Mode mode, long lba, long len,
  390.      unsigned char *buf);
  391.   // Reads a complete data track and saves data to a file.
  392.   virtual int readDataTrack(int fp, long start, long end,
  393.     TrackInfo *trackInfo);
  394.   // Reads the audio data of given audio track range 'startTrack', 'endTrack'.
  395.   // 'trackInfo' is am array of TrackInfo structures for all tracks. 
  396.   // This function is called by 'readDisk()' and must be overloaded by the
  397.   // actual driver.
  398.   virtual int readAudioRange(int fp, long start, long end,
  399.      int startTrack, int endTrack, 
  400.      TrackInfo *trackInfo) = 0;
  401.   // Reads catalog number by scanning the sub-channels.
  402.   // Uses 'readSubChannels()' to read the the sub-channels.
  403.   int readCatalogScan(char *mcnCode, long startLba, long endLba);
  404.   // Reads catalog number and stores it in given 'Toc' object. Must be
  405.   // implemented by the actual driver. 'startLba' and 'endLba' specify
  406.   // the allowed range for sub-channel scanning.
  407.   virtual int readCatalog(Toc *toc, long startLba, long endLba) = 0;
  408.   // Reads ISRC code and writes into provided 13 bytes buffer. Must be
  409.   // implemented by the actual driver.
  410.   virtual int readIsrc(int trackNr, char *) = 0;
  411.   // Build Toc object from gathered TrackInfo data
  412.   Toc *buildToc(TrackInfo *trackInfos, long nofTrackInfos, int padFirstPregap);
  413.   // sets block size for read/write operations
  414.   virtual int setBlockSize(long blocksize);
  415.   void printCdToc(CdToc *toc, int tocLen);
  416.   // Interface for Monty's paranoia library:
  417. public:
  418.   // function called from 'cdda_read()' to read the audio data, currently
  419.   // public because I did not manage to define a friend function that has
  420.   // C linkage :)
  421.   long paranoiaRead(Sample *buffer, long startLba, long len);
  422. protected:
  423.   // Extracts audio data for given track range with the help of 
  424.   // Monty's paranoia library.
  425.   int readAudioRangeParanoia(int fp, long start, long end,
  426.      int startTrack, int endTrack, 
  427.      TrackInfo *trackInfo);
  428. private:
  429.   // dynamic data
  430.   void *paranoia_;                    // paranoia structure
  431.   struct cdrom_drive *paranoiaDrive_; // paranoia device
  432.   int paranoiaMode_;                  // paranoia mode
  433.   TrackInfo *paranoiaTrackInfo_;
  434.   int paranoiaStartTrack_;
  435.   int paranoiaEndTrack_;
  436.   long paranoiaActLba_;
  437.   int paranoiaActTrack_;
  438.   int paranoiaActIndex_;
  439.   long paranoiaCrcCount_;
  440.   int paranoiaError_;
  441.   long paranoiaProgress_;
  442.   // callback for the paranoia library, does nothing, currently
  443.   static void paranoiaCallback(long, int);
  444.   // friend classes:
  445.   friend class CDD2600Base;
  446. };
  447. #endif