home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / cdtst105.zip / readcd.h < prev    next >
C/C++ Source or Header  |  1999-01-01  |  3KB  |  135 lines

  1. typedef struct
  2. {
  3.     UCHAR frame;
  4.     UCHAR second;
  5.     UCHAR minute;
  6.     UCHAR empty;
  7. } MSF;
  8.  
  9. #define MODE_LBA 0
  10. #define MODE_MSF 1
  11.  
  12. typedef struct
  13. {
  14.    UCHAR signature[4];
  15.    UCHAR addressingMode; /* 0 = LBA, 1 = MSF */
  16.    MSF start; /* can be LBA */
  17.    MSF end;
  18. } CDPLAYAUDIOPARAM;
  19.  
  20. typedef struct
  21. {
  22.     UCHAR firstTrack;
  23.     UCHAR lastTrack;
  24.     MSF leadOutAddress;
  25. } CDAUDIODISKINFODATA;
  26.  
  27. typedef struct
  28. {
  29.     UCHAR signature[4];
  30.     UCHAR trackNum;
  31. } CDAUDIOTRACKINFOPARAM;
  32.  
  33. typedef struct
  34. {
  35.     MSF address;
  36.     UCHAR info;
  37.     #if 0
  38.         bit 7  4 or 2 channels
  39.         bit 6  data or audio track
  40.         bit 5  copy ok or not ok
  41.         bit 4  with or without preemp
  42.         bit 3-0 ADR stuff?? whatever that is
  43.     #endif
  44. } CDAUDIOTRACKINFODATA;
  45.  
  46. typedef struct
  47. {
  48.    MSF start;
  49.    MSF end;
  50.    MSF length;
  51.    ULONG size;
  52.    BOOL data;
  53.    USHORT channels;
  54.    USHORT number;
  55. } CDTRACKINFO;
  56.  
  57.  
  58. #pragma pack(1)
  59. typedef struct
  60. {
  61.    UCHAR signature[4];
  62.    UCHAR addressingMode; /* 0 = LBA, 1 = MSF */
  63.    USHORT numberSectors;
  64.    ULONG startSector;
  65.    UCHAR reserved;
  66.    UCHAR interleaveSize;
  67.    UCHAR interleaveSkipFactor;
  68. } CDREADLONGPARAM;
  69. #pragma pack()
  70.  
  71. typedef struct
  72. {
  73.    UCHAR sync[12];
  74.    UCHAR header[4];
  75.    UCHAR data[2048];
  76.    UCHAR EDC_ECC[288];
  77. } CDREADLONGDATA;
  78.  
  79.  
  80. class CD_drive
  81. {
  82.    public:
  83.       CD_drive();
  84.       ~CD_drive();
  85.  
  86.       bool open(char *drive);
  87.       bool close();
  88.       bool readCDInfo();
  89.       bool fillTrackInfo();
  90.       bool play(char track);
  91.       bool stop();
  92.       bool readSectors(CDREADLONGDATA data[], ULONG number, ULONG start);
  93.  
  94.       char getCount() { return cdInfo.lastTrack - cdInfo.firstTrack + 1; };
  95.       CDTRACKINFO *getTrackInfo(char pos)
  96.          { return &trackInfo[pos]; };
  97.       CDAUDIODISKINFODATA *getCDInfo()
  98.          { return &cdInfo; };
  99.  
  100.       USHORT getTime()
  101.          { return (cdInfo.leadOutAddress.minute*60 + cdInfo.leadOutAddress.second) -
  102.                   (trackInfo[0].start.minute*60 + trackInfo[0].start.second); };
  103.  
  104.  
  105.       static ULONG getLBA(MSF input)
  106.       {
  107.          return (input.minute * 4500 + input.second * 75 + input.frame - 150);
  108.       };
  109.  
  110.       static MSF getMSF(ULONG input)
  111.       {
  112.          MSF output;
  113.  
  114.          input += 150;
  115.          output.frame = input % 75;
  116.          input /= 75;
  117.          output.second = input % 60;
  118.          output.minute = input / 60;
  119.  
  120.          return output;
  121.       };
  122.  
  123.  
  124.    protected:
  125.       bool opened; /* hCDDrive cannot be negative and 0 is a valid handle
  126.                       so I keep another variable around */
  127.       HFILE hCDDrive;
  128.       CDAUDIODISKINFODATA cdInfo;
  129.       CDTRACKINFO *trackInfo;
  130.  
  131.  
  132.       bool readTrackInfo(char track, CDTRACKINFO *trackInfo);
  133. };
  134.  
  135.