diff options
Diffstat (limited to 'share/examples/isdn/contrib/hplay.c')
-rw-r--r-- | share/examples/isdn/contrib/hplay.c | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/share/examples/isdn/contrib/hplay.c b/share/examples/isdn/contrib/hplay.c new file mode 100644 index 0000000..10660ac --- /dev/null +++ b/share/examples/isdn/contrib/hplay.c @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------* + * + * rsynth driver to output to + * - an open isdn4bsd telephone connection or + * - an output file or + * - the /dev/audio device + * ---------------------------------------------------------------- + * + * tested with rsynth-2.0 + * + * written by Hellmuth Michaelis (hm@kts.org) + * + * last edit-date: [Fri May 25 15:21:33 2001] + * + * $FreeBSD$ + * + *---------------------------------------------------------------------------*/ + +#include <config.h> +#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/i4b_tel_ioctl.h> + +#include "proto.h" +#include "getargs.h" +#include "hplay.h" +#include "l2u.h" + +#define SAMP_RATE 8000 +long samp_rate = SAMP_RATE; + +char *prog = "hplay"; + +static int use_audio = 1; +static int use_isdn = 0; +static int unit_no = 0; + +static int audio_fd = -1; +static int isdn_fd = -1; +static int file_fd = -1; + +char *audio_dev = "/dev/dsp"; +char *isdn_dev = "/dev/i4btel"; +static char *ulaw_file = NULL; + +int +audio_init(int argc, char *argv[]) +{ + char dev[64]; + int format = CVT_ALAW2ULAW; + + prog = argv[0]; + + argc = getargs("FreeBSD audio/i4b/file output driver",argc, argv, + "a", NULL, &use_audio, "use /dev/audio (default)", + "i", NULL, &use_isdn, "use /dev/i4btel", + "u", "%d", &unit_no, "/dev/i4btel unit number (def = 0)", + "f", "", &ulaw_file, "u-law output to file", + NULL); + + if(help_only) + return argc; + + if(ulaw_file) + { + if(strcmp(ulaw_file, "-") == 0) + { + file_fd = 1; /* stdout */ + } + else + { + file_fd = open(ulaw_file, O_WRONLY | O_CREAT | O_TRUNC, 0666); + if(file_fd < 0) + fprintf(stderr, "ERROR: cannot open %s, error = %s\n", ulaw_file, strerror(errno)); + } + } + + if(use_isdn) + { + sprintf(dev, "%s%d", isdn_dev, unit_no); + + if((isdn_fd = open(dev, O_WRONLY)) < 0) + { + fprintf(stderr, "ERROR: cannot open %s, error = %s\n", dev, strerror(errno)); + } + + if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0) + { + fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno)); + } + } + + if(use_audio) + { + audio_fd = open(audio_dev, O_WRONLY | O_NDELAY); + if(audio_fd < 0) + { + fprintf(stderr, "ERROR: cannot open %s, error = %s\n", audio_dev, strerror(errno)); + } + } + + return argc; +} + +void +audio_term() +{ + int format = CVT_NONE; + + if(isdn_fd >= 0) + { + if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0) + { + fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno)); + } + close(isdn_fd); + isdn_fd = -1; + } + + if(audio_fd >= 0) + { +#if 0 + ioctl(audio_fd, SNDCTL_DSP_SYNC, &dummy); +#endif + close(audio_fd); + audio_fd = -1; + } + + if(file_fd >= 0) + { + close(file_fd); + file_fd = -1; + } +} + +void +audio_play(int n, short *data) +{ + int ret; + unsigned char *p; + + 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] = short2ulaw(data[i]); + } + + if (isdn_fd >= 0) + { + p = converted; + errno = 0; + + while((ret = write(isdn_fd, p, n)) != n) + { + if(!errno) + { + p += ret; + if(p > (converted + n)) + break; + } + else + { + fprintf(stderr, "write /dev/i4btel ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno)); + break; + } + } + } + + for (i = 0; i < n; i++) + converted[i] = (data[i] - 32768) / 256; + + if(audio_fd >= 0) + { + p = converted; + + errno = 0; + + while((ret = write(audio_fd, p, n)) != n) + { + if(!errno) + { + p += ret; + if(p > (converted + n)) + break; + } + else + { + fprintf(stderr, "write /dev/dsp ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno)); + break; + } + } + } + + if(file_fd >= 0) + { + int ret; + p = converted; + + errno = 0; + + while((ret = write(file_fd, p, n)) != n) + { + if(!errno) + { + p += ret; + if(p > (converted + n)) + break; + } + else + { + fprintf(stderr, "write file ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno)); + break; + } + } + } + + free(converted); + } +} + +/* EOF */ |