diff options
author | Bernhard Reutner-Fischer | 2009-08-21 13:18:31 +0200 |
---|---|---|
committer | Bernhard Reutner-Fischer | 2009-08-21 13:18:31 +0200 |
commit | 45de0746b33b3716101caa5fa08ee601221dce39 (patch) | |
tree | d073e0980d8ee319c7c48999fa5e3278aed3b1b3 /miscutils/beep.c | |
parent | e10db56aa3e069388e84f7166e05032ba5b89295 (diff) | |
download | busybox-45de0746b33b3716101caa5fa08ee601221dce39.zip busybox-45de0746b33b3716101caa5fa08ee601221dce39.tar.gz |
add simple beep applet
Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop@gmail.com>
Diffstat (limited to 'miscutils/beep.c')
-rw-r--r-- | miscutils/beep.c | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/miscutils/beep.c b/miscutils/beep.c new file mode 100644 index 0000000..d5c3531 --- /dev/null +++ b/miscutils/beep.c @@ -0,0 +1,119 @@ +/* vi: set sw=4 ts=4: */ +/* + * beep implementation for busybox + * + * Copyright (C) 2009 Bernhard Reutner-Fischer + * + * Licensed under the GPL v2 or later, see the file LICENSE in this tarball. + * + */ +#include "libbb.h" + +#include <linux/kd.h> +#ifndef CLOCK_TICK_RATE +#define CLOCK_TICK_RATE 1193180 +#endif + +#define OPT_f (1<<0) +#define OPT_l (1<<1) +#define OPT_d (1<<2) +#define OPT_r (1<<3) +/* defaults */ +#define FREQ (4440) +#define LENGTH (50) +#define DELAY (0) +#define REPETITIONS (1) + +#define GET_ARG do { if (!*++opt) opt = *++argv; if (opt == NULL) bb_show_usage();} while (0) +#define NEW_BEEP() { \ + freq = FREQ; \ + length = LENGTH; \ + delay = DELAY; \ + rep = REPETITIONS; \ + } + +int beep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int beep_main(int argc UNUSED_PARAM, char **argv) +{ + int speaker = get_console_fd_or_die(); + unsigned freq, length, delay, rep; + unsigned long ioctl_arg; + char *opt = NULL; + bool do_parse = true; + + NEW_BEEP() + while (*argv && *++argv) { + opt = *argv; + + while (*opt == '-') + ++opt; + if (do_parse) + switch (*opt) { + case 'f': + GET_ARG; + freq = xatoul(opt); + continue; + case 'l': + GET_ARG; + length = xatoul(opt); + continue; + case 'd': + GET_ARG; + delay = xatoul(opt); + continue; + case 'r': + GET_ARG; + rep = xatoul(opt); + continue; + case 'n': + break; + default: + bb_show_usage(); + break; + } + again: + while (rep) { +//bb_info_msg("rep[%d] freq=%d, length=%d, delay=%d", rep, freq, length, delay); + ioctl_arg = (int)(CLOCK_TICK_RATE/freq); + xioctl(speaker, KIOCSOUND, (void*)ioctl_arg); + usleep(1000 * length); + ioctl(speaker, KIOCSOUND, 0); + if (rep--) + usleep(delay); + } + if (opt && *opt == 'n') + NEW_BEEP() + if (!do_parse && *argv == NULL) + goto out; + } + do_parse = false; + goto again; + out: + if (ENABLE_FEATURE_CLEAN_UP) + close(speaker); + return EXIT_SUCCESS; +} +/* + * so, e.g. Beethoven's 9th symphony "Ode an die Freude" would be + * something like: +a=$((220*3)) +b=$((247*3)) +c=$((262*3)) +d=$((294*3)) +e=$((329*3)) +f=$((349*3)) +g=$((392*3)) +#./beep -f$d -l200 -r2 -n -f$e -l100 -d 10 -n -f$c -l400 -f$g -l200 +./beep -f$e -l200 -r2 \ + -n -d 100 -f$f -l200 \ + -n -f$g -l200 -r2 \ + -n -f$f -l200 \ + -n -f$e -l200 \ + -n -f$d -l200 \ + -n -f$c -l200 -r2 \ + -n -f$d -l200 \ + -n -f$e -l200 \ + -n -f$e -l400 \ + -n -f$d -l100 \ + -n -f$d -l200 \ +*/ |