/* cdrdao - write audio CD-Rs in disc-at-once mode * * Copyright (C) 1998-2002 Andreas Mueller * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef __SUB_CHANNEL_H__ #define __SUB_CHANNEL_H__ class SubChannel { public: enum Type { QMODE1TOC, // toc data QMODE1DATA, // current position in data QMODE2, // Catalog number QMODE3, // ISRC code QMODE5TOC, // toc data QMODE_ILLEGAL // indicates illegal adr field }; SubChannel(); virtual ~SubChannel(); // marks the CRC of this sub-channel as invalid, 'checkCrc()' will always // return true for such sub-channels void crcInvalid(); // virtual constructors: // create sub channel with specified q-mode virtual SubChannel *makeSubChannel(Type) = 0; // create sub channel with reading sub channel data from given buffer virtual SubChannel *makeSubChannel(unsigned char *) = 0; virtual void type(unsigned char) = 0; // sets Q mode type virtual Type type() const; // return Q mode type virtual long dataLength() const = 0; // returns number of sub channel bytes virtual void pChannel(int) = 0; // sets P channel bit virtual void ctl(int) = 0; // sets control flags virtual unsigned char ctl() const = 0; // return control nibbles in bits 0-3 virtual void trackNr(int) = 0; // sets track number (QMODE1DATA) virtual int trackNr() const = 0; // returns track number (QMODE1DATA) virtual void indexNr(int) = 0; // sets index number (QMODE1DATA) virtual int indexNr() const = 0; // returns index number (QMODE1DATA) virtual void point(int) = 0; // sets point filed (QMODE1TOC, QMODE5TOC) virtual void min(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) virtual int min() const = 0; virtual void sec(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) virtual int sec() const = 0; virtual void frame(int) = 0; // track relative time (QMODE1TOC, QMODE1DATA, QMODE5TOC) virtual int frame() const = 0; virtual void amin(int) = 0; // absolute time (QMODE1DATA) virtual int amin() const = 0; virtual void asec(int) = 0; // absolute time (QMODE1DATA) virtual int asec() const = 0; virtual void aframe(int) = 0; // absolute time (QMODE1DATA, QMODE2, QMODE3) virtual int aframe() const = 0; virtual void pmin(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) virtual void psec(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) virtual void pframe(int) = 0; // track start time (QMODE1TOC, QMODE5TOC) virtual void zero(int) = 0; // zero field (QMODE5TOC) // set catalog number (QMODE2) virtual void catalog(char, char, char, char, char, char, char, char, char, char, char, char, char) = 0; // return catalog number virtual const char *catalog() const = 0; // set ISRC code (QMODE3) virtual void isrc(char, char, char, char, char, char, char, char, char, char, char, char) = 0; // returns ISRC code virtual const char *isrc() const = 0; virtual void print() const = 0; virtual void calcCrc() = 0; // calculates crc and stores it in crc fields virtual int checkCrc() const = 0; virtual int checkConsistency(); virtual const unsigned char *data() const = 0; static unsigned char ascii2Isrc(char); static char isrc2Ascii(unsigned char); static unsigned char bcd(int); static int bcd2int(unsigned char d); static int isBcd(unsigned char); protected: Type type_; int crcValid_; // 0 if sub channel has no valid CRC that can be checked, // 1 if CRC is valid and can be checked static unsigned short crctab[256]; static void encodeCatalogNumber(unsigned char *, char, char, char, char, char, char, char, char, char, char, char, char, char); static void decodeCatalogNumber(const unsigned char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *, char *); static void encodeIsrcCode(unsigned char *, char, char, char, char, char, char, char, char, char, char, char, char); static void decodeIsrcCode(const unsigned char *in, char *c1, char *c2, char *o1, char *o2, char *o3, char *y1, char *y2, char *s1, char *s2, char *s3, char *s4, char *s5); }; #endif