1 /*---------------------------------------------------------------------------*
3 * rsynth driver to output to
4 * - an open isdn4bsd telephone connection or
6 * - the /dev/audio device
7 * ----------------------------------------------------------------
9 * tested with rsynth-2.0
11 * written by Hellmuth Michaelis (hm@kts.org)
13 * last edit-date: [Fri May 25 15:21:33 2001]
15 * $FreeBSD: src/share/examples/isdn/contrib/hplay.c,v 1.1.2.1 2001/08/10 14:59:47 obrien Exp $
16 * $DragonFly: src/share/examples/isdn/contrib/hplay.c,v 1.2 2003/06/17 04:36:57 dillon Exp $
18 *---------------------------------------------------------------------------*/
21 #include <useconfig.h>
29 #include <sys/param.h>
30 #include <sys/signal.h>
31 #include <sys/ioctl.h>
33 #include <machine/i4b_tel_ioctl.h>
40 #define SAMP_RATE 8000
41 long samp_rate = SAMP_RATE;
45 static int use_audio = 1;
46 static int use_isdn = 0;
47 static int unit_no = 0;
49 static int audio_fd = -1;
50 static int isdn_fd = -1;
51 static int file_fd = -1;
53 char *audio_dev = "/dev/dsp";
54 char *isdn_dev = "/dev/i4btel";
55 static char *ulaw_file = NULL;
58 audio_init(int argc, char *argv[])
61 int format = CVT_ALAW2ULAW;
65 argc = getargs("FreeBSD audio/i4b/file output driver",argc, argv,
66 "a", NULL, &use_audio, "use /dev/audio (default)",
67 "i", NULL, &use_isdn, "use /dev/i4btel",
68 "u", "%d", &unit_no, "/dev/i4btel unit number (def = 0)",
69 "f", "", &ulaw_file, "u-law output to file",
77 if(strcmp(ulaw_file, "-") == 0)
79 file_fd = 1; /* stdout */
83 file_fd = open(ulaw_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
85 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", ulaw_file, strerror(errno));
91 sprintf(dev, "%s%d", isdn_dev, unit_no);
93 if((isdn_fd = open(dev, O_WRONLY)) < 0)
95 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", dev, strerror(errno));
98 if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0)
100 fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno));
106 audio_fd = open(audio_dev, O_WRONLY | O_NDELAY);
109 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", audio_dev, strerror(errno));
119 int format = CVT_NONE;
123 if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0)
125 fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno));
134 ioctl(audio_fd, SNDCTL_DSP_SYNC, &dummy);
148 audio_play(int n, short *data)
155 unsigned char *converted = (unsigned char *) malloc(n);
158 if(converted == NULL)
160 fprintf(stderr, "Could not allocate memory for conversion\n");
164 for (i = 0; i < n; i++)
166 converted[i] = short2ulaw(data[i]);
174 while((ret = write(isdn_fd, p, n)) != n)
179 if(p > (converted + n))
184 fprintf(stderr, "write /dev/i4btel ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));
190 for (i = 0; i < n; i++)
191 converted[i] = (data[i] - 32768) / 256;
199 while((ret = write(audio_fd, p, n)) != n)
204 if(p > (converted + n))
209 fprintf(stderr, "write /dev/dsp ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));
222 while((ret = write(file_fd, p, n)) != n)
227 if(p > (converted + n))
232 fprintf(stderr, "write file ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));