xref: /netbsd/sys/arch/x68k/usr.bin/bellctrl/bellctrl.c (revision bf9ec67e)
1 /*	$NetBSD: bellctrl.c,v 1.3 2001/12/27 02:23:26 wiz Exp $	*/
2 
3 /*
4  * bellctrl - OPM bell controller (for NetBSD/X680x0)
5  * Copyright (c)1995 ussy.
6  */
7 
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <ctype.h>
11 #include <sys/file.h>
12 #include <sys/ioctl.h>
13 #include "../../include/opmbellio.h"
14 #include "../../dev/opmbellvar.h"
15 #include "../../dev/opmreg.h"
16 
17 #define DEFAULT -1
18 
19 #define nextarg(i, argv) \
20 	argv[i]; \
21 	if (i >= argc) \
22 		break; \
23 
24 int bell_setting;
25 char *progName;
26 struct opm_voice voice;
27 
28 static struct bell_info values = {
29     DEFAULT, DEFAULT, DEFAULT
30 };
31 
32 /* function prototype */
33 int is_number();
34 void set_bell_vol();
35 void set_bell_pitch();
36 void set_bell_dur();
37 void set_voice_param();
38 void set_bell_param();
39 int usage();
40 int error();
41 
42 int
43 main(argc, argv)
44 int argc;
45 char **argv;
46 {
47     register char *arg;
48     int percent;
49     int i;
50 
51     progName = argv[0];
52     bell_setting = 0;
53 
54     if (argc < 2) {
55 	usage(NULL, NULL);
56     }
57 
58     for (i = 1; i < argc; ) {
59 	arg = argv[i++];
60 	if (strcmp(arg, "-b") == 0) {
61 	    set_bell_vol(0);		/* turn off bell */
62 	} else if (strcmp(arg, "b") == 0) {
63 	    percent = DEFAULT;		/* set bell to default */
64 	    if (i >= argc) {
65 		set_bell_vol(percent);		/* set bell to default */
66 		set_bell_pitch(percent);	/* set pitch to default */
67 		set_bell_dur(percent);		/* set duration to default */
68 		break;
69 	    }
70 	    arg = nextarg(i, argv);
71 	    if (strcmp(arg, "on") == 0) {	/* let it stay that way */
72 		set_bell_vol(BELL_VOLUME);	/* set bell on */
73 		set_bell_pitch(BELL_PITCH);	/* set pitch to default */
74 		set_bell_dur(BELL_DURATION);	/* set duration to default */
75 		i++;
76 	    } else if (strcmp(arg, "off") == 0) {
77 		percent = 0;			/* turn the bell off */
78 		set_bell_vol(percent);
79 		i++;
80 	    } else if (is_number(arg, MAXBVOLUME)) {	/* If volume is given */
81 		percent = atoi(arg);		/* set bell appropriately */
82 		set_bell_vol(percent);
83 		i++;
84 
85 		arg = nextarg(i, argv);
86 		if (is_number(arg, MAXBPITCH)) {	/* if pitch is given */
87 		    set_bell_pitch(atoi(arg));		/* set the bell */
88 		    i++;
89 
90 		    arg = nextarg(i, argv);
91 		    if (is_number(arg, MAXBTIME)) {	/* If duration is given	*/
92 			set_bell_dur(atoi(arg));	/* set the bell */
93 			i++;
94 		    }
95 		}
96 	    } else {
97 		set_bell_vol(BELL_VOLUME);		/* set bell to default */
98 	    }
99 	} else if (strcmp(arg, "v") == 0) {	/* set voice parameter */
100 	    if (i >= argc) {
101 		arg = "default";
102 	    } else {
103 		arg = nextarg(i, argv);
104 	    }
105 	    set_voice_param(arg, 1);
106 	    i++;
107 	} else if (strcmp(arg, "-v") == 0) {	/* set voice parameter */
108 	    if (i >= argc) {
109 		usage("missing -v argument", NULL);
110 	    }
111 	    arg = nextarg(i, argv);
112 	    set_voice_param(arg, 0);
113 	    i++;
114 	} else {
115 	    usage("unknown option %s", arg);
116 	}
117     }
118 
119     if (bell_setting)
120 	set_bell_param();
121 
122     exit(0);
123 }
124 
125 int
126 is_number(arg, maximum)
127 char *arg;
128 int maximum;
129 {
130     register char *p;
131 
132     if (arg[0] == '-' && arg[1] == '1' && arg[2] == '\0')
133 	return 1;
134     for (p = arg; isdigit(*p); p++)
135 	;
136     if (*p || atoi(arg) > maximum)
137 	return 0;
138 
139     return 1;
140 }
141 
142 void
143 set_bell_vol(percent)
144 int percent;
145 {
146     values.volume = percent;
147     bell_setting++;
148 }
149 
150 void
151 set_bell_pitch(pitch)
152 int pitch;
153 {
154     values.pitch = pitch;
155     bell_setting++;
156 }
157 
158 void
159 set_bell_dur(duration)
160 int duration;
161 {
162     values.msec = duration;
163     bell_setting++;
164 }
165 
166 void
167 set_voice_param(path, flag)
168 char *path;
169 int flag;
170 {
171     int fd;
172 
173     if (flag) {
174 	memcpy(&voice, &bell_voice, sizeof(bell_voice));
175     } else {
176 	if ((fd = open(path, 0)) >= 0) {
177 	    if (read(fd, &voice, sizeof(voice)) != sizeof(voice)) {
178 		error("cannot read voice parameter.");
179 	    }
180 	    close(fd);
181 	} else {
182 	    error("cannot open voice parameter.");
183 	}
184     }
185 
186     if ((fd = open("/dev/bell", O_RDWR)) < 0) {
187 	error("cannot open /dev/bell");
188     }
189     if (ioctl(fd, BELLIOCSVOICE, &voice)) {
190 	error("ioctl BELLIOCSVOICE failed");
191     }
192     close(fd);
193 }
194 
195 void
196 set_bell_param(void)
197 {
198     int fd;
199     struct bell_info param;
200 
201     if ((fd = open("/dev/bell", O_RDWR)) < 0) {
202 	error("cannot open /dev/bell");
203     }
204     if (ioctl(fd, BELLIOCGPARAM, &param)) {
205 	error("ioctl BELLIOCGPARAM failed.");
206     }
207 
208     if (values.volume == DEFAULT) {
209 	values.volume = param.volume;
210     }
211     if (values.pitch == DEFAULT) {
212 	values.pitch = param.pitch;
213     }
214     if (values.msec == DEFAULT) {
215 	values.msec = param.msec;
216     }
217 
218     if (ioctl(fd, BELLIOCSPARAM, &values)) {
219 	error("ioctl BELLIOCSPARAM failed.");
220     }
221 
222     close(fd);
223 }
224 
225 int
226 usage(fmt, arg)
227 char *fmt;
228 char *arg;
229 {
230     if (fmt) {
231 	fprintf (stderr, "%s:  ", progName);
232 	fprintf (stderr, fmt, arg);
233 	fprintf (stderr, "\n\n");
234     }
235 
236     fprintf(stderr, "usage:  %s option ...\n", progName);
237     fprintf(stderr, "    To turn bell off:\n");
238     fprintf(stderr, "\t-b                b off               b 0\n");
239     fprintf(stderr, "    To set bell volume, pitch and duration:\n");
240     fprintf(stderr, "\t b [vol [pitch [dur]]]          b on\n");
241     fprintf(stderr, "    To restore default voice parameter:\n");
242     fprintf(stderr, "\t v default\n");
243     fprintf(stderr, "    To set voice parameter:\n");
244     fprintf(stderr, "\t-v voicefile\n");
245     exit(0);
246 }
247 
248 int
249 error(message)
250 char *message;
251 {
252     fprintf(stderr, "%s: %s\n", progName, message);
253     exit(1);
254 }
255 
256