home *** CD-ROM | disk | FTP | other *** search
/ Assembly 1994 - The 3rd Phase / ASMROM94.mdf / fc / utils / stmik / play.c < prev    next >
C/C++ Source or Header  |  1991-07-14  |  5KB  |  155 lines

  1.  
  2. #include <stdio.h>
  3. #include <malloc.h>
  4. #include "stmik.h"
  5.  
  6. int    isfilestx(char *fname);
  7. int    endprg(char *txt);
  8. char far *loadfile(char *fname);
  9.  
  10. int    autostop=1;
  11. int    extendedhelp=0;
  12. int    io=0x220,irq=0x7,mixspd=16000;
  13. int    quietmode=0;
  14. char    filename[16][65]={"?"};
  15. int    files=0;
  16.  
  17. main(int argc,char *argv[])
  18. {
  19.     char far *p;
  20.     int    a,b,f;
  21.     for(a=1;a<argc;a++) if(*argv[a]=='/' || *argv[a]=='-') switch(argv[a][1])
  22.     {
  23.         case 'a' :
  24.         case 'A' :
  25.             io=0x200+0x10*(argv[a][3]-'0');
  26.             if((io&15)!=0 || io>0x260 || io<0x210)
  27.             {
  28.                 printf("Allowed IO addresses are 210,220,230,240,250 and 260.");
  29.             } break;
  30.         case 'i' :
  31.         case 'I' :
  32.             irq=(argv[a][2]-'0');
  33.             if(irq!=1 && irq!=3 && irq!=5 && irq!=7)
  34.             {
  35.                 printf("Allowed IRQ numbers are 1,3,5 and 7.\n");
  36.                 exit(1);
  37.             } break;
  38.         case 's' :
  39.         case 'S' :
  40.             mixspd=atoi(argv[a]+2);
  41.             if(mixspd>20000) 
  42.             {
  43.                 printf("Maximum mixing speed is 20000.\n");
  44.                 exit(1);
  45.             } break;
  46.         case 'q' :
  47.         case 'Q' :
  48.             quietmode=1; break;
  49.         case 'h' :
  50.         case 'H' :
  51.         case '?' :
  52.             extendedhelp=1;
  53.             break;
  54.         case 'c' :
  55.         case 'C' :
  56.             autostop=0;
  57.             break;
  58.     }
  59.     else { strcpy(filename[files],argv[a]); files++; }
  60.     if(*filename[0]=='?' || extendedhelp)
  61.     {
  62.         printf("\nSTMIK module player V1.0   Copyright (C) 1991 Sami Tammilehto\n"
  63.             "usage: PLAY <filename(s)> [switch(es)]    switches:\n"
  64.             "-a###  Address of the SoundBlaster (###=210,220,230...)\n"
  65.             "-i#    IRQ number of the SoundBlaster (#=1,3,5,7)\n"
  66.             "-s#### Mixing speed (10000,16000,20000)\n"
  67.             "-q     Quiet mode; no screen output (except errors)\n"
  68.             "-c     Continuous play; don't stop after one loop\n"
  69.             "-h     Extended help\n");
  70.         if(extendedhelp) printf("\n"
  71.             "The STMIK module player can play both .STX and .STM modules.\n"
  72.             "It will autodetect the module format. The STX modules are meant\n"
  73.             "to be used only in programs using STMIK and are not to be used\n"
  74.             "as storage files. (this is because the format will change!)\n\n"
  75.             "The player defaults to SoundBlaster at 220h with IRQ 7 and mixing\n"
  76.             "speed of 16000. The mixing speed determines the quality of the\n"
  77.             "sound. The higher sounds better (but also takes more processor time.)\n"
  78.             "The speed 16000 is roughly equal to Scream Trackers 12Mhz mode.\n\n"
  79.             "The source code of this player is included in the STMIK\n"
  80.             "(Scream Tracker Music Interface Kit V0.2). Call the Silicon\n"
  81.             "Dragon (+358-21-500318) for STMIK and other great stuff!\n");
  82.         exit(0);
  83.     }
  84.     if(stmik_init(1,io,irq,mixspd)) endprg("Error initializing SoundBlaster.\n");
  85.     for(f=0;f<files;f++)
  86.     {
  87.         strupr(filename[f]);
  88.         if(!quietmode) printf("Loading %s as ",filename[f]);
  89.         if(isfilestx(filename[f]))    
  90.         {
  91.             if(!quietmode) printf("STX... ");
  92.             p=loadfile(filename[f]);
  93.             b=1;
  94.         }
  95.         else 
  96.         {
  97.             if(!quietmode) printf("STM... ");
  98.             p=stmik_loadstm(filename[f]);
  99.             b=0;
  100.         }
  101.         if(p==NULL) endprg("File not found or out of memory.");
  102.         if(!quietmode) printf("Playing... ");
  103.         if(stmik_playsong(p)) endprg("Error while starting song.");
  104.         for(a=-1;!kbhit() && (stmik_songpos()<256 || !autostop);) if(a!=stmik_songpos())
  105.         {
  106.             if(!quietmode) printf("(order:%2i)\b\b\b\b\b\b\b\b\b\b",stmik_songpos()&255);
  107.             a=stmik_songpos();
  108.         }
  109.         while(kbhit()) getch();
  110.         if(!quietmode) printf("Done!                 \n");
  111.         if(stmik_stopsong()) endprg("Error while ending song.");
  112.         /* free memory */
  113.         if(b) hfree(p);
  114.         else stmik_freestm();
  115.     }
  116. }
  117.  
  118. int    endprg(char *txt)
  119. {
  120.     printf("%s\nExiting to dos.\n",txt);
  121.     exit(3);
  122. }
  123.  
  124. char far *loadfile(char *fname)
  125. { /* this routine is not 'standard' C, it uses some DOS/segment stuff
  126.      to make loading easier and works at least under MSC. */
  127.     FILE    *f1;
  128.     char far *p,*p2;
  129.     f1=fopen(fname,"rb");
  130.     if(f1==NULL) return(NULL);
  131.     fseek(f1,0L,SEEK_END);
  132.     p2=p=halloc((long)ftell(f1),1); /* returns a pointer to PURE segment at least under MSC */
  133.     if(p==NULL) return(NULL);
  134.     fseek(f1,0L,SEEK_SET);
  135.     while(fread(p2,1,16384,f1)==16384) p2=(char far *)((long)p2+1024L*65536L);
  136.     fclose(f1);
  137.     return(p);
  138. }
  139.  
  140. int    isfilestx(char *fname)
  141. { /* remark that the .STX format is a temporary one, so this routine may
  142.      not work with future versions of the format! */
  143.     int    a=1;
  144.     FILE    *f1;
  145.     f1=fopen(fname,"rb");
  146.     if(f1==NULL) return(1);
  147.     fseek(f1,0x3cL,SEEK_SET);
  148.     if(getc(f1)!='S') a=0;
  149.     if(getc(f1)!='C') a=0;
  150.     if(getc(f1)!='R') a=0;
  151.     if(getc(f1)!='M') a=0;
  152.     fclose(f1);
  153.     return(a);
  154. }
  155.