home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 3 / FreeSoftwareCollection3pd199x-jp.img / pao / ms_dos / cdplay / src / cdplay.c < prev    next >
Text File  |  1980-01-02  |  7KB  |  257 lines

  1. /** << MSC V5.1 >> ************************************************************
  2. **
  3. **    -----  CD演奏プログラム -----------------------------------------------
  4. **    int CDplay( int tocread, int startno, int endno, unsigned char repeat ) ;
  5. **
  6. **    <input>        : tocread - =1(!=0) TOC 情報の取得をする。
  7. **                          =0      TOC 情報の取得はしない。
  8. **              : startno - 演奏開始曲番号
  9. **              : endno   - 演奏終了曲番号
  10. **              : repeat  - リピート回数
  11. **
  12. **    <return>    : = 0 - 正常終了
  13. **                : = 1 - エラー
  14. **
  15. **    ----- HISTORY -----
  16. **    1990.02.21 : CREATE
  17. **    1990.07.03 : CDドライブのデバイスが登録されていない時のメッセージ追加。
  18. **
  19. **    Programed by Y.Hirata ( Nifty ID : NAB03321 )
  20. **
  21. ******************************************************************************/
  22. #include    <stdio.h>
  23. #include    <stdlib.h>
  24. #include    <string.h>
  25. #include    "cdr.h"
  26. #include    <dos.h>
  27.  
  28. #define        DEBUG        0
  29.  
  30. #define        TRUE        1
  31. #define        FALSE        0
  32.  
  33. #define        RETRY        10        /*  エラー発生時のリトライ回数        */
  34.  
  35. static char TOCON = FALSE ;        /*  TOC情報の取得済か?            */
  36.  
  37. #define        Cddrv        0            /*  CDドライブ番号 ( 0 - 6 )    */
  38.                                     /*  TOWNSでは Cddrv=0 のみ        */
  39. int    Cdtype ;                        /*    CDタイプ                    */
  40. int    Sttrack ;                        /*    先頭トラック(曲)番号        */
  41. int    Endtrack ;                        /*    最終トラック(曲)番号        */
  42. int    Status ;                        /*    音楽の演奏状態                */
  43. int    Nowmusicno ;                    /*    現在演奏中の曲番号            */
  44.  
  45. typedef struct _TOC {
  46.         char    min ;
  47.         char    sec ;
  48.         char    frame ;
  49. } TOC ;
  50.  
  51. static TOC Trtime[99],Endtime,Disctime,Nowtime,Usest,Useet ;
  52. /*
  53. **    Trtime[99] : 各トラックの演奏開始時間
  54. **    Endtime    : ディスク内演奏終了時間
  55. **    Disctime   : ディスク内演奏時間
  56. **    Nowtime    : 演奏中のトラック内演奏時間
  57. **    Usest      : 演奏開始指定時間
  58. **    Useet      : 演奏終了指定時間
  59. */
  60.  
  61. /***************************  CD情報の取得  ********************************/
  62. /*
  63. **    まずは、このルーチンをよんでコンパクトディスク( CD )の情報を取得します。
  64. */
  65. int cdinfo()
  66. {
  67.     return(
  68.         CDR_cdinfo
  69.         ( Cddrv,&Cdtype,&Sttrack,&Endtrack,(char *)Trtime,(char *)&Endtime )
  70.     ) ;
  71. }
  72.  
  73. /*******************************  CD演奏  **********************************/
  74. /*                
  75. **        さぁ、ミュ~ジック・スタート!
  76. **        時間指定による音楽演奏をしま~す!
  77. **
  78. **    <input>        : count - 演奏回数(リピート)
  79. */
  80. int mtrplay( unsigned char count )
  81. {
  82.     return(
  83.         CDR_mtrplay( Cddrv,(char *)&Usest,(char *)&Useet,count )
  84.     ) ;
  85. }
  86.  
  87. /***************************  CD演奏状態の取得  ****************************/
  88. /*                
  89. **        今、音楽の演奏状態はど~なってるかなっ?!
  90. */
  91. int mphase()
  92. {
  93.     return(
  94.         CDR_mphase
  95.         ( Cddrv,&Status,&Nowmusicno,(char *)&Nowtime,(char *)&Disctime )
  96.     ) ;
  97. }
  98.  
  99. /***************************  演奏開始時間の設定  ****************************/
  100. /*
  101. **    <input>        : trackno - 演奏開始トラック(曲番号)
  102. */
  103. void usestset( int trackno )
  104. {
  105.     if ( trackno<Sttrack )    trackno = Sttrack ;
  106.     if ( trackno>Endtrack )    trackno = Endtrack ;
  107.  
  108.     if ( Cdtype==3 && trackno==Sttrack ) trackno++ ;
  109.  
  110.     Usest.sec   = Trtime[trackno-1].sec ;
  111.     Usest.min   = Trtime[trackno-1].min ;
  112.     Usest.frame = Trtime[trackno-1].frame ;
  113.  
  114.     printf("START (%02d) - ",trackno) ;
  115. }
  116.  
  117. /*************************  演奏終了時間の設定  ******************************/
  118. /*
  119. **    <input>        : trackno - 演奏終了トラック(曲番号)
  120. */
  121. void useetset( int trackno )
  122. {
  123. /*    frame : 0 - 74 : 75frame=1sec    */
  124.  
  125.     if ( trackno<Sttrack ) trackno = Sttrack ;
  126.     if ( Cdtype==3 && trackno==Sttrack ) trackno++ ;
  127. /*
  128. **    最後の曲まで(または最後の曲だけを)演奏した~い時には、
  129. **    演奏終了時間の指定に注意しましょう!
  130. **
  131. **    ※ 演奏終了時間は、ディスク内演奏終了時間から 1 フレーム引いた値を指定
  132. **       しないとだめだよ!
  133. */
  134.     if ( trackno>=Endtrack ) {            /*  最終曲が指定された時    */
  135.         trackno = Endtrack ;
  136.         Useet.sec = Endtime.sec ;
  137.         Useet.min = Endtime.min ;
  138.         if ( !Endtime.frame ) {
  139.             Useet.frame = 74 ;
  140.             if ( !Endtime.sec ) {
  141.                 Useet.sec  = 59 ;
  142.                 Useet.min -= 1 ;
  143.             } else
  144.                 Useet.sec = Endtime.sec-1 ;
  145.         } else
  146.             Useet.frame = Endtime.frame-1 ;
  147.     } else {                            /*  最終曲じゃない時        */
  148.         Useet.sec   = Trtime[trackno].sec ;
  149.         Useet.min   = Trtime[trackno].min ;
  150.         Useet.frame = Trtime[trackno].frame ;
  151.     }
  152.  
  153.     printf("END (%02d) : ",trackno) ;
  154. }
  155.  
  156. /*******************************  デバイスエラー  *********************************/
  157. char    *msg[] = {
  158.     "環境エラー : 環境設定をし直すか、本プログラムの使用を諦めて下さい♪",
  159.     "MS-DOSで使用する場合には、'CDDRV.SYS' と 'CDISC.SYS' のデバイス",
  160.     "ドライバが必要です。"
  161.                 } ;
  162. void deverr()
  163. {
  164.     printf("\x1b[31m") ;
  165.     printf("%s\n",msg[0]) ;
  166.     printf("\x1b[33m") ;
  167.     printf("※") ;
  168.     printf("%s\n",msg[1]) ;
  169.     printf("%s\n",msg[2]) ;
  170.     printf("\x1b[m") ;
  171. }
  172.  
  173. /**************************  CDの演奏をします。 ****************************/
  174. /*
  175. **    <input>        : tocon   - =1(!=0) TOC 情報の取得をする。
  176. **                          =0      TOC 情報の取得はしない。
  177. **              : startno - 演奏開始曲番号
  178. **              : endno   - 演奏終了曲番号
  179. **              : repeat  - リピート回数
  180. **
  181. **    <return>    : = 0 - 正常終了
  182. **                : = 1 - エラー
  183. */
  184. int CDplay( int tocread, int startno, int endno, unsigned char repeat )
  185. {
  186.     int    errcnt ;
  187.     int    err=FALSE ;
  188.  
  189.     if ( !repeat ) repeat = 1 ;
  190.  
  191.     if ( !TOCON || tocread ) {
  192.         errcnt = 0 ;
  193.         do {
  194.             err = cdinfo() ;
  195.             if ( err == DEVERR ) {
  196.                 deverr() ;
  197.                 exit( 1 ) ;
  198.             }
  199.             CDR_pause( Cddrv ) ;
  200. #if DEBUG
  201.             printf("error(%02d) : -cdinfo- %xH\n",errcnt,err) ;
  202. #endif
  203.             errcnt++ ;
  204.         } while ( err && errcnt<=RETRY ) ;
  205.         if ( errcnt<=RETRY ) {
  206.             TOCON = TRUE ;
  207.         } else {
  208. #if DEBUG
  209.             printf("-cdinfo- error : %xH\n",err) ;
  210. #endif
  211.             printf("\nCDがセットされていません!\n") ;
  212.             err = TRUE ;
  213.             goto close ;
  214.         }
  215.     }
  216.     err = 0 ;
  217. #if    DEBUG
  218.     printf("cdtype     : %d\n",Cdtype) ;
  219.     printf("starttrack : %d\n",Sttrack) ;
  220.     printf("endtrack   : %d\n",Endtrack) ;
  221.     for ( err=0; err<Endtrack; err++ ) {
  222.         printf("min-sec-frame(%02d) : %02d-%02d-%02d\n",
  223.                 err,Trtime[err].min,Trtime[err].sec,Trtime[err].frame) ;
  224.     } ;
  225.     err = 0 ;
  226. #endif
  227. /*
  228. **    CDDA のないコンパクトディスクには用がないので、プログラム終了!
  229. */
  230.     if ( Cdtype!=1 && Cdtype!=3 ) {
  231.         printf("\n音楽の入っていないCDのため、演奏できません!\n") ;
  232.         err = TRUE ;
  233.         goto close ;
  234.     }
  235.  
  236.     if ( Endtrack<=0 || Endtrack>99 ) goto close ;
  237.     if ( Endtime.frame<=0 && Endtime.sec<=0 && Endtime.min<=0 ) goto close ;
  238.  
  239.     errcnt = 0 ;
  240.     usestset( startno ) ;
  241.     useetset( endno ) ;
  242.     printf("REPEAT (%02d)\n",repeat) ;
  243.     do    {                                        /*  演奏開始            */
  244.         if ( mtrplay( repeat ) == 0x102 ) CDR_pause( Cddrv ) ;
  245.         mtrplay( repeat ) ;        mphase() ;
  246.         if ( ++errcnt >= RETRY ) {
  247.             printf("\n<cdplay> CD READ ERROR (mtrplay)") ;
  248.             err = TRUE ;
  249.             goto close ;
  250.         }
  251.     } while ( !Status );
  252.  
  253. close:
  254.     return( err ) ;
  255. }
  256.  
  257.