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