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

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: TrackData.h,v $
  21.  * Revision 1.9  1999/04/02 20:36:21  mueller
  22.  * Created implementation class that contains all mutual member data.
  23.  *
  24.  * Revision 1.8  1999/03/27 19:49:29  mueller
  25.  * Added data file support.
  26.  *
  27.  * Revision 1.7  1999/01/24 15:59:52  mueller
  28.  * Added static member functions 'waveLength()', 'audioDataLength()' and
  29.  * 'audioFileType()'.
  30.  * Fixed handling of WAVE files as indicated by Eberhard Mattes. The length
  31.  * of audio data is now taken from the WAVE header instead assuming that
  32.  * the audio data reaches until the end of the file.
  33.  *
  34.  * Revision 1.6  1999/01/10 15:13:02  mueller
  35.  * Added function 'checkAudioFile()'.
  36.  *
  37.  * Revision 1.5  1998/11/21 18:07:55  mueller
  38.  * Added on-the-fly writing patch from Michael Weber <Michael.Weber@Post.RWTH-AAchen.DE>
  39.  *
  40.  * Revision 1.4  1998/11/15 12:15:18  mueller
  41.  * Added member functions 'split()' and 'merge()'.
  42.  *
  43.  * Revision 1.3  1998/09/22 19:17:19  mueller
  44.  * Added seeking to and reading of samples for GUI.
  45.  *
  46.  * Revision 1.2  1998/07/28 13:46:39  mueller
  47.  * Automatic length determination of audio files is now done in 'AudioData'.
  48.  *
  49.  */
  50. #ifndef __TRACKDATA_H__
  51. #define __TRACKDATA_H__
  52. #include <iostream.h>
  53. #include "Sample.h"
  54. #define AUDIO_BLOCK_LEN 2352
  55. #define MODE0_BLOCK_LEN 2336
  56. #define MODE1_BLOCK_LEN 2048
  57. #define MODE2_BLOCK_LEN 2336
  58. #define MODE2_FORM1_DATA_LEN 2048
  59. #define MODE2_FORM2_DATA_LEN 2324
  60. class TrackData {
  61. public:
  62.   enum Mode { AUDIO, MODE0, MODE1, MODE2, MODE2_FORM1, MODE2_FORM2,
  63.               MODE2_FORM_MIX, MODE1_RAW, MODE2_RAW };
  64.   enum Type { DATAFILE, ZERODATA, STDIN };
  65.   
  66.   enum FileType { RAW, WAVE };
  67.   // creates an audio mode file entry
  68.   TrackData(const char *filename, long offset, unsigned long start,
  69.     unsigned long length);
  70.   TrackData(const char *filename, unsigned long start, unsigned long length);
  71.   // creates a zero data entry with given mode
  72.   TrackData(Mode, unsigned long length);
  73.   // creates a file entry with given mode
  74.   TrackData(Mode, const char *filename, long offset,
  75.     unsigned long length);
  76.   TrackData(Mode, const char *filename, unsigned long length);
  77.   // copy constructor
  78.   TrackData(const TrackData &);
  79.   ~TrackData();
  80.   Type type() const;
  81.   Mode mode() const;
  82.   const char *filename() const;
  83.   unsigned long startPos() const;
  84.   unsigned long length() const;
  85.   // sets/returns flag for swapping expected byte order of audio samples
  86.   void swapSamples(int);
  87.   int swapSamples() const;
  88.   int determineLength();
  89.   int check() const;
  90.   void split(unsigned long, TrackData **part1, TrackData **part2);
  91.   TrackData *merge(const TrackData *) const;
  92.   void print(ostream &) const;
  93.   static int checkAudioFile(const char *fn, unsigned long *length);
  94.   static int waveLength(const char *filename, long offset, long *hdrlen,
  95. unsigned long *datalen = 0);
  96.   static int audioDataLength(const char *fname, long offset,
  97.      unsigned long *length);
  98.   static FileType audioFileType(const char *filename);
  99.   static int dataFileLength(const char *fname, long offset,
  100.     unsigned long *length);
  101.   static unsigned long dataBlockSize(Mode m);
  102.   static const char *mode2String(Mode m);
  103. private:
  104.   Type type_; // type of data (file, stdin, zero)
  105.   Mode mode_; // data mode for recording (audio, mode0, mode1, ...)
  106.   FileType fileType_; // only for audio mode data, type of file (raw, wave)
  107.   char *filename_; // used for object type 'FILE'
  108.   long offset_; // byte offset into file
  109.   unsigned long length_; // length of data in samples (for audio data) or bytes
  110.   // only used for audio files:
  111.   unsigned long startPos_; // starting sample within file, 
  112.                            // used for object type 'FILE', mode 'AUDIO'
  113.   int swapSamples_;        // 1 if expected byte order of audio samples should
  114.                            // be swapped
  115.   friend class TrackDataReader;
  116.   void init(const char *filename, long offset, unsigned long start,
  117.     unsigned long length);
  118.   void init(Mode, const char *filename, long offset,
  119.     unsigned long length);
  120.   
  121. };
  122. class TrackDataReader {
  123. public:
  124.   TrackDataReader(const TrackData * = 0);
  125.   ~TrackDataReader();
  126.   void init(const TrackData *);
  127.   int openData();
  128.   void closeData();
  129.   long readData(Sample *buffer, long len);
  130.   int seekSample(unsigned long sample);
  131.   // returns number of bytes/samples that are left for reading
  132.   unsigned long readLeft() const;
  133. private:
  134.   const TrackData *trackData_;
  135.   int open_;  // 1: data can be retrieved with 'readData()', 'fd_' is valid if
  136.               // object type is 'FILE'
  137.   int fd_;         // used for object type 'FILE'
  138.   unsigned long readPos_; // actual read position (samples or bytes)
  139.                           // (0 .. length_-1)
  140.   long headerLength_; // length of audio file header
  141.   int readUnderRunMsgGiven_;
  142. };
  143. inline
  144. TrackData::Type TrackData::type() const
  145. {
  146.   return type_;
  147. }
  148. inline
  149. TrackData::Mode TrackData::mode() const
  150. {
  151.   return mode_;
  152. }
  153. inline
  154. const char *TrackData::filename() const
  155. {
  156.   return filename_;
  157. }
  158. inline
  159. unsigned long TrackData::startPos() const
  160. {
  161.   return startPos_;
  162. }
  163. inline
  164. void TrackData::swapSamples(int f)
  165. {
  166.   swapSamples_ = f != 0 ? 1 : 0;
  167. }
  168. inline
  169. int TrackData::swapSamples() const
  170. {
  171.   return swapSamples_;
  172. }
  173. #endif