]> 4ch.mooo.com Git - 16.git/blobdiff - 16/v2/source/MAPED/MIKMOD.C
new file: 16/v2/CONSOLE.TXT
[16.git] / 16 / v2 / source / MAPED / MIKMOD.C
diff --git a/16/v2/source/MAPED/MIKMOD.C b/16/v2/source/MAPED/MIKMOD.C
new file mode 100644 (file)
index 0000000..2ab62d2
--- /dev/null
@@ -0,0 +1,311 @@
+/*\r
+\r
+Name:\r
+MIKMOD.C\r
+\r
+Description:\r
+Modplaying example of mikmod.\r
+\r
+MSDOS: BC(y)   Watcom(y)       DJGPP(y)\r
+Win95: BC(y*)\r
+Os2:   y\r
+Linux: n\r
+\r
+* console mode only\r
+(y) - yes\r
+(n) - no (not possible or not useful)\r
+(?) - may be possible, but not tested\r
+\r
+*/\r
+#ifdef __WIN32__\r
+#include <windows.h>\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <conio.h>\r
+#include <string.h>\r
+\r
+#ifndef __OS2__\r
+#include <dos.h>\r
+#endif\r
+\r
+#include "wildfile.h"\r
+#include "mikmod.h"\r
+\r
+char helptext[]=\r
+\r
+"Available switches (CaSe SeNsItIvE!):\n"\r
+"\n"\r
+"  /d x    use device-driver #x for output (0 is autodetect). Default=0\n"\r
+"  /ld     List all available device-drivers\n"\r
+"  /ll     List all available loaders\n"\r
+"  /x      disables protracker extended speed\n"\r
+"  /p      disables panning effects (9fingers.mod)\n"\r
+"  /v xx   Sets volume from 0 (silence) to 100. Default=100\n"\r
+"  /f xxxx Sets mixing frequency. Default=44100\n"\r
+"  /m      Force mono output (so sb-pro can mix at 44100)\n"\r
+"  /8      Force 8 bit output\n"\r
+"  /i      Use interpolated mixing\n"\r
+"  /r      Restart a module when it's done playing";\r
+\r
+\r
+/*\r
+       declarations for boring old sys-v style getopt *yawn*:\r
+*/\r
+int     getopt(int argc, char *argv[], char *optionS);\r
+extern char *optarg;\r
+extern int optind;\r
+extern int opterr;\r
+\r
+\r
+void tickhandler(void)\r
+{\r
+       MP_HandleTick();    /* play 1 tick of the module */\r
+       MD_SetBPM(mp_bpm);\r
+}\r
+\r
+\r
+int main(int argc,char *argv[])\r
+{\r
+       UNIMOD *mf;\r
+       int cmderr=0;                   /* error in commandline flag */\r
+       int morehelp=0;                 /* set if user wants more help */\r
+       int quit;\r
+       int t;\r
+       static int nargc;\r
+       static char **nargv;\r
+\r
+       puts(mikbanner);\r
+\r
+       /* Expand wildcards on commandline */\r
+\r
+       nargc=argc; nargv=argv;\r
+#ifndef __DJGPP__\r
+       MyGlob(&nargc,&nargv,0);\r
+#else\r
+       setvbuf(stdout, NULL, _IONBF, 0);\r
+       __djgpp_set_ctrl_c(0);\r
+#endif\r
+\r
+       /*\r
+               Initialize soundcard parameters.. you _have_ to do this\r
+               before calling MD_Init(), and it's illegal to change them\r
+               after you've called MD_Init()\r
+       */\r
+\r
+       md_mixfreq      =44100;                     /* standard mixing freq */\r
+       md_dmabufsize   =20000;                     /* standard dma buf size */\r
+       md_mode         =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */\r
+       md_device       =0;                                                     /* standard device: autodetect */\r
+\r
+       /*\r
+               Register the loaders we want to use..\r
+       */\r
+\r
+       ML_RegisterLoader(&load_m15);    /* if you use m15load, register it as first! */\r
+       ML_RegisterLoader(&load_mod);\r
+       ML_RegisterLoader(&load_mtm);\r
+       ML_RegisterLoader(&load_s3m);\r
+       ML_RegisterLoader(&load_stm);\r
+       ML_RegisterLoader(&load_ult);\r
+       ML_RegisterLoader(&load_uni);\r
+       ML_RegisterLoader(&load_xm);\r
+\r
+       /*\r
+               Register the drivers we want to use:\r
+       */\r
+\r
+       MD_RegisterDriver(&drv_nos);\r
+#ifdef __OS2__\r
+       MD_RegisterDriver(&drv_os2);\r
+#elif defined(__WIN32__)\r
+       MD_RegisterDriver(&drv_w95);\r
+#else\r
+       MD_RegisterDriver(&drv_ss);\r
+       MD_RegisterDriver(&drv_sb);\r
+       MD_RegisterDriver(&drv_gus);\r
+#endif\r
+\r
+       MD_RegisterPlayer(tickhandler);\r
+\r
+       /* Parse option switches using standard getopt function: */\r
+\r
+       opterr=0;\r
+\r
+       while( !cmderr &&\r
+                 (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
+\r
+               switch(t){\r
+\r
+                       case 'd':\r
+                               md_device=atoi(optarg);\r
+                               break;\r
+\r
+                       case 'l':\r
+                               if(optarg[0]=='d') MD_InfoDriver();\r
+                               else if(optarg[0]=='l') ML_InfoLoader();\r
+                               else{\r
+                                       cmderr=1;\r
+                                       break;\r
+                               }\r
+                               exit(0);\r
+\r
+                       case 'r':\r
+                               mp_loop=1;\r
+                               break;\r
+\r
+                       case 'm':\r
+                               md_mode&=~DMODE_STEREO;\r
+                               break;\r
+\r
+                       case '8':\r
+                               md_mode&=~DMODE_16BITS;\r
+                               break;\r
+\r
+                       case 'i':\r
+                               md_mode|=DMODE_INTERP;\r
+                               break;\r
+\r
+                       case 'x':\r
+                               mp_extspd=0;\r
+                               break;\r
+\r
+                       case 'p':\r
+                               mp_panning=0;\r
+                               break;\r
+\r
+                       case 'v':\r
+                               if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
+                               break;\r
+\r
+                       case 'f':\r
+                               md_mixfreq=atol(optarg);\r
+                               break;\r
+\r
+                       case 'h':\r
+                               morehelp=1;\r
+                               cmderr=1;\r
+                               break;\r
+\r
+                       case '?':\r
+                               puts("\07Invalid switch or option needs an argument\n");\r
+                               cmderr=1;\r
+                               break;\r
+               }\r
+       }\r
+\r
+       if(cmderr || optind>=nargc){\r
+\r
+               /*\r
+                       there was an error in the commandline, or there were no true\r
+                       arguments, so display a usage message\r
+               */\r
+\r
+               puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
+\r
+               if(morehelp)\r
+                       puts(helptext);\r
+               else\r
+                       puts("Type MIKMOD /h for more help.");\r
+\r
+               exit(-1);\r
+       }\r
+\r
+       /*  initialize soundcard */\r
+\r
+       if(!MD_Init()){\r
+               printf("Driver error: %s.\n",myerr);\r
+               return 0;\r
+       }\r
+\r
+       printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
+                       md_driver->Name,\r
+                       (md_mode&DMODE_16BITS) ? 16:8,\r
+                       (md_mode&DMODE_INTERP) ? "interpolated":"normal",\r
+                       (md_mode&DMODE_STEREO) ? "stereo":"mono",\r
+                       md_mixfreq);\r
+\r
+#ifdef __OS2__\r
+       DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
+#endif\r
+\r
+       for(quit=0; !quit && optind<nargc; optind++){\r
+\r
+               printf("File    : %s\n",nargv[optind]);\r
+\r
+               /* load the module */\r
+\r
+               mf=ML_LoadFN(nargv[optind]);\r
+\r
+               /* didn't work -> exit with errormsg. */\r
+\r
+               if(mf==NULL){\r
+                       printf("MikMod Error: %s\n",myerr);\r
+                       break;\r
+               }\r
+\r
+               /*      initialize modplayer to play this module */\r
+\r
+               MP_Init(mf);\r
+\r
+               printf( "Songname: %s\n"\r
+                               "Modtype : %s\n"\r
+                               "Periods : %s,%s\n",\r
+                               mf->songname,\r
+                               mf->modtype,\r
+                               (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
+                               (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
+\r
+               /*\r
+                       set the number of voices to use.. you\r
+                       could add extra channels here (e.g. md_numchn=mf->numchn+4; )\r
+                       to use for your own soundeffects:\r
+               */\r
+\r
+               md_numchn=mf->numchn;\r
+\r
+               /*  start playing the module: */\r
+\r
+               MD_PlayStart();\r
+\r
+               while(!MP_Ready()){\r
+\r
+                       char c;\r
+\r
+                       c=kbhit() ? getch() : 0;\r
+\r
+                       if(c=='+')\r
+                               MP_NextPosition();\r
+                       else if(c=='-')\r
+                               MP_PrevPosition();\r
+                       else if(c==0x1b){\r
+                               quit=1;\r
+                               break;\r
+                       }\r
+                       else if(c==' ') break;\r
+\r
+                       MD_Update();\r
+\r
+                       /* wait a bit */\r
+\r
+#if defined(__OS2__)\r
+                       DosSleep(40);   /* hmmmm */\r
+#elif defined(__WIN32__)\r
+                       Sleep(10);\r
+#elif defined(__DJGPP__)\r
+                        /* no wait for djgpp ? */\r
+#else\r
+                        delay(10);\r
+#endif\r
+                        printf("\rsngpos:%d patpos:%d sngspd %d bpm %d   ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
+               }\r
+\r
+               MD_PlayStop();          /* stop playing */\r
+               ML_Free(mf);            /* and free the module */\r
+               puts("\n");\r
+       }\r
+\r
+       MD_Exit();\r
+       return 0;\r
+}\r