home *** CD-ROM | disk | FTP | other *** search
- #define INCL_DOSDEVIOCTL
- #define INCL_DOSFILEMGR
-
-
- #include <stdio.h>
- #include <stdlib.h>
- #include "trackobject.hh"
-
- HFILE openDrive(char* drive);
- void closeDrive(HFILE hfDrive);
- ULONG CDQueryAudioCDTracks(HFILE hfDrive);
- BOOL CDPlayTrack(ULONG numTrack, char * drive);
-
-
- typedef struct{
- UCHAR ucFirstTrack;
- UCHAR ucLastTrack;
- ULONG ulLeadOut;
- }CDINFO;
-
- typedef struct{
- ULONG ulLeadOut;
- UCHAR ucFirstTrack;
- UCHAR ucLastTrack;
- }CDINFO2;
-
- typedef struct
- {
- ULONG ulTrackAddress;
- UCHAR ucTCInfo;
- }myTRACKINFO;
-
- typedef struct
- {
- UCHAR signature[4];
- UCHAR ucTrackNum;
- }TINFOPARAM;
-
- typedef struct
- {
- UCHAR ucFrames;
- UCHAR ucSeconds;
- UCHAR ucMinutes;
- UCHAR ucNotUsed;
- }MSF;
-
- typedef struct
- {
- UCHAR signature[4];
- UCHAR ucAddressMode;
- UCHAR ucStartSector[4];
- UCHAR ucEndSector[4];
- }PLAYPARAM;
-
-
- HFILE extern openDrive(char* drive)
- {
- HFILE hfDrive = 0;
- ULONG ulAction;
- ULONG rc;
-
- rc = DosOpen(drive, &hfDrive, &ulAction, 0,
- FILE_NORMAL, OPEN_ACTION_OPEN_IF_EXISTS,
- OPEN_SHARE_DENYNONE | OPEN_ACCESS_READONLY |
- OPEN_FLAGS_DASD, NULL);
-
- if(rc)
- return NULL;//Error
-
- return hfDrive;
- }
-
- void extern closeDrive(HFILE hfDrive)
- {
- DosClose(hfDrive);
- }
-
-
- /*****************************************/
- /* */
- /* Plays track #numTrack on */
- /* CD-Drive 'drive' */
- /* */
- /* Returns TRUE if successful */
- /* */
- /*****************************************/
- BOOL CDPlayTrack(ULONG numTrack, char * drive)
- {
- HFILE hfDrive;
- ULONG ulParamLen;
- ULONG ulDataLen;
- ULONG rc;
- CDINFO cdInfo;
- TINFOPARAM tip;
- myTRACKINFO trackInfo[2];
- PLAYPARAM playParam;
-
- printf("Track: %d\n",numTrack);
- hfDrive=openDrive(drive);
- if(!hfDrive) return FALSE;
- do {
- /* Get cd info */
- ulDataLen=sizeof(cdInfo);
- ulParamLen=4;
- rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
- "CD01", 4, &ulParamLen, &cdInfo,
- sizeof(cdInfo), &ulDataLen);
- if(rc)
- break;//Error
- ulDataLen=sizeof(trackInfo);
- ulParamLen=sizeof(TINFOPARAM);
- tip.signature[0]='C';
- tip.signature[1]='D';
- tip.signature[2]='0';
- tip.signature[3]='1';
- /* Get information about our track */
- tip.ucTrackNum=numTrack;
- rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
- &tip, sizeof(tip), &ulParamLen, &trackInfo[0],
- sizeof(trackInfo[0]), &ulDataLen);
- if(rc)
- break;//Error
- /* Get information about next track */
- tip.ucTrackNum=numTrack+1;
- if(tip.ucTrackNum<=cdInfo.ucLastTrack) {
- rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
- &tip, sizeof(tip), &ulParamLen, &trackInfo[1],
- sizeof(trackInfo[1]), &ulDataLen);
- if(rc)
- break;//Error
- }
- else {
- /* The following does not work on my system. Compilerbug ?
- trackInfo[1].ulTrackAddress=cdInfo.ulLeadOut; */
- BYTE *cdInfoBytes;
- cdInfoBytes=(BYTE*)&cdInfo;
- cdInfoBytes+=2;
- trackInfo[1].ulTrackAddress=*((ULONG*)cdInfoBytes);
- }
-
- /* Play the Track... */
- ulParamLen=sizeof(PLAYPARAM);
- playParam.signature[0]='C';
- playParam.signature[1]='D';
- playParam.signature[2]='0';
- playParam.signature[3]='1';
- playParam.ucAddressMode=01;
- memcpy(&playParam.ucStartSector,&trackInfo[0].ulTrackAddress,4);
- memcpy(&playParam.ucEndSector,&trackInfo[1].ulTrackAddress,4);
-
- rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_PLAYAUDIO,
- &playParam, sizeof(playParam), &ulParamLen,0,
- 0, 0);
- if(rc)
- break;
- closeDrive(hfDrive);
- return TRUE;
- }while(TRUE);
- closeDrive(hfDrive);
- printf("Error: %x\n",rc);
- return FALSE;
- }
-
- BOOL extern CDStop(char * drive)
- {
- HFILE hfDrive;
- ULONG ulParamLen;
- ULONG rc;
-
- hfDrive=openDrive(drive);
- if(!hfDrive) return FALSE;
-
- do {
- /* Stop CD */
- ulParamLen=4;
- rc = DosDevIOCtl(hfDrive, IOCTL_CDROMAUDIO, CDROMAUDIO_STOPAUDIO,
- "CD01", 4, &ulParamLen,0,
- 0, 0);
- if(rc)
- break;//Error
- closeDrive(hfDrive);
- return TRUE;
- }while(TRUE);
- closeDrive(hfDrive);
- printf("Error: %x\n",rc);
- return FALSE;
- }
-
-
- void usage(char* progname)
- {
- printf("Usage: %s <drive> <Track>\n\n",progname);
- printf("<drive>: CD-Rom drive letter e.g. d:\n");
- printf("<Track>: The track to play\n");
- }
-
- main(int argc, char* argv[])
- {
- printf("%s (C) Chris Wohlgemuth 1999\n\n",argv[0]);
-
- if(argc!=3) {
- usage(argv[0]);
- return -1;
- }
- if(atol(argv[2])==20) {
- CDStop(argv[1]);
- return 0;
- }
-
- CDPlayTrack( atol(argv[2]), argv[1]);
- return 0;
- }
-
-