--- /dev/null
+/*\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