home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Games Machine 25
/
GNOME_DEMO.iso
/
amiga
/
music
/
mikmod.lzx
/
mikmod
/
mikxmod.c
< prev
next >
Wrap
C/C++ Source or Header
|
1997-02-18
|
5KB
|
245 lines
/*
Name:
MIKMOD.C
Description:
Modplaying example of mikmod - bare linux (unix?) version.
*/
#include <stdio.h>
#include <stdlib.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=22050\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 nargc,char *nargv[])
{
UNIMOD *mf;
int cmderr=0; /* error in commandline flag */
int morehelp=0; /* set if user wants more help */
int quit;
int t;
puts(mikbanner);
/*
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 =22050; /* standard mixing freq */
md_dmabufsize =10000; /* 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);
MD_RegisterDriver(&drv_raw);
MD_RegisterDriver(&drv_pau);
MD_RegisterDriver(&drv_p14);
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] <fletch.mod> ... \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);
for(quit=0; !quit && optind<nargc; optind++){
printf("File : %s\n",nargv[optind]);
/* load the module */
mf=ML_LoadFN(nargv[optind]);
/* didn't work -> 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()){
MD_Update();
/* no need to wait with linux voxware */
}
MD_PlayStop(); /* stop playing */
ML_Free(mf); /* and free the module */
puts("\n");
}
MD_Exit();
return 0;
}