256 lines
5.1 KiB
C
256 lines
5.1 KiB
C
/* $NetBSD: bellctrl.c,v 1.2 1996/08/30 17:46:06 thorpej Exp $ */
|
|
|
|
/*
|
|
* bellctrl - OPM bell controller (for NetBSD/X680x0)
|
|
* Copyright (c)1995 ussy.
|
|
*/
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <ctype.h>
|
|
#include <sys/file.h>
|
|
#include <sys/ioctl.h>
|
|
#include "../../include/opmbellio.h"
|
|
#include "../../dev/opmbellvar.h"
|
|
#include "../../dev/opmreg.h"
|
|
|
|
#define DEFAULT -1
|
|
|
|
#define nextarg(i, argv) \
|
|
argv[i]; \
|
|
if (i >= argc) \
|
|
break; \
|
|
|
|
int bell_setting;
|
|
char *progName;
|
|
struct opm_voice voice;
|
|
|
|
static struct bell_info values = {
|
|
DEFAULT, DEFAULT, DEFAULT
|
|
};
|
|
|
|
/* function prototype */
|
|
int is_number();
|
|
void set_bell_vol();
|
|
void set_bell_pitch();
|
|
void set_bell_dur();
|
|
void set_voice_param();
|
|
void set_bell_param();
|
|
int usage();
|
|
int error();
|
|
|
|
int
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
register char *arg;
|
|
int percent;
|
|
int i;
|
|
|
|
progName = argv[0];
|
|
bell_setting = 0;
|
|
|
|
if (argc < 2) {
|
|
usage(NULL, NULL);
|
|
}
|
|
|
|
for (i = 1; i < argc; ) {
|
|
arg = argv[i++];
|
|
if (strcmp(arg, "-b") == 0) {
|
|
set_bell_vol(0); /* turn off bell */
|
|
} else if (strcmp(arg, "b") == 0) {
|
|
percent = DEFAULT; /* set bell to default */
|
|
if (i >= argc) {
|
|
set_bell_vol(percent); /* set bell to default */
|
|
set_bell_pitch(percent); /* set pitch to default */
|
|
set_bell_dur(percent); /* set duration to default */
|
|
break;
|
|
}
|
|
arg = nextarg(i, argv);
|
|
if (strcmp(arg, "on") == 0) { /* let it stay that way */
|
|
set_bell_vol(BELL_VOLUME); /* set bell on */
|
|
set_bell_pitch(BELL_PITCH); /* set pitch to default */
|
|
set_bell_dur(BELL_DURATION); /* set duration to default */
|
|
i++;
|
|
} else if (strcmp(arg, "off") == 0) {
|
|
percent = 0; /* turn the bell off */
|
|
set_bell_vol(percent);
|
|
i++;
|
|
} else if (is_number(arg, MAXBVOLUME)) { /* If volume is given */
|
|
percent = atoi(arg); /* set bell appropriately */
|
|
set_bell_vol(percent);
|
|
i++;
|
|
|
|
arg = nextarg(i, argv);
|
|
if (is_number(arg, MAXBPITCH)) { /* if pitch is given */
|
|
set_bell_pitch(atoi(arg)); /* set the bell */
|
|
i++;
|
|
|
|
arg = nextarg(i, argv);
|
|
if (is_number(arg, MAXBTIME)) { /* If duration is given */
|
|
set_bell_dur(atoi(arg)); /* set the bell */
|
|
i++;
|
|
}
|
|
}
|
|
} else {
|
|
set_bell_vol(BELL_VOLUME); /* set bell to default */
|
|
}
|
|
} else if (strcmp(arg, "v") == 0) { /* set voice parameter */
|
|
if (i >= argc) {
|
|
arg = "default";
|
|
} else {
|
|
arg = nextarg(i, argv);
|
|
}
|
|
set_voice_param(arg, 1);
|
|
i++;
|
|
} else if (strcmp(arg, "-v") == 0) { /* set voice parameter */
|
|
if (i >= argc) {
|
|
usage("missing -v argument", NULL);
|
|
}
|
|
arg = nextarg(i, argv);
|
|
set_voice_param(arg, 0);
|
|
i++;
|
|
} else {
|
|
usage("unknown option %s", arg);
|
|
}
|
|
}
|
|
|
|
if (bell_setting)
|
|
set_bell_param();
|
|
|
|
exit(0);
|
|
}
|
|
|
|
int
|
|
is_number(arg, maximum)
|
|
char *arg;
|
|
int maximum;
|
|
{
|
|
register char *p;
|
|
|
|
if (arg[0] == '-' && arg[1] == '1' && arg[2] == '\0')
|
|
return 1;
|
|
for (p = arg; isdigit(*p); p++)
|
|
;
|
|
if (*p || atoi(arg) > maximum)
|
|
return 0;
|
|
|
|
return 1;
|
|
}
|
|
|
|
void
|
|
set_bell_vol(percent)
|
|
int percent;
|
|
{
|
|
values.volume = percent;
|
|
bell_setting++;
|
|
}
|
|
|
|
void
|
|
set_bell_pitch(pitch)
|
|
int pitch;
|
|
{
|
|
values.pitch = pitch;
|
|
bell_setting++;
|
|
}
|
|
|
|
void
|
|
set_bell_dur(duration)
|
|
int duration;
|
|
{
|
|
values.msec = duration;
|
|
bell_setting++;
|
|
}
|
|
|
|
void
|
|
set_voice_param(path, flag)
|
|
char *path;
|
|
int flag;
|
|
{
|
|
int fd;
|
|
|
|
if (flag) {
|
|
bcopy(&bell_voice, &voice, sizeof(bell_voice));
|
|
} else {
|
|
if ((fd = open(path, 0)) >= 0) {
|
|
if (read(fd, &voice, sizeof(voice)) != sizeof(voice)) {
|
|
error("cannot read voice parameter.");
|
|
}
|
|
close(fd);
|
|
} else {
|
|
error("cannot open voice parameter.");
|
|
}
|
|
}
|
|
|
|
if ((fd = open("/dev/bell", O_RDWR)) < 0) {
|
|
error("cannot open /dev/bell");
|
|
}
|
|
if (ioctl(fd, BELLIOCSVOICE, &voice)) {
|
|
error("ioctl BELLIOCSVOICE failed");
|
|
}
|
|
close(fd);
|
|
}
|
|
|
|
void
|
|
set_bell_param(void)
|
|
{
|
|
int fd;
|
|
struct bell_info param;
|
|
|
|
if ((fd = open("/dev/bell", O_RDWR)) < 0) {
|
|
error("cannot open /dev/bell");
|
|
}
|
|
if (ioctl(fd, BELLIOCGPARAM, ¶m)) {
|
|
error("ioctl BELLIOCGPARAM failed.");
|
|
}
|
|
|
|
if (values.volume == DEFAULT) {
|
|
values.volume = param.volume;
|
|
}
|
|
if (values.pitch == DEFAULT) {
|
|
values.pitch = param.pitch;
|
|
}
|
|
if (values.msec == DEFAULT) {
|
|
values.msec = param.msec;
|
|
}
|
|
|
|
if (ioctl(fd, BELLIOCSPARAM, &values)) {
|
|
error("ioctl BELLIOCSPARAM failed.");
|
|
}
|
|
|
|
close(fd);
|
|
}
|
|
|
|
int
|
|
usage(fmt, arg)
|
|
char *fmt;
|
|
char *arg;
|
|
{
|
|
if (fmt) {
|
|
fprintf (stderr, "%s: ", progName);
|
|
fprintf (stderr, fmt, arg);
|
|
fprintf (stderr, "\n\n");
|
|
}
|
|
|
|
fprintf(stderr, "usage: %s option ...\n", progName);
|
|
fprintf(stderr, " To turn bell off:\n");
|
|
fprintf(stderr, "\t-b b off b 0\n");
|
|
fprintf(stderr, " To set bell volume, pitch and duration:\n");
|
|
fprintf(stderr, "\t b [vol [pitch [dur]]] b on\n");
|
|
fprintf(stderr, " To restore default voice parameter:\n");
|
|
fprintf(stderr, "\t v default\n");
|
|
fprintf(stderr, " To set voice parameter:\n");
|
|
fprintf(stderr, "\t-v voicefile\n");
|
|
exit(0);
|
|
}
|
|
|
|
int
|
|
error(message)
|
|
char *message;
|
|
{
|
|
fprintf(stderr, "%s: %s\n", progName, message);
|
|
exit(1);
|
|
}
|
|
|