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