shithub: ft2play

ref: cea086da84e938d9396df9d250072ec956a125c6
dir: ft2play/ft2dec.c

View raw version
#include "common.h"
#include "pmplay.h"
#include "pmp_mix.h"

static void
usage(void)
{
	fprint(2, "usage: %s [-v volume] [-a amp] [-f freq] <file.(xm|mod|ft) >/dev/audio\n", argv0);
	exits("usage");
}

void
main(int argc, char **argv)
{
	int n, r, sz, frq, amp, vol;
	s16int s[1024*2];
	u8int *b;

	frq = 44100;
	amp = 10;
	vol = 256;
	ARGBEGIN{
	case 'f':
		frq = atoi(EARGF(usage()));
		assert(frq >= 8000 && frq <= 96000);
		break;
	case 'a':
		amp = atoi(EARGF(usage()));
		assert(amp >= 1 && amp <= 32);
		break;
	case 'v':
		vol = atoi(EARGF(usage()));
		assert(vol >= 0 && vol <= 256);
		break;
	default:
		usage();
	}ARGEND

	if(!initMusic(frq, nelem(s)/2, true, true))
		sysfatal("initMusic");
	setAmp(amp);
	setMasterVol(vol);

	sz = 32768;
	b = nil;
	for(n = 0;; n += r){
		if(sz-n < 65536){
			sz *= 2;
			if((b = realloc(b, sz)) == nil)
				sysfatal("memory");
		}
		if((r = read(0, b+n, sz-n)) < 0)
			sysfatal("%r");
		if(r == 0)
			break;
	}

	if(!loadMusicFromData(b, n))
		sysfatal("loadMusicFromData");
	if(!startMusic())
		sysfatal("startMusic");
	startPlaying();
	for(;;){
		mix_UpdateBuffer(s, nelem(s)/2);
		write(1, s, sizeof(s));
		if(dump_EndOfTune(song.len-1))
			break;
	}

	stopMusic();
	freeMusic();

	exits(nil);
}