summaryrefslogtreecommitdiff
path: root/audio/rsynth/files/freebsdplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'audio/rsynth/files/freebsdplay.c')
-rw-r--r--audio/rsynth/files/freebsdplay.c140
1 files changed, 140 insertions, 0 deletions
diff --git a/audio/rsynth/files/freebsdplay.c b/audio/rsynth/files/freebsdplay.c
new file mode 100644
index 00000000000..065b21fb9e1
--- /dev/null
+++ b/audio/rsynth/files/freebsdplay.c
@@ -0,0 +1,140 @@
+#include <config.h>
+
+/*****************************************************************/
+/*** ***/
+/*** Play out a file on FreeBSD ***/
+/*** (conf/linuxplay.c with changes) ***/
+/*** ***/
+/*****************************************************************/
+
+#include <useconfig.h>
+#include <stdio.h>
+#include <math.h>
+#include <errno.h>
+#include <ctype.h>
+
+#include <fcntl.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/param.h>
+#include <sys/signal.h>
+
+#include <sys/ioctl.h>
+
+#include <machine/soundcard.h>
+#include "proto.h"
+#include "getargs.h"
+#include "hplay.h"
+
+#define SAMP_RATE 8000
+long samp_rate = SAMP_RATE;
+
+/* Audio Parameters */
+
+static int dev_fd = -1;
+ /* file descriptor for audio device */
+char *dev_file = "/dev/dsp";
+
+static int linear_fd = -1;
+
+static char *linear_file = NULL;
+
+char *prog = "hplay";
+
+static int
+audio_open(void)
+{
+ dev_fd = open(dev_file, O_WRONLY | O_NDELAY);
+ if (dev_fd < 0)
+ {
+ perror(dev_file);
+ return 0;
+ }
+ return 1;
+}
+
+int
+audio_init(int argc, char *argv[])
+{
+ int rate_set = 0;
+ int use_audio = 1;
+
+ prog = argv[0];
+
+ argc = getargs("freebsd Audio",argc, argv,
+ "r", "%d", &rate_set, "Sample rate",
+ "a", NULL, &use_audio, "Audio enable",
+ NULL);
+
+ if (help_only)
+ return argc;
+
+ if (use_audio)
+ audio_open();
+
+ if (rate_set)
+ samp_rate = rate_set;
+
+ if (dev_fd > 0)
+ {
+ ioctl(dev_fd, SNDCTL_DSP_SPEED, &samp_rate);
+ printf("Actual sound rate: %ld\n", samp_rate);
+ }
+
+ return argc;
+}
+
+void
+audio_term()
+{
+ int dummy;
+
+ /* Close audio system */
+ if (dev_fd >= 0)
+ {
+ ioctl(dev_fd, SNDCTL_DSP_SYNC, &dummy);
+ close(dev_fd);
+ dev_fd = -1;
+ }
+
+ /* Finish linear file */
+ if (linear_fd >= 0)
+ {
+ ftruncate(linear_fd, lseek(linear_fd, 0L, SEEK_CUR));
+ close(linear_fd);
+ linear_fd = -1;
+ }
+}
+
+void
+audio_play(int n, short *data)
+{
+ if (n > 0)
+ {
+ unsigned char *converted = (unsigned char *) malloc(n);
+ int i;
+
+ if (converted == NULL)
+ {
+ fprintf(stderr, "Could not allocate memory for conversion\n");
+ exit(3);
+ }
+
+ for (i = 0; i < n; i++)
+ converted[i] = (data[i] - 32768) / 256;
+
+ if (linear_fd >= 0)
+ {
+ if (write(linear_fd, converted, n) != n)
+ perror("write");
+ }
+
+ if (dev_fd >= 0)
+ {
+ if (write(dev_fd, converted, n) != n)
+ perror("write");
+ }
+
+ free(converted);
+ }
+}