/* 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; }