home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 July / Chip_1998-07_cd.bin / ctenari / Soban / CD / CD1.C next >
C/C++ Source or Header  |  1995-08-10  |  7KB  |  331 lines

  1. /*-------------------------------------------------------*/
  2. /* Originally part of SOUNDHAX v1 by John M. Trindle     */
  3. /*                 FREEWARE 12/19/91                     */
  4. /*-------------------------------------------------------*/
  5. /* Drobne upravy Petr Soban (c) 10.8.1995                */
  6. /*-------------------------------------------------------*/
  7. /*                                                       */
  8. /*   Program pro prehravani hudebnich CD                 */
  9. /*                                                       */
  10. /*-------------------------------------------------------*/
  11.  
  12.  
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <dos.h>
  16. #include <string.h>
  17.  
  18. #define MULTIPLEX_INT   0x2f
  19. #define INIT_MP_INT     0x1500
  20. #define CDREQ_MP_INT    0x1510
  21.  
  22. #define STAT_HAS_AN_ERROR 0x8000
  23. #define STAT_BUSY         0x0200
  24. #define STAT_DONE         0x0100
  25.  
  26. #define CD_EJECT_COMMAND      0
  27. #define CD_SEEK_COMMAND       131
  28. #define CD_PLAY_COMMAND       132
  29. #define CD_STOP_COMMAND       133
  30. #define CD_RESUME_COMMAND     136
  31.  
  32. #define READ_IOCTL_COMMAND   3
  33. #define WRITE_IOCTL_COMMAND  12
  34.  
  35. #define CD_STATUS_COMMAND     6
  36.  
  37. #define GET_AUDIO_DISKINFO    10
  38. #define GET_AUDIO_TRACKINFO   11
  39.  
  40.  
  41. #define        ADDR_HSG        0
  42. #define        ADDR_RED        1
  43.  
  44.  
  45. typedef struct
  46. {
  47.    unsigned char ParamLength;
  48.    unsigned char SubUnit;
  49.    unsigned char CommandCode;
  50.    int           Status;
  51.    unsigned long Reserved1;
  52.    unsigned long Reserved2;
  53.    unsigned char AddressMode;
  54.    void     *BeginPointer;
  55.    unsigned long Length;
  56.    unsigned long Reserved3;
  57. } CDCmdStru;
  58.  
  59. typedef struct
  60. {
  61.    unsigned char CommandCode;
  62.    unsigned char TrackNumber;
  63.    unsigned long StartAddress;
  64.    unsigned char Control;
  65. } CDTrackInfoStru;
  66.  
  67. typedef struct
  68. {
  69.   unsigned char CommandCode;
  70. } CDEjectStru;
  71.  
  72. typedef struct
  73. {
  74.   unsigned char CommandCode;
  75.   unsigned long Status;
  76. } CDStatusStru;
  77.  
  78. typedef struct
  79. {
  80.    unsigned char AddrMode;
  81.    unsigned long FrameOffset;
  82.    unsigned long NumberFrames;
  83. } CDPlayStru;
  84.  
  85. typedef struct DiskInfo_Rec {
  86.    unsigned char CommandCode;
  87.    unsigned char LoTrack;
  88.    unsigned char HiTrack;
  89.    unsigned long LeadOut;
  90. } CDDiskInfoStru;
  91.  
  92.  
  93. CDCmdStru CDCmdBlock;
  94. CDTrackInfoStru TrackInfo[100];
  95. CDDiskInfoStru DiskInfo;
  96.  
  97.  
  98. long LastSector;
  99. int NumTracks;
  100. int CDRomLoaded,CDRomDrive;
  101.  
  102.  
  103.  
  104. unsigned int CheckCD2F()
  105. {
  106.    union REGS regs;
  107.  
  108.    regs.x.ax = INIT_MP_INT;
  109.    int86(MULTIPLEX_INT,®s,®s);
  110.    CDRomLoaded = regs.x.bx;
  111.    CDRomDrive = regs.x.cx;
  112.    return regs.h.al;
  113. }
  114.  
  115. void CDEject()
  116. {
  117.    CDEjectStru EjectRequestBlock;
  118.  
  119.    EjectRequestBlock.CommandCode = CD_EJECT_COMMAND;
  120.  
  121.    SendCDCommand(WRITE_IOCTL_COMMAND,&EjectRequestBlock,sizeof(CDEjectStru));
  122. }
  123.  
  124. unsigned int CDStatus()
  125. {
  126.    unsigned int RetVal;
  127.    CDStatusStru StatusRequestBlock;
  128.  
  129.    StatusRequestBlock.CommandCode = CD_STATUS_COMMAND;
  130.  
  131.    RetVal = SendCDCommand(READ_IOCTL_COMMAND,&StatusRequestBlock,sizeof(CDStatusStru));
  132.    return(RetVal);
  133. }
  134.  
  135. CDStop()
  136. {
  137.    return(SendCDCommand(CD_STOP_COMMAND,NULL,0));
  138. }
  139.  
  140.  
  141. CDResume()
  142. {
  143.    return(SendCDCommand(CD_RESUME_COMMAND,NULL,0));
  144. }
  145.  
  146. void CDPlay(long FrameOffset, long NumFrames)
  147. {
  148.    SendCDCommand(CD_PLAY_COMMAND,(void *)FrameOffset,NumFrames);
  149. }
  150.  
  151. void CDGetDiskInfo()
  152. {
  153.    DiskInfo.CommandCode = GET_AUDIO_DISKINFO;
  154.    SendCDCommand(READ_IOCTL_COMMAND,&DiskInfo,sizeof(CDDiskInfoStru));
  155. }
  156.  
  157. void PrintTimeFrames(long NumFrames)
  158. {
  159.    long Mins;
  160.    long Secs;
  161.    long PlusFrames;
  162.    PlusFrames = NumFrames;
  163.    Secs = PlusFrames/75;
  164.    PlusFrames -= Secs*75;
  165.    Mins = Secs/60;
  166.    Secs -= Mins*60;
  167.  
  168.    printf("%2ld:%02ld,%02ld",Mins,Secs,PlusFrames);
  169. }
  170.  
  171. int SendCDCommand(int CommandCode, void *BeginPtr, long Length)
  172. {
  173.    union REGS regs;
  174.    struct SREGS sregs;
  175.  
  176.    CDCmdBlock.ParamLength = 13;
  177.    CDCmdBlock.SubUnit     = 0;
  178.    CDCmdBlock.CommandCode = CommandCode;
  179.    CDCmdBlock.Status      = 0;
  180.    CDCmdBlock.AddressMode = ADDR_HSG;
  181.    CDCmdBlock.BeginPointer = BeginPtr;
  182.    CDCmdBlock.Length      = Length;
  183.    CDCmdBlock.Reserved3   = 0;
  184.  
  185.    regs.x.ax = CDREQ_MP_INT;
  186.    regs.x.bx = FP_OFF(&CDCmdBlock);
  187.    regs.x.cx = CDRomDrive;
  188.    sregs.es  = FP_SEG(&CDCmdBlock);
  189.  
  190.    int86x(MULTIPLEX_INT,®s,®s,&sregs);
  191.  
  192.    return(CDCmdBlock.Status);
  193. }
  194.  
  195. unsigned long Red2HSG(unsigned long RedValue)
  196. {
  197.  
  198.    unsigned long Mins;
  199.    unsigned long Secs;
  200.    unsigned long PlusFrames;
  201.  
  202.    PlusFrames = RedValue & 0x000000ffL;
  203.  
  204.    Secs = ((RedValue & 0x0000ff00L) >> 8);
  205.  
  206.    Mins = ((RedValue & 0x00ff0000L) >> 16);
  207.  
  208.    return((Mins*60+Secs)*75+PlusFrames);
  209. }
  210.  
  211.  
  212. unsigned long CDTrackInfo(int TrackNumber, int Minutes, int Seconds, int Frames)
  213. {
  214.  
  215.    TrackInfo[TrackNumber].CommandCode = GET_AUDIO_TRACKINFO;
  216.  
  217.    TrackInfo[TrackNumber].TrackNumber = TrackNumber;
  218.  
  219.    SendCDCommand(READ_IOCTL_COMMAND,&(TrackInfo[TrackNumber]),sizeof(CDTrackInfoStru));
  220.  
  221.    return(Red2HSG(TrackInfo[TrackNumber].StartAddress)+(Minutes*60L+((long)Seconds))*75L+((long)Frames));
  222. }
  223.  
  224.  
  225.  
  226.  
  227.  
  228. int main(int argc, char *argv[])
  229. {
  230.    int i,j;
  231.  
  232.    int Track,StartMin,StartSec,EndMin,EndSec,StartFrame,EndFrame;
  233.    long StartSector,EndSector;
  234.  
  235.    float TempFloat;
  236.    char LocalBuffer[132];
  237.  
  238.    if (!CheckCD2F())
  239.    {
  240.       printf("MSCDEX NENI V PAMETI\n");
  241.       return 1;
  242.    }
  243.  
  244.    CDGetDiskInfo();
  245.    LastSector = DiskInfo.LeadOut;
  246.    NumTracks = DiskInfo.HiTrack-DiskInfo.LoTrack+1;
  247.  
  248.    printf("Cteni zarizeni: %c:\n",CDRomDrive+'A');
  249.  
  250.    if (argc > 1)
  251.    {
  252.  
  253.      Track = atoi(argv[1]);
  254.      printf("Start stopa %d, %d ",Track,NumTracks);
  255.      if (NumTracks==1) printf("stopa");
  256.      if ((NumTracks>2) && (NumTracks<5)) printf("stopy");
  257.      if (NumTracks>=5) printf("stop");
  258.      printf(" na disku.\n");
  259.    }
  260.    else
  261.    {
  262.       CDStop();
  263.       printf("\n Program pro prehravani zvukovych CD v1.0 (c) 1995 John M. Trindle & Petr Soban\n\n CD1 [start_stopa] [start_cas] [konec_cas]\n\n");
  264.  
  265.       for (i = DiskInfo.LoTrack; i <= DiskInfo.HiTrack; i++)
  266.       {
  267.      CDTrackInfo(i,0,0,0);
  268.       }
  269.  
  270.       TrackInfo[DiskInfo.HiTrack+1].StartAddress = DiskInfo.LeadOut;
  271.  
  272.       for (i = DiskInfo.LoTrack; i <= DiskInfo.HiTrack; i++)
  273.       {
  274.      printf("Stopa %2d ",i);
  275.      PrintTimeFrames(Red2HSG(TrackInfo[i+1].StartAddress)-Red2HSG(TrackInfo[i].StartAddress));
  276.      printf("\n");
  277.       }
  278.    }
  279.  
  280.    if (argc < 2) return 0;
  281.  
  282.  
  283.  
  284.    EndSector = Red2HSG(DiskInfo.LeadOut)-150L;  /* 150L Fudge Factor */
  285.  
  286.    StartMin = 0;
  287.    StartSec = 0;
  288.    StartFrame = 0;
  289.  
  290.    EndMin = 0;
  291.    EndSec = 0;
  292.    EndFrame = 0;
  293.  
  294.    if (argc > 2)
  295.    {
  296.       strcpy(LocalBuffer,argv[2]);
  297.  
  298.       StartMin = atoi(strtok(LocalBuffer,":"));
  299.       TempFloat = atof(strtok(NULL,","));
  300.  
  301.       StartSec = (int) TempFloat;
  302.       StartFrame = ((int)(TempFloat*75))-StartSec*75;
  303.    }
  304.    StartSector = CDTrackInfo(Track,StartMin,StartSec,StartFrame);
  305.  
  306.    if (argc > 3)
  307.    {
  308.       strcpy(LocalBuffer,argv[3]);
  309.  
  310.       EndMin = atoi(strtok(LocalBuffer,":"));
  311.       TempFloat = atof(strtok(NULL,","));
  312.  
  313.       EndSec = (int) TempFloat;
  314.       EndFrame = ((int)(TempFloat*75))-EndSec*75;
  315.  
  316.       EndSector   = CDTrackInfo(Track,EndMin,EndSec,EndFrame);
  317.    }
  318.  
  319.    CDStop();
  320.  
  321.  
  322.    CDPlay(StartSector,EndSector-StartSector);
  323.  
  324.    if (argc > 4) CDStop();
  325.  
  326.  
  327.    printf("\n");
  328.  
  329. return 0;
  330. }
  331.