--- /dev/null
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/soundcard.h>
+
+#define SYNTH
+
+int main(int argc, char *argv[])
+{
+ short buff[1024];
+ int i, l, oss_dev, rate = 44100;
+ int sv = 0, ss = 1;
+
+#ifndef SYNTH
+ FILE *f;
+ f = fopen(argv[1], "rb");
+ if (f == NULL)
+ {
+ perror("fopen");
+ return 1;
+ }
+#endif
+ oss_dev = open("/dev/dsp", O_WRONLY);
+ if (oss_dev == -1)
+ {
+ perror("open /dev/dsp");
+ return 1;
+ }
+
+ if (argc > 2)
+ {
+ int stereo = 1, bits = 16, frags = (11<<16) | 8;
+ rate = atoi(argv[2]);
+ ioctl(oss_dev, SNDCTL_DSP_STEREO, &stereo);
+ ioctl(oss_dev, SNDCTL_DSP_SETFMT, &bits);
+ ioctl(oss_dev, SNDCTL_DSP_SPEED, &rate);
+ ioctl(oss_dev, SNDCTL_DSP_SETFRAGMENT, &frags);
+ }
+
+ for (l = 0; l < 200; l++)
+ {
+#ifndef SYNTH
+ i = fread(buff, 1, sizeof(buff), f);
+ if (i <= 0)
+ {
+ break;
+ }
+#else
+ for (i = 0; i < sizeof(buff)/sizeof(buff[0]); i++) {
+ sv += ss * 16000;
+ if (sv == 64000 || sv == -64000)
+ ss *= -1;
+ buff[i] = sv;
+ }
+ i *= 2;
+#endif
+
+ write(oss_dev, buff, i);
+ }
+
+ close(oss_dev);
+#ifndef SYNTH
+ fclose(f);
+#endif
+ return 0;
+}
+