home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: SysTools / SysTools.zip / cdtest10.zip / readcd.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-12-31  |  5.7 KB  |  232 lines

  1. /* CD2MP3 PM 1.0 (C) 1998 Samuel Audet <guardia@cam.org> */
  2.  
  3. #define INCL_PM
  4. #define INCL_DOSDEVIOCTL
  5. #define INCL_DOS
  6. #include <os2.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <stdio.h>
  10.  
  11. #include "miscsam.h"
  12. #include "pmsam.h"
  13. #include "readcd.h"
  14.  
  15. CD_drive::~CD_drive()
  16. {
  17.    free(trackInfo);
  18.    if(opened) close();
  19. }
  20.  
  21. CD_drive::CD_drive()
  22. {
  23.    memset(this,0,sizeof(*this));
  24. }
  25.  
  26.  
  27. bool CD_drive::open(char *drive)
  28. {
  29.    ULONG ulAction;
  30.    ULONG rc;
  31.  
  32.    rc = DosOpen(drive, &hCDDrive, &ulAction, 0,
  33.                 FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
  34.                 OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
  35.                 OPEN_FLAGS_DASD, NULL);
  36.  
  37.    if(rc)
  38.    {
  39.       updateError("DosOpen failed with return code %d\n",rc);
  40.       return false;
  41.    }
  42.  
  43.    opened = true;
  44.    return true;
  45. }
  46.  
  47. bool CD_drive::close()
  48. {
  49.    ULONG rc;
  50.    rc = DosClose(hCDDrive);
  51.    opened = false;
  52.    if(rc)
  53.    {
  54.       updateError("DosClose failed with return code %d\n",rc);
  55.       return false;
  56.    }
  57.  
  58.    return true;
  59. }
  60.  
  61. bool CD_drive::readCDInfo()
  62. {
  63.    ULONG ulParamLen;
  64.    ULONG ulDataLen;
  65.    ULONG rc;
  66.    BOOL returnBool = FALSE;
  67.  
  68.    rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
  69.                     "CD01", 4, &ulParamLen, &cdInfo,
  70.                     sizeof(cdInfo), &ulDataLen);
  71.    if(rc)
  72.       updateError("DosDevIOCtl failed with return code %d\n",rc);
  73.    else
  74.       returnBool = TRUE;
  75.  
  76.    return returnBool;
  77. }
  78.  
  79. bool CD_drive::readTrackInfo(char track, CDTRACKINFO *trackInfo2)
  80. {
  81.    ULONG ulParamLen;
  82.    ULONG ulDataLen;
  83.    ULONG rc;
  84.    BOOL returnBool = FALSE;
  85.  
  86.    CDAUDIOTRACKINFOPARAM trackParam;
  87.    CDAUDIOTRACKINFODATA  trackInfo[2];
  88.  
  89.    trackParam.signature[0] = 'C';
  90.    trackParam.signature[1] = 'D';
  91.    trackParam.signature[2] = '0';
  92.    trackParam.signature[3] = '1';
  93.  
  94.    trackParam.trackNum = track;
  95.    rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
  96.                     &trackParam, sizeof(trackParam),
  97.                     &ulParamLen, &trackInfo[0],
  98.                     sizeof(trackInfo[0]), &ulDataLen);
  99.    if(rc)
  100.       updateError("DosDevIOCtl failed with return code %d\n",rc);
  101.    else
  102.    {
  103.       trackParam.trackNum = track+1;
  104.       rc = 0;
  105.       if(trackParam.trackNum <= cdInfo.lastTrack)
  106.       {
  107.          rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
  108.                           &trackParam, sizeof(trackParam),
  109.                           &ulParamLen, &trackInfo[1],
  110.                           sizeof(trackInfo[1]), &ulDataLen);
  111.  
  112.          if(rc)
  113.             updateError("DosDevIOCtl failed with return code %d\n",rc);
  114.       }
  115.       else
  116.           trackInfo[1].address = cdInfo.leadOutAddress;
  117.  
  118.       if(!rc)
  119.       {
  120.          ULONG LBA[2];
  121.          MSF length;
  122.  
  123.          LBA[0] = getLBA(trackInfo[0].address);
  124.          LBA[1] = getLBA(trackInfo[1].address);
  125.  
  126.          /* -150 because we want length, not an address */
  127.          length = getMSF(LBA[1]-LBA[0]-150);
  128.  
  129.          trackInfo2->start = trackInfo[0].address;
  130.          trackInfo2->end = trackInfo[1].address;
  131.          trackInfo2->length = length;
  132.          trackInfo2->size = (LBA[1]-LBA[0])*2352;
  133.          trackInfo2->data = (trackInfo[0].info & 0x40) ? TRUE : FALSE;
  134.          trackInfo2->channels = (trackInfo[0].info & 0x80) ? 4 : 2;
  135.          trackInfo2->number = track;
  136.  
  137.          returnBool = TRUE;
  138.       }
  139.    }
  140.    return returnBool;
  141. }
  142.  
  143.  
  144. bool CD_drive::fillTrackInfo()
  145. {
  146.    int i,e;
  147.  
  148.    trackInfo = (CDTRACKINFO *) realloc(trackInfo, getCount() * sizeof(*trackInfo));
  149.  
  150.    e = 0;
  151.    for(i = cdInfo.firstTrack; i <= cdInfo.lastTrack; i++)
  152.       if(!readTrackInfo(i, &trackInfo[e++]))
  153.          return false;
  154.  
  155.    return true;
  156. }
  157.  
  158.  
  159. bool CD_drive::play(char track)
  160. {
  161.    ULONG ulParamLen;
  162.    ULONG ulDataLen;
  163.    ULONG rc;
  164.    BOOL returnBool = FALSE;
  165.    CDPLAYAUDIOPARAM playParam;
  166.    CDTRACKINFO trackInfo;
  167.  
  168.    playParam.signature[0] = 'C';
  169.    playParam.signature[1] = 'D';
  170.    playParam.signature[2] = '0';
  171.    playParam.signature[3] = '1';
  172.    playParam.addressingMode = MODE_MSF;
  173.  
  174.    if(!readTrackInfo(track, &trackInfo))
  175.        return FALSE;
  176.    playParam.start = trackInfo.start;
  177.    playParam.end = trackInfo.end;
  178.  
  179.    rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO,
  180.                     &playParam, sizeof(playParam),
  181.                     &ulParamLen, NULL,
  182.                     0, &ulDataLen);
  183.    if(rc)
  184.       updateError("DosDevIOCtl failed with return code %d\n",rc);
  185.    else
  186.       returnBool = TRUE;
  187.  
  188.    return returnBool;
  189. }
  190.  
  191. bool CD_drive::stop()
  192. {
  193.    ULONG ulParamLen;
  194.    ULONG ulDataLen;
  195.    ULONG rc;
  196.    BOOL returnBool = FALSE;
  197.  
  198.    rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_STOPAUDIO,
  199.                     "CD01", 4, &ulParamLen, NULL, 0, &ulDataLen);
  200.    if(rc)
  201.       updateError("DosDevIOCtl failed with return code %d\n",rc);
  202.    else
  203.       returnBool = TRUE;
  204.    return returnBool;
  205. }
  206.  
  207. bool CD_drive::readSectors(CDREADLONGDATA data[], ULONG number, ULONG start)
  208. {
  209.    ULONG ulParamLen;
  210.    ULONG ulDataLen;
  211.    ULONG rc;
  212.    BOOL returnBool = FALSE;
  213.    CDREADLONGPARAM readParam = {0};
  214.  
  215.    readParam.signature[0] = 'C';
  216.    readParam.signature[1] = 'D';
  217.    readParam.signature[2] = '0';
  218.    readParam.signature[3] = '1';
  219.    readParam.addressingMode = MODE_LBA;
  220.    readParam.numberSectors = number;
  221.    readParam.startSector = start;
  222.  
  223.    rc = DosDevIOCtl(hCDDrive, IOCTL_CDROMDISK, CDROMDISK_READLONG,
  224.                     &readParam, sizeof(readParam), &ulParamLen,
  225.                     data, sizeof(*data)*number, &ulDataLen);
  226.    if(rc)
  227.       updateError("DosDevIOCtl failed with return code %d\n",rc);
  228.    else
  229.       returnBool = TRUE;
  230.    return returnBool;
  231. }
  232.