home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / cdrom / cybersound / cdplayer / source / cliinterface.c < prev    next >
C/C++ Source or Header  |  1977-12-31  |  6KB  |  256 lines

  1.  
  2. /********************************************
  3.  * CD Audio Player using 14bit sound driver *
  4.  *   for Toshiba 4101 CDRom and compatible  *
  5.  *      (c) 1995 by Christian Buchner       *
  6.  ********************************************
  7.  *
  8.  * CLIInterface.c
  9.  */
  10.  
  11. /* Note: TAB SIZE = 4 */
  12.  
  13.  
  14. /* Includes */
  15.  
  16. #include <proto/dos.h>
  17. #include <proto/exec.h>
  18. #include <libraries/dos.h>
  19. #include <utility/tagitem.h>
  20. #include <string.h>
  21.  
  22.  
  23. /* Prototypes */
  24.  
  25. #include "CDPlayer_Protos.h"
  26. void __saveds ProgramCallback(void);
  27. BOOL ReadDefaults(void);
  28. void FreeDefaults(void);
  29.  
  30.  
  31. /* Externals */
  32.  
  33. extern struct DosLibrary *DOSBase;            /* From CDPlayer.c */
  34. extern void WBInterface(void);                /* From WBInterface.c */
  35. extern void GUI(void);                        /* From WBInterface.c */
  36.  
  37.  
  38. /* Default parameters */
  39.  
  40. UBYTE DefaultDriverName[]="14bit.driver";
  41. UBYTE DefaultSCSIName[]="scsi.device";
  42. ULONG DefaultSCSIUnit=3;
  43. ULONG DefaultFrequency=44100;
  44. ULONG DefaultQuality=1;
  45. ULONG DefaultBuffers=20;
  46.  
  47.  
  48. /* Command line arguments */
  49.  
  50. UBYTE *Template="TRACKS/N/M,DEVICE/K,UNIT/N/K,SOUNDDRIVER/K,REPEAT/S,FREQUENCY/N,QUALITY/N,BUFFERS/N,HIGHPRI/S,PUBSCREEN/K,GUI/S";
  51.  
  52. struct ArgArray
  53. {
  54.     ULONG **aa_Tracks;
  55.     UBYTE *aa_SCSIName;
  56.     ULONG *aa_SCSIUnit;
  57.     UBYTE *aa_SoundDriver;
  58.     ULONG aa_Repeat;
  59.     ULONG *aa_Frequency;
  60.     ULONG *aa_Quality;
  61.     ULONG *aa_Buffers;
  62.     ULONG aa_HighPri;
  63.     UBYTE *aa_PubScreen;
  64.     ULONG aa_GUI;
  65. };
  66.  
  67. struct ArgArray AA;
  68. struct RDArgs *RDArgs;
  69. struct RDArgs *RDArgsSuccess;
  70. struct RDArgs *GlobalRDArgs;
  71. struct RDArgs *GlobalRDArgsSuccess;
  72.  
  73.  
  74. /* Other variables */
  75.  
  76. struct Process *MyProc;
  77. UBYTE LineBuffer[256];
  78. UBYTE ErrorBuffer[100];
  79.  
  80.  
  81. /*******************************************************************************/
  82.  
  83. /* CLI interface routine */
  84.  
  85. LONG __saveds main()
  86. {
  87.     char ProgName[32];
  88.     ULONG Signals=0;
  89.     
  90.     /* Get task pointer */
  91.     MyProc=(struct Process*)FindTask(NULL);
  92.     
  93.     if (MyProc->pr_CLI == NULL)
  94.     {
  95.         WBInterface();
  96.     }
  97.     else
  98.     {
  99.         if (DOSBase=(struct DosLibrary*)OpenLibrary("dos.library",37))
  100.         {
  101.             if (!GetProgramName(ProgName,32L)) strcpy(ProgName,"CDPlayer");
  102.             
  103.             /* Read global defaults */
  104.             if (ReadDefaults())
  105.             {
  106.                 if (!(RDArgs=ReadArgs(Template,(LONG *)&AA,0)))
  107.                 {
  108.                     PrintFault(IoErr(),ProgName);
  109.                 }
  110.                 else
  111.                 {
  112.                     /* Set defaults for the arguments */
  113.                     if (!AA.aa_SCSIName)     AA.aa_SCSIName=        DefaultSCSIName;
  114.                     if (!AA.aa_SCSIUnit)     AA.aa_SCSIUnit=        &DefaultSCSIUnit;
  115.                     if (!AA.aa_SoundDriver) AA.aa_SoundDriver=    DefaultDriverName;
  116.                     if (!AA.aa_Frequency)    AA.aa_Frequency=    &DefaultFrequency;
  117.                     if (!AA.aa_Quality)        AA.aa_Quality=        &DefaultQuality;
  118.                     if (!AA.aa_Buffers)        AA.aa_Buffers=        &DefaultBuffers;
  119.                     
  120.                     if (AA.aa_GUI)
  121.                     {
  122.                         GUI();
  123.                     }
  124.                     else
  125.                     {
  126.                         if (InitDriver(AA.aa_SoundDriver,*AA.aa_Buffers))
  127.                         {
  128.                             if (OpenSCSI(AA.aa_SCSIName,*AA.aa_SCSIUnit,(BOOL)AA.aa_HighPri))
  129.                             {
  130.                                 /* Create a program for replay */
  131.                                 if (!CD_SetProgram(AA.aa_Tracks, ProgramCallback))
  132.                                 {
  133.                                     Message("CD or specified track list contain no audio tracks.");
  134.                                 }
  135.                                 else
  136.                                 {
  137.                                     CD_Frequency(*AA.aa_Frequency);
  138.                                     CD_Quality  (*AA.aa_Quality);
  139.                                     
  140.                                     /* Start reading/playing */
  141.                                     CD_Start();
  142.                                     
  143.                                     /* Loop forever (well, not quite) */
  144.                                     for (;;)
  145.                                     {
  146.                                         /* Wait for something to happen */
  147.                                         Signals=Wait(SIGBREAKF_CTRL_C|SIGBREAKF_CTRL_F);
  148.                                         
  149.                                         /* Break out on CTRL-C */
  150.                                         if (Signals&SIGBREAKF_CTRL_C)
  151.                                         {
  152.                                             PrintFault(ERROR_BREAK,NULL);
  153.                                             break;
  154.                                         }
  155.                                         
  156.                                         /* Program has finished, so exit */
  157.                                         if (Signals&SIGBREAKF_CTRL_F) break;
  158.                                     }
  159.                                     
  160.                                     /* Abort playing */
  161.                                     CD_Abort();
  162.                                 }
  163.                                 CloseSCSI();
  164.                             }
  165.                             DeInitDriver();
  166.                         }
  167.                         FreeArgs(RDArgs);
  168.                     }
  169.                     FreeDefaults();
  170.                 }
  171.                 CloseLibrary((struct Library*)DOSBase);
  172.             }
  173.         }
  174.     }
  175.     return(0);
  176. }
  177.  
  178.  
  179. /* Callback routine for finished program */
  180.  
  181. void __saveds ProgramCallback(void)
  182. {
  183.     /* Repeat desired? */
  184.     if (AA.aa_Repeat)
  185.     {
  186.         /* Restart playing */
  187.         CD_Start();
  188.     }
  189.     else
  190.     {
  191.         /* Signal main task about program end */
  192.         Signal((struct Task*)MyProc,SIGBREAKF_CTRL_F);
  193.     }
  194. }
  195.  
  196.  
  197. /* Read global defaults */
  198.  
  199. BOOL ReadDefaults(void)
  200. {
  201.     ULONG LineLength;
  202.     BOOL Success=TRUE;
  203.     
  204.     /* Try to read global defaults (environment variable) */
  205.     if (LineLength=GetVar("CD-DA_DEFAULTS", LineBuffer, sizeof(LineBuffer)-1, 0))
  206.     {
  207.         /* Append a linefeed or ReadArgs will complain */
  208.         strcat(LineBuffer,"\n");
  209.         LineLength++;
  210.         
  211.         /* Allocate and initialize a RDArgs structure */
  212.         if (GlobalRDArgs=(struct RDArgs*)AllocDosObject(DOS_RDARGS,TAG_DONE))
  213.         {
  214.             GlobalRDArgs->RDA_Source.CS_Buffer=LineBuffer;
  215.             GlobalRDArgs->RDA_Source.CS_Length=LineLength;
  216.             GlobalRDArgs->RDA_Source.CS_CurChr=0;
  217.             GlobalRDArgs->RDA_DAList=NULL;
  218.             GlobalRDArgs->RDA_Buffer=NULL;
  219.             GlobalRDArgs->RDA_BufSiz=NULL;
  220.             GlobalRDArgs->RDA_ExtHelp=NULL;
  221.             GlobalRDArgs->RDA_Flags=RDAF_NOPROMPT;
  222.             
  223.             /* Try to parse the string */
  224.             if (!(GlobalRDArgsSuccess=ReadArgs(Template, (LONG *)&AA, GlobalRDArgs)))
  225.             {
  226.                 Fault(IoErr(),NULL, ErrorBuffer, sizeof(ErrorBuffer));
  227.                 Message("Error parsing default options:\n%s%s",GlobalRDArgs->RDA_Source.CS_Buffer,ErrorBuffer);
  228.                 Success=FALSE;
  229.             }
  230.         }
  231.     }
  232.     if (!Success)
  233.     {
  234.         memset(&AA, sizeof(AA), 0);
  235.         FreeDefaults();
  236.     }
  237.     return(Success);
  238. }
  239.  
  240.  
  241. /* Free global defaults */
  242.  
  243. void FreeDefaults()
  244. {
  245.     if (GlobalRDArgsSuccess)
  246.     {
  247.         FreeArgs(GlobalRDArgsSuccess);
  248.         GlobalRDArgsSuccess=NULL;
  249.     }
  250.     if (GlobalRDArgs)
  251.     {
  252.         FreeDosObject(DOS_RDARGS, GlobalRDArgs);
  253.         GlobalRDArgs=NULL;
  254.     }
  255. }
  256.