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]
17 *---------------------------------------------------------------------------*/
20 #include <useconfig.h>
28 #include <sys/param.h>
29 #include <sys/signal.h>
30 #include <sys/ioctl.h>
32 #include <i4b/i4b_tel_ioctl.h>
39 #define SAMP_RATE 8000
40 long samp_rate = SAMP_RATE;
44 static int use_audio = 1;
45 static int use_isdn = 0;
46 static int unit_no = 0;
48 static int audio_fd = -1;
49 static int isdn_fd = -1;
50 static int file_fd = -1;
52 char *audio_dev = "/dev/dsp";
53 char *isdn_dev = "/dev/i4btel";
54 static char *ulaw_file = NULL;
57 audio_init(int argc, char *argv[])
60 int format = CVT_ALAW2ULAW;
64 argc = getargs("FreeBSD audio/i4b/file output driver",argc, argv,
65 "a", NULL, &use_audio, "use /dev/audio (default)",
66 "i", NULL, &use_isdn, "use /dev/i4btel",
67 "u", "%d", &unit_no, "/dev/i4btel unit number (def = 0)",
68 "f", "", &ulaw_file, "u-law output to file",
76 if(strcmp(ulaw_file, "-") == 0)
78 file_fd = 1; /* stdout */
82 file_fd = open(ulaw_file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
84 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", ulaw_file, strerror(errno));
90 sprintf(dev, "%s%d", isdn_dev, unit_no);
92 if((isdn_fd = open(dev, O_WRONLY)) < 0)
94 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", dev, strerror(errno));
97 if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0)
99 fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno));
105 audio_fd = open(audio_dev, O_WRONLY | O_NDELAY);
108 fprintf(stderr, "ERROR: cannot open %s, error = %s\n", audio_dev, strerror(errno));
118 int format = CVT_NONE;
122 if((ioctl(isdn_fd, I4B_TEL_SETAUDIOFMT, &format)) < 0)
124 fprintf(stderr, "ioctl I4B_TEL_SETAUDIOFMT failed: %s", strerror(errno));
133 ioctl(audio_fd, SNDCTL_DSP_SYNC, &dummy);
147 audio_play(int n, short *data)
154 unsigned char *converted = (unsigned char *) malloc(n);
157 if(converted == NULL)
159 fprintf(stderr, "Could not allocate memory for conversion\n");
163 for (i = 0; i < n; i++)
165 converted[i] = short2ulaw(data[i]);
173 while((ret = write(isdn_fd, p, n)) != n)
178 if(p > (converted + n))
183 fprintf(stderr, "write /dev/i4btel ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));
189 for (i = 0; i < n; i++)
190 converted[i] = (data[i] - 32768) / 256;
198 while((ret = write(audio_fd, p, n)) != n)
203 if(p > (converted + n))
208 fprintf(stderr, "write /dev/dsp ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));
221 while((ret = write(file_fd, p, n)) != n)
226 if(p > (converted + n))
231 fprintf(stderr, "write file ERROR: ret (%d) != n (%d), error = %s\n", ret, n, strerror(errno));