home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1999 November / PCONLINE_11_99.ISO / filesbbs / OS2 / ACDCR032.ZIP / source / playcd.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-06-30  |  5.0 KB  |  214 lines

  1. #define INCL_DOSDEVIOCTL
  2. #define INCL_DOSFILEMGR
  3.  
  4.  
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "trackobject.hh"
  8.  
  9. HFILE openDrive(char* drive);
  10. void closeDrive(HFILE hfDrive);
  11. ULONG CDQueryAudioCDTracks(HFILE hfDrive);
  12. BOOL  CDPlayTrack(ULONG numTrack, char * drive);
  13.  
  14.  
  15. typedef struct{
  16.     UCHAR   ucFirstTrack;
  17.     UCHAR     ucLastTrack;
  18.     ULONG   ulLeadOut;
  19. }CDINFO;
  20.  
  21. typedef struct{
  22.     ULONG   ulLeadOut;
  23.     UCHAR   ucFirstTrack;
  24.     UCHAR     ucLastTrack;
  25. }CDINFO2;
  26.  
  27. typedef struct
  28. {
  29.     ULONG ulTrackAddress;
  30.     UCHAR ucTCInfo;
  31. }myTRACKINFO;
  32.  
  33. typedef struct
  34. {
  35.     UCHAR signature[4];
  36.     UCHAR  ucTrackNum;
  37. }TINFOPARAM;
  38.  
  39. typedef struct
  40. {
  41.     UCHAR ucFrames;
  42.     UCHAR ucSeconds;
  43.     UCHAR ucMinutes;
  44.     UCHAR ucNotUsed;
  45. }MSF;
  46.  
  47. typedef struct
  48. {
  49.   UCHAR signature[4];
  50.   UCHAR  ucAddressMode;
  51.   UCHAR ucStartSector[4];
  52.   UCHAR ucEndSector[4];
  53. }PLAYPARAM;
  54.  
  55.  
  56. HFILE extern openDrive(char* drive)
  57. {
  58.     HFILE hfDrive = 0;
  59.     ULONG ulAction;
  60.     ULONG rc;
  61.     
  62.     rc = DosOpen(drive, &hfDrive, &ulAction, 0,
  63.                      FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
  64.                      OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
  65.                      OPEN_FLAGS_DASD, NULL);    
  66.  
  67.     if(rc)
  68.         return NULL;//Error
  69.  
  70.     return hfDrive;
  71. }
  72.  
  73. void extern closeDrive(HFILE hfDrive)
  74. {
  75.     DosClose(hfDrive);    
  76. }
  77.  
  78.  
  79. /*****************************************/
  80. /*                                       */
  81. /* Plays track #numTrack on              */
  82. /* CD-Drive 'drive'                      */
  83. /*                                       */
  84. /* Returns TRUE if successful            */
  85. /*                                       */
  86. /*****************************************/
  87. BOOL CDPlayTrack(ULONG numTrack, char * drive)
  88. {
  89.     HFILE hfDrive;
  90.     ULONG ulParamLen;
  91.     ULONG ulDataLen;
  92.     ULONG rc;
  93.     CDINFO cdInfo;
  94.     TINFOPARAM tip;
  95.     myTRACKINFO trackInfo[2];
  96.     PLAYPARAM playParam;
  97.  
  98.     printf("Track: %d\n",numTrack);
  99.     hfDrive=openDrive(drive);
  100.     if(!hfDrive) return FALSE;
  101.     do {
  102.     /* Get cd info */
  103.         ulDataLen=sizeof(cdInfo);
  104.         ulParamLen=4;
  105.         rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
  106.                                          "CD01", 4, &ulParamLen, &cdInfo,
  107.                                          sizeof(cdInfo), &ulDataLen);        
  108.         if(rc)
  109.             break;//Error
  110.         ulDataLen=sizeof(trackInfo);
  111.         ulParamLen=sizeof(TINFOPARAM);
  112.         tip.signature[0]='C';
  113.         tip.signature[1]='D';    
  114.         tip.signature[2]='0';
  115.         tip.signature[3]='1';
  116.         /* Get information about our track */
  117.         tip.ucTrackNum=numTrack;
  118.         rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
  119.                                          &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
  120.                                          sizeof(trackInfo[0]), &ulDataLen);
  121.         if(rc) 
  122.             break;//Error
  123.         /* Get information about next track */
  124.         tip.ucTrackNum=numTrack+1;
  125.         if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
  126.             rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
  127.                                              &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
  128.                                              sizeof(trackInfo[1]), &ulDataLen);
  129.             if(rc) 
  130.                 break;//Error
  131.         }
  132.         else {
  133.           /* The following does not work on my system. Compilerbug ? 
  134.              trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut; */
  135.           BYTE *cdInfoBytes;
  136.           cdInfoBytes=(BYTE*)&cdInfo;
  137.           cdInfoBytes+=2;
  138.           trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);
  139.         }
  140.  
  141.               /* Play the Track... */
  142.         ulParamLen=sizeof(PLAYPARAM);
  143.         playParam.signature[0]='C';
  144.         playParam.signature[1]='D';    
  145.         playParam.signature[2]='0';
  146.         playParam.signature[3]='1';
  147.         playParam.ucAddressMode=01;
  148.         memcpy(&playParam.ucStartSector,&trackInfo[0].ulTrackAddress,4);
  149.         memcpy(&playParam.ucEndSector,&trackInfo[1].ulTrackAddress,4);
  150.         
  151.         rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO,
  152.                          &playParam, sizeof(playParam), &ulParamLen,0,
  153.                          0, 0);
  154.         if(rc)
  155.           break;
  156.         closeDrive(hfDrive);
  157.         return TRUE;
  158.     }while(TRUE);
  159.     closeDrive(hfDrive);
  160.     printf("Error: %x\n",rc);
  161.     return FALSE;
  162. }
  163.  
  164. BOOL extern CDStop(char * drive)
  165. {
  166.     HFILE hfDrive;
  167.     ULONG ulParamLen;
  168.     ULONG rc;
  169.  
  170.     hfDrive=openDrive(drive);
  171.     if(!hfDrive) return FALSE;
  172.     
  173.     do {
  174.       /* Stop CD */
  175.       ulParamLen=4;
  176.       rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_STOPAUDIO,
  177.                        "CD01", 4, &ulParamLen,0,
  178.                        0, 0);        
  179.       if(rc)
  180.         break;//Error
  181.       closeDrive(hfDrive);
  182.       return TRUE;
  183.     }while(TRUE);
  184.     closeDrive(hfDrive);
  185.     printf("Error: %x\n",rc);
  186.     return FALSE;
  187. }
  188.  
  189.  
  190. void usage(char* progname)
  191. {
  192. printf("Usage: %s <drive> <Track>\n\n",progname);
  193. printf("<drive>:   CD-Rom drive letter e.g. d:\n");
  194. printf("<Track>:   The track to play\n");
  195. }
  196.  
  197. main(int argc, char* argv[])
  198. {
  199.   printf("%s (C) Chris Wohlgemuth 1999\n\n",argv[0]);
  200.  
  201.   if(argc!=3) {
  202.     usage(argv[0]);
  203.     return -1;
  204.   }
  205.   if(atol(argv[2])==20) {
  206.     CDStop(argv[1]);
  207.     return 0;
  208.   }
  209.  
  210.   CDPlayTrack( atol(argv[2]), argv[1]);    
  211.   return 0;
  212. }
  213.  
  214.