]> 4ch.mooo.com Git - 16.git/blob - 16/v2/source/MAPED/MIKMOD.C
refresh wwww
[16.git] / 16 / v2 / source / MAPED / MIKMOD.C
1 /*\r
2 \r
3 Name:\r
4 MIKMOD.C\r
5 \r
6 Description:\r
7 Modplaying example of mikmod.\r
8 \r
9 MSDOS:  BC(y)   Watcom(y)       DJGPP(y)\r
10 Win95:  BC(y*)\r
11 Os2:    y\r
12 Linux:  n\r
13 \r
14 * console mode only\r
15 (y) - yes\r
16 (n) - no (not possible or not useful)\r
17 (?) - may be possible, but not tested\r
18 \r
19 */\r
20 #ifdef __WIN32__\r
21 #include <windows.h>\r
22 #endif\r
23 \r
24 #include <stdio.h>\r
25 #include <stdlib.h>\r
26 #include <conio.h>\r
27 #include <string.h>\r
28 \r
29 #ifndef __OS2__\r
30 #include <dos.h>\r
31 #endif\r
32 \r
33 #include "wildfile.h"\r
34 #include "mikmod.h"\r
35 \r
36 char helptext[]=\r
37 \r
38 "Available switches (CaSe SeNsItIvE!):\n"\r
39 "\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
51 \r
52 \r
53 /*\r
54         declarations for boring old sys-v style getopt *yawn*:\r
55 */\r
56 int     getopt(int argc, char *argv[], char *optionS);\r
57 extern char *optarg;\r
58 extern int optind;\r
59 extern int opterr;\r
60 \r
61 \r
62 void tickhandler(void)\r
63 {\r
64         MP_HandleTick();    /* play 1 tick of the module */\r
65         MD_SetBPM(mp_bpm);\r
66 }\r
67 \r
68 \r
69 int main(int argc,char *argv[])\r
70 {\r
71         UNIMOD *mf;\r
72         int cmderr=0;                   /* error in commandline flag */\r
73         int morehelp=0;                 /* set if user wants more help */\r
74         int quit;\r
75         int t;\r
76         static int nargc;\r
77         static char **nargv;\r
78 \r
79         puts(mikbanner);\r
80 \r
81         /* Expand wildcards on commandline */\r
82 \r
83         nargc=argc; nargv=argv;\r
84 #ifndef __DJGPP__\r
85         MyGlob(&nargc,&nargv,0);\r
86 #else\r
87         setvbuf(stdout, NULL, _IONBF, 0);\r
88         __djgpp_set_ctrl_c(0);\r
89 #endif\r
90 \r
91         /*\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
95         */\r
96 \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
101 \r
102         /*\r
103                 Register the loaders we want to use..\r
104         */\r
105 \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
114 \r
115         /*\r
116                 Register the drivers we want to use:\r
117         */\r
118 \r
119         MD_RegisterDriver(&drv_nos);\r
120 #ifdef __OS2__\r
121         MD_RegisterDriver(&drv_os2);\r
122 #elif defined(__WIN32__)\r
123         MD_RegisterDriver(&drv_w95);\r
124 #else\r
125         MD_RegisterDriver(&drv_ss);\r
126         MD_RegisterDriver(&drv_sb);\r
127         MD_RegisterDriver(&drv_gus);\r
128 #endif\r
129 \r
130         MD_RegisterPlayer(tickhandler);\r
131 \r
132         /* Parse option switches using standard getopt function: */\r
133 \r
134         opterr=0;\r
135 \r
136         while( !cmderr &&\r
137                   (t=getopt(nargc,nargv,"ohxpm8irv:f:l:d:")) != EOF ){\r
138 \r
139                 switch(t){\r
140 \r
141                         case 'd':\r
142                                 md_device=atoi(optarg);\r
143                                 break;\r
144 \r
145                         case 'l':\r
146                                 if(optarg[0]=='d') MD_InfoDriver();\r
147                                 else if(optarg[0]=='l') ML_InfoLoader();\r
148                                 else{\r
149                                         cmderr=1;\r
150                                         break;\r
151                                 }\r
152                                 exit(0);\r
153 \r
154                         case 'r':\r
155                                 mp_loop=1;\r
156                                 break;\r
157 \r
158                         case 'm':\r
159                                 md_mode&=~DMODE_STEREO;\r
160                                 break;\r
161 \r
162                         case '8':\r
163                                 md_mode&=~DMODE_16BITS;\r
164                                 break;\r
165 \r
166                         case 'i':\r
167                                 md_mode|=DMODE_INTERP;\r
168                                 break;\r
169 \r
170                         case 'x':\r
171                                 mp_extspd=0;\r
172                                 break;\r
173 \r
174                         case 'p':\r
175                                 mp_panning=0;\r
176                                 break;\r
177 \r
178                         case 'v':\r
179                                 if((mp_volume=atoi(optarg))>100) mp_volume=100;\r
180                                 break;\r
181 \r
182                         case 'f':\r
183                                 md_mixfreq=atol(optarg);\r
184                                 break;\r
185 \r
186                         case 'h':\r
187                                 morehelp=1;\r
188                                 cmderr=1;\r
189                                 break;\r
190 \r
191                         case '?':\r
192                                 puts("\07Invalid switch or option needs an argument\n");\r
193                                 cmderr=1;\r
194                                 break;\r
195                 }\r
196         }\r
197 \r
198         if(cmderr || optind>=nargc){\r
199 \r
200                 /*\r
201                         there was an error in the commandline, or there were no true\r
202                         arguments, so display a usage message\r
203                 */\r
204 \r
205                 puts("Usage: MIKMOD [switches] <fletch.mod> ... \n");\r
206 \r
207                 if(morehelp)\r
208                         puts(helptext);\r
209                 else\r
210                         puts("Type MIKMOD /h for more help.");\r
211 \r
212                 exit(-1);\r
213         }\r
214 \r
215         /*  initialize soundcard */\r
216 \r
217         if(!MD_Init()){\r
218                 printf("Driver error: %s.\n",myerr);\r
219                 return 0;\r
220         }\r
221 \r
222         printf("Using %s for %d bit %s %s sound at %u Hz\n\n",\r
223                         md_driver->Name,\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
227                         md_mixfreq);\r
228 \r
229 #ifdef __OS2__\r
230         DosSetPriority( PRTYS_THREAD, PRTYC_TIMECRITICAL, 5L, 0UL );\r
231 #endif\r
232 \r
233         for(quit=0; !quit && optind<nargc; optind++){\r
234 \r
235                 printf("File    : %s\n",nargv[optind]);\r
236 \r
237                 /* load the module */\r
238 \r
239                 mf=ML_LoadFN(nargv[optind]);\r
240 \r
241                 /* didn't work -> exit with errormsg. */\r
242 \r
243                 if(mf==NULL){\r
244                         printf("MikMod Error: %s\n",myerr);\r
245                         break;\r
246                 }\r
247 \r
248                 /*      initialize modplayer to play this module */\r
249 \r
250                 MP_Init(mf);\r
251 \r
252                 printf( "Songname: %s\n"\r
253                                 "Modtype : %s\n"\r
254                                 "Periods : %s,%s\n",\r
255                                 mf->songname,\r
256                                 mf->modtype,\r
257                                 (mf->flags&UF_XMPERIODS) ? "XM type" : "mod type",\r
258                                 (mf->flags&UF_LINEAR) ? "Linear" : "Log");\r
259 \r
260                 /*\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
264                 */\r
265 \r
266                 md_numchn=mf->numchn;\r
267 \r
268                 /*  start playing the module: */\r
269 \r
270                 MD_PlayStart();\r
271 \r
272                 while(!MP_Ready()){\r
273 \r
274                         char c;\r
275 \r
276                         c=kbhit() ? getch() : 0;\r
277 \r
278                         if(c=='+')\r
279                                 MP_NextPosition();\r
280                         else if(c=='-')\r
281                                 MP_PrevPosition();\r
282                         else if(c==0x1b){\r
283                                 quit=1;\r
284                                 break;\r
285                         }\r
286                         else if(c==' ') break;\r
287 \r
288                         MD_Update();\r
289 \r
290                         /* wait a bit */\r
291 \r
292 #if defined(__OS2__)\r
293                         DosSleep(40);   /* hmmmm */\r
294 #elif defined(__WIN32__)\r
295                         Sleep(10);\r
296 #elif defined(__DJGPP__)\r
297                         /* no wait for djgpp ? */\r
298 #else\r
299                         delay(10);\r
300 #endif\r
301                         printf("\rsngpos:%d patpos:%d sngspd %d bpm %d   ",mp_sngpos,mp_patpos,mp_sngspd,mp_bpm);\r
302                 }\r
303 \r
304                 MD_PlayStop();          /* stop playing */\r
305                 ML_Free(mf);            /* and free the module */\r
306                 puts("\n");\r
307         }\r
308 \r
309         MD_Exit();\r
310         return 0;\r
311 }\r