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