ref: af2f7ea2364f50458b46262aa7027470983c13b6
dir: /sys/src/games/opl3/opl3m.c/
#include <u.h> #include <libc.h> #include <bio.h> void opl3out(uchar *, int); void opl3wr(int, int); void opl3init(int); void usage(void) { fprint(2, "usage: %s [-r rate] [file]\n", argv0); exits("usage"); } void main(int argc, char **argv) { int rate, r, v, dt, fd; uchar sb[65536 * 4], u[5]; Biobuf *bi; fd = 0; rate = 44100; ARGBEGIN{ case 'r': rate = atoi(EARGF(usage())); break; default: usage(); }ARGEND; if(*argv != nil) if((fd = open(*argv, OREAD)) < 0) sysfatal("open: %r"); bi = Bfdopen(fd, OREAD); if(bi == nil) sysfatal("Bfdopen: %r"); opl3init(rate); while(Bread(bi, u, sizeof u) > 0){ r = u[1] << 8 | u[0]; v = u[2]; opl3wr(r, v); if(dt = (u[4] << 8 | u[3]) * 4){ /* 16-bit stereo */ opl3out(sb, dt); write(1, sb, dt); } } }