diff options
author | tobik <tobik@FreeBSD.org> | 2017-05-31 00:18:54 +0800 |
---|---|---|
committer | tobik <tobik@FreeBSD.org> | 2017-05-31 00:18:54 +0800 |
commit | 037d420c13d82acb0f78865f04bb4e584b8faa5a (patch) | |
tree | a7f71174c9e076e1c846a6b264eccd86cd8cbaf6 /audio | |
parent | 169abea20bed35bccbf4508f9fb4e41081245e65 (diff) | |
download | freebsd-ports-gnome-037d420c13d82acb0f78865f04bb4e584b8faa5a.tar.gz freebsd-ports-gnome-037d420c13d82acb0f78865f04bb4e584b8faa5a.tar.zst freebsd-ports-gnome-037d420c13d82acb0f78865f04bb4e584b8faa5a.zip |
- Add Sndio backend from [1] and fix it
- Remove dead code
- Fix format selection and playback with raw devices
- Fix OSS backend
- Remove dead code
- Don't open the device in non-blocking mode. There is no error
handling for short writes and looking at how audio_play() is used in say.c
it is expected to block.
- Fix format selection
- Let the kernel handle sample conversion instead of doing it in the backend
- Make NAS support optional
- Make installing dictionary database tools optional
- Add LICENSE
Obtained from: OpenBSD [1] (based on)
Approved by: lme (mentor)
Differential Revision: https://reviews.freebsd.org/D10828
Diffstat (limited to 'audio')
-rw-r--r-- | audio/rsynth/Makefile | 23 | ||||
-rw-r--r-- | audio/rsynth/files/ossplay.c (renamed from audio/rsynth/files/freebsdplay.c) | 84 | ||||
-rw-r--r-- | audio/rsynth/files/patch-Makefile.in | 11 | ||||
-rw-r--r-- | audio/rsynth/files/patch-configure.in | 2 | ||||
-rw-r--r-- | audio/rsynth/files/sndioplay.c | 112 | ||||
-rw-r--r-- | audio/rsynth/pkg-plist | 6 |
6 files changed, 163 insertions, 75 deletions
diff --git a/audio/rsynth/Makefile b/audio/rsynth/Makefile index fdf82b18215b..4519037ab93a 100644 --- a/audio/rsynth/Makefile +++ b/audio/rsynth/Makefile @@ -3,7 +3,7 @@ PORTNAME= rsynth PORTVERSION= 2.0 -PORTREVISION= 4 +PORTREVISION= 5 CATEGORIES= audio accessibility MASTER_SITES= ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/synthesis/ \ ftp://ftp.enst.fr/pub/unix/multimedia/ @@ -11,14 +11,27 @@ MASTER_SITES= ftp://svr-ftp.eng.cam.ac.uk/pub/comp.speech/synthesis/ \ MAINTAINER= ports@FreeBSD.org COMMENT= Speech synthesizer -LIB_DEPENDS= libgdbm.so:databases/gdbm \ - libaudio.so:audio/nas +LICENSE= PD + +OPTIONS_DEFINE= DB NAS SNDIO +OPTIONS_SUB= yes + +DB_DESC= Build dictionary database tools +DB_LIB_DEPENDS= libgdbm.so:databases/gdbm +DB_CONFIGURE_ENV_OFF= ac_cv_lib_gdbm_gdbm_open=no +NAS_LIB_DEPENDS= libaudio.so:audio/nas +NAS_CONFIGURE_ENV_OFF= ac_cv_header_audio_audiolib_h=no +SNDIO_LIB_DEPENDS= libsndio.so:audio/sndio +SNDIO_MAKE_ENV= SAY_LIBS=-lsndio USES= autoreconf GNU_CONFIGURE= yes -pre-configure: - @${CP} ${FILESDIR}/freebsdplay.c ${WRKSRC}/config/freebsdplay.c +pre-configure-SNDIO-on: + @${CP} ${FILESDIR}/sndioplay.c ${WRKSRC}/config/freebsdplay.c + +pre-configure-SNDIO-off: + @${CP} ${FILESDIR}/ossplay.c ${WRKSRC}/config/freebsdplay.c post-configure: @${REINPLACE_CMD} -E 's,(BIN|LIB)_DIR\),DESTDIR\)$$\(&,g' \ diff --git a/audio/rsynth/files/freebsdplay.c b/audio/rsynth/files/ossplay.c index 3b8a63335220..0a20a1d7e69f 100644 --- a/audio/rsynth/files/freebsdplay.c +++ b/audio/rsynth/files/ossplay.c @@ -29,57 +29,43 @@ #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; + int fmt; prog = argv[0]; - argc = getargs("freebsd Audio",argc, argv, + argc = getargs("Audio output",argc, argv, "r", "%d", &rate_set, "Sample rate", "a", NULL, &use_audio, "Audio enable", NULL); - if (help_only) + if (help_only || !use_audio) return argc; - if (use_audio) - audio_open(); + dev_fd = open(dev_file, O_WRONLY); + if (dev_fd < 0) { + perror(dev_file); + return argc; + } 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); - } + fmt = AFMT_S16_NE; + if (ioctl(dev_fd, SNDCTL_DSP_SETFMT, &fmt) < 0) + perror("SNDCTL_DSP_SETFMT"); + + if (ioctl(dev_fd, SNDCTL_DSP_SPEED, &samp_rate) < 0) + perror("SNDCTL_DSP_SPEED"); return argc; } @@ -87,54 +73,20 @@ audio_init(int argc, char *argv[]) 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) + if (n > 0 && dev_fd >= 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); + size_t size = n * sizeof(short); + if (write(dev_fd, data, size) != size) + perror("write"); } } diff --git a/audio/rsynth/files/patch-Makefile.in b/audio/rsynth/files/patch-Makefile.in new file mode 100644 index 000000000000..a302d1bd2e4d --- /dev/null +++ b/audio/rsynth/files/patch-Makefile.in @@ -0,0 +1,11 @@ +--- Makefile.in.orig 2017-05-20 02:25:06 UTC ++++ Makefile.in +@@ -34,7 +34,7 @@ SAY_OBJS = say.o saynum.o darray.o ASCII.o phones.o te + getarg.o Revision.o + + say : $(SAY_OBJS) hplay.o +- $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) hplay.o $(LDLIBS) ++ $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) hplay.o $(SAY_LIBS) $(LDLIBS) + + nasay : $(SAY_OBJS) naplay.o + $(CC) -o $@ $(LDFLAGS) $(SAY_OBJS) naplay.o $(XLIBS) $(LDLIBS) diff --git a/audio/rsynth/files/patch-configure.in b/audio/rsynth/files/patch-configure.in index 52505df8549e..2a2e51216236 100644 --- a/audio/rsynth/files/patch-configure.in +++ b/audio/rsynth/files/patch-configure.in @@ -27,7 +27,7 @@ PROGS="$PROGS mkdictdb dlookup" else DICTS="" -@@ -126,7 +128,7 @@ if test "$ac_cv_header_audio_audiolib_h" +@@ -126,7 +128,7 @@ if test "$ac_cv_header_audio_audiolib_h" = yes ; then XLIBS="-laudio $XLIBS" AC_DEFINE(HAVE_NAS) ],,$XLIBS $LIBS) diff --git a/audio/rsynth/files/sndioplay.c b/audio/rsynth/files/sndioplay.c new file mode 100644 index 000000000000..c30adefca552 --- /dev/null +++ b/audio/rsynth/files/sndioplay.c @@ -0,0 +1,112 @@ +#include <config.h> + +/*****************************************************************/ +/*** ***/ +/*** Play out a file on OpenBSD ***/ +/*** (conf/linuxplay.c with changes) ***/ +/*** ***/ +/*****************************************************************/ + +#include <useconfig.h> +#include <stdio.h> +#include <math.h> +#include <ctype.h> + +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/param.h> +#include <sys/signal.h> + +#include <sndio.h> + +#include "proto.h" +#include "getargs.h" +#include "hplay.h" + +#define SAMP_RATE 8000 +long samp_rate = SAMP_RATE; + +static struct sio_hdl *hdl; +static struct sio_par par; + +char *prog = "hplay"; + +int +audio_init(int argc, char *argv[]) +{ + int rate_set = 0; + int use_audio = 1; + + prog = argv[0]; + + argc = getargs("Audio output",argc, argv, + "r", "%d", &rate_set, "Sample rate", + "a", NULL, &use_audio, "Audio enable", + NULL); + + if (help_only) + return argc; + + if (rate_set) + samp_rate = rate_set; + + if (!use_audio) + return argc; + + hdl = sio_open(NULL, SIO_PLAY, 0); + if (hdl == NULL) + { + fprintf(stderr, "sio_open failed\n"); + return argc; + } + + sio_initpar(&par); + par.bits = 16; + par.sig = 1; + par.le = SIO_LE_NATIVE; + par.rate = samp_rate; + par.pchan = 1; + + if (!sio_setpar(hdl, &par) || !sio_getpar(hdl, &par)) + { + fprintf(stderr, "error setting sndio parameters\n"); + hdl = NULL; + } + + if (par.bits != 16 || par.le != SIO_LE_NATIVE || par.sig != 1 || par.pchan != 1) + { + fprintf(stderr, "returned incorrect sndio parameters\n"); + hdl = NULL; + } + + samp_rate = par.rate; + + if (hdl && !sio_start(hdl)) + { + fprintf(stderr, "error starting sndio\n"); + hdl = NULL; + } + + return argc; +} + +void +audio_term() +{ + if (hdl) + { + sio_close(hdl); + hdl = NULL; + } +} + +void +audio_play(int n, short *data) +{ + if (n > 0 && hdl) + { + size_t size = n * sizeof(short); + if (sio_write(hdl, data, size) != size) + fprintf(stderr, "sio_write: short write"); + } +} diff --git a/audio/rsynth/pkg-plist b/audio/rsynth/pkg-plist index a6d8e33928ed..90761f0aaa8a 100644 --- a/audio/rsynth/pkg-plist +++ b/audio/rsynth/pkg-plist @@ -1,4 +1,4 @@ -bin/dlookup -bin/mkdictdb +%%DB%%bin/dlookup +%%DB%%bin/mkdictdb bin/say -bin/nasay +%%NAS%%bin/nasay |