7 Modplaying example of mikmod.
\r
9 MSDOS: BC(y) Watcom(y) DJGPP(y)
\r
16 (n) - no (not possible or not useful)
\r
17 (?) - may be possible, but not tested
\r
21 #include <windows.h>
\r
33 #include "wildfile.h"
\r
38 "Available switches (CaSe SeNsItIvE!):\n"
\r
40 " /d x use device-driver #x for output (0 is autodetect). Default=0\n"
\r
41 " /ld List all available device-drivers\n"
\r
42 " /ll List all available loaders\n"
\r
43 " /x disables protracker extended speed\n"
\r
44 " /p disables panning effects (9fingers.mod)\n"
\r
45 " /v xx Sets volume from 0 (silence) to 100. Default=100\n"
\r
46 " /f xxxx Sets mixing frequency. Default=44100\n"
\r
47 " /m Force mono output (so sb-pro can mix at 44100)\n"
\r
48 " /8 Force 8 bit output\n"
\r
49 " /i Use interpolated mixing\n"
\r
50 " /r Restart a module when it's done playing";
\r
54 declarations for boring old sys-v style getopt *yawn*:
\r
56 int getopt(int argc, char *argv[], char *optionS);
\r
57 extern char *optarg;
\r
62 void tickhandler(void)
\r
64 MP_HandleTick(); /* play 1 tick of the module */
\r
69 int main(int argc,char *argv[])
\r
72 int cmderr=0; /* error in commandline flag */
\r
73 int morehelp=0; /* set if user wants more help */
\r
77 static char **nargv;
\r
81 /* Expand wildcards on commandline */
\r
83 nargc=argc; nargv=argv;
\r
85 MyGlob(&nargc,&nargv,0);
\r
87 setvbuf(stdout, NULL, _IONBF, 0);
\r
88 __djgpp_set_ctrl_c(0);
\r
92 Initialize soundcard parameters.. you _have_ to do this
\r
93 before calling MD_Init(), and it's illegal to change them
\r
94 after you've called MD_Init()
\r
97 md_mixfreq =44100; /* standard mixing freq */
\r
98 md_dmabufsize =20000; /* standard dma buf size */
\r
99 md_mode =DMODE_16BITS|DMODE_STEREO; /* standard mixing mode */
\r
100 md_device =0; /* standard device: autodetect */
\r
103 Register the loaders we want to use..
\r
106 ML_RegisterLoader(&load_m15); /* if you use m15load, register it as first! */
\r
107 ML_RegisterLoader(&load_mod);
\r
108 ML_RegisterLoader(&load_mtm);
\r
109 ML_RegisterLoader(&load_s3m);
\r
110 ML_RegisterLoader(&load_stm);
\r
111 ML_RegisterLoader(&load_ult);
\r
112 ML_RegisterLoader(&load_uni);
\r
113 ML_RegisterLoader(&load_xm);
\r
116 Register the drivers we want to use:
\r
119 MD_RegisterDriver(&drv_nos);
\r
121 MD_RegisterDriver(&drv_os2);
\r
122 #elif defined(__WIN32__)
\r
123 MD_RegisterDriver(&drv_w95);
\r
125 MD_RegisterDriver(&drv_ss);
\r
126 MD_RegisterDriver(&drv_sb);
\r
127 MD_RegisterDriver(&drv_gus);
\r
130 MD_RegisterPlayer(tickhandler);
\r
132 /* Parse option switches using standard getopt function: */
\r
137 (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){
\r
142 md_device=atoi(optarg);
\r
146 if(optarg[0]=='d') MD_InfoDriver();
\r
147 else if(optarg[0]=='l') ML_InfoLoader();
\r
159 md_mode&=~DMODE_STEREO;
\r
163 md_mode&=~DMODE_16BITS;
\r
167 md_mode|=DMODE_INTERP;
\r
179 if((mp_volume=atoi(optarg))>100) mp_volume=100;
\r
183 md_mixfreq=atol(optarg);
\r
192 puts("\07Invalid switch or option needs an argument\n");
\r
198 if(cmderr || optind>=nargc){
\r
201 there was an error in the commandline, or there were no true
\r
202 arguments, so display a usage message
\r
205 puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");
\r
210 puts("Type MIKMOD /h for more help.");
\r
215 /* initialize soundcard */
\r
218 printf("Driver error: %s.\n",myerr);
\r
222 printf("Using %s for %d bit %s %s sound at %u Hz\n\n",
\r
224 (md_mode&DMODE_16BITS) ? 16:8,
\r
225 (md_mode&DMODE_INTERP) ? "interpolated":"normal",
\r
226 (md_mode&DMODE_STEREO) ? "stereo":"mono",
\r
230 DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );
\r
233 for(quit=0; !quit && optind<nargc; optind++){
\r
235 printf("File : %s\n",nargv[optind]);
\r
237 /* load the module */
\r
239 mf=ML_LoadFN(nargv[optind]);
\r
241 /* didn't work -> exit with errormsg. */
\r
244 printf("MikMod Error: %s\n",myerr);
\r
248 /* initialize modplayer to play this module */
\r
252 printf( "Songname: %s\n"
\r
254 "Periods : %s,%s\n",
\r
257 (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",
\r
258 (mf->flags&UF_LINEAR) ? "Linear" : "Log");
\r
261 set the number of voices to use.. you
\r
262 could add extra channels here (e.g. md_numchn=mf->numchn+4; )
\r
263 to use for your own soundeffects:
\r
266 md_numchn=mf->numchn;
\r
268 /* start playing the module: */
\r
272 while(!MP_Ready()){
\r
276 c=kbhit() ? getch() : 0;
\r
286 else if(c==' ') break;
\r
292 #if defined(__OS2__)
\r
293 DosSleep(40); /* hmmmm */
\r
294 #elif defined(__WIN32__)
\r
296 #elif defined(__DJGPP__)
\r
297 /* no wait for djgpp ? */
\r
301 printf("\rsngpos:%d patpos:%d sngspd %d bpm %d ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);
\r
304 MD_PlayStop(); /* stop playing */
\r
305 ML_Free(mf); /* and free the module */
\r