1 /* cdrdao - write audio CD-Rs in disc-at-once mode 2 * 3 * Copyright (C) 1998-2002 Andreas Mueller <andreas@daneb.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 #ifndef __SUB_CHANNEL_H__ 21 #define __SUB_CHANNEL_H__ 22 23 class SubChannel { 24 public: 25 enum Type { QMODE1TOC, // toc data 26 QMODE1DATA, // current position in data 27 QMODE2, // Catalog number 28 QMODE3, // ISRC code 29 QMODE5TOC, // toc data 30 QMODE_ILLEGAL // indicates illegal adr field 31 }; 32 33 SubChannel(); 34 virtual ~SubChannel(); 35 36 // marks the CRC of this sub-channel as invalid, 'checkCrc()' will always 37 // return true for such sub-channels 38 void crcInvalid(); 39 40 // virtual constructors: 41 // create sub channel with specified q-mode 42 virtual SubChannel *makeSubChannel(Type) = 0; 43 // create sub channel with reading sub channel data from given buffer 44 virtual SubChannel *makeSubChannel(unsigned char *) = 0; 45 46 virtual void type(unsigned char) = 0; // sets Q mode type 47 virtual Type type() const; // return Q mode type 48 49 virtual long dataLength() const = 0; // returns number of sub channel bytes 50 51 virtual void pChannel(int) = 0; // sets P channel bit 52 53 virtual void ctl(int) = 0; // sets control flags 54 virtual unsigned char ctl() const = 0; // return control nibbles in bits 0-3 55 56 virtual void trackNr(int) = 0; // sets track number (QMODE1DATA) 57 virtual int trackNr() const = 0; // returns track number (QMODE1DATA) 58 59 virtual void indexNr(int) = 0; // sets index number (QMODE1DATA) 60 virtual int indexNr() const = 0; // returns index number (QMODE1DATA) 61 62 virtual void point(int) = 0; // sets point filed (QMODE1TOC, QMODE5TOC) 63 64 virtual void min(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) 65 virtual int min() const = 0; 66 67 virtual void sec(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) 68 virtual int sec() const = 0; 69 70 virtual void frame(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) 71 virtual int frame() const = 0; 72 73 virtual void amin(int) = 0; // absolute time (QMODE1DATA) 74 virtual int amin() const = 0; 75 76 virtual void asec(int) = 0; // absolute time (QMODE1DATA) 77 virtual int asec() const = 0; 78 79 virtual void aframe(int) = 0; // absolute time (QMODE1DATA, QMODE2, QMODE3) 80 virtual int aframe() const = 0; 81 82 virtual void pmin(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) 83 virtual void psec(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) 84 virtual void pframe(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) 85 86 virtual void zero(int) = 0; // zero field (QMODE5TOC) 87 88 // set catalog number (QMODE2) 89 virtual void catalog(char, char, char, char, char, char, char, char, char, 90 char, char, char, char) = 0; 91 // return catalog number 92 virtual const char *catalog() const = 0; 93 94 // set ISRC code (QMODE3) 95 virtual void isrc(char, char, char, char, char, char, char, char, char, 96 char, char, char) = 0; 97 98 // returns ISRC code 99 virtual const char *isrc() const = 0; 100 101 virtual void print() const = 0; 102 103 virtual void calcCrc() = 0; // calculates crc and stores it in crc fields 104 virtual int checkCrc() const = 0; 105 106 virtual int checkConsistency(); 107 108 virtual const unsigned char *data() const = 0; 109 110 static unsigned char ascii2Isrc(char); 111 static char isrc2Ascii(unsigned char); 112 113 static unsigned char bcd(int); 114 static int bcd2int(unsigned char d); 115 static int isBcd(unsigned char); 116 117 protected: 118 Type type_; 119 int crcValid_; // 0 if sub channel has no valid CRC that can be checked, 120 // 1 if CRC is valid and can be checked 121 static unsigned short crctab[256]; 122 123 static void encodeCatalogNumber(unsigned char *, char, char, char, char, 124 char, char, char, char, char, char, char, 125 char, char); 126 static void decodeCatalogNumber(const unsigned char *, char *, char *, 127 char *, char *, char *, char *, char *, 128 char *, char *, char *, char *, char *, 129 char *); 130 131 static void encodeIsrcCode(unsigned char *, char, char, char, char, char, 132 char, char, char, char, char, char, char); 133 static void decodeIsrcCode(const unsigned char *in, char *c1, char *c2, 134 char *o1, char *o2, char *o3, char *y1, 135 char *y2, char *s1, char *s2, char *s3, 136 char *s4, char *s5); 137 138 }; 139 140 #endif 141