From: Denys Vlasenko Date: Sat, 22 Aug 2009 16:00:39 +0000 (+0200) Subject: beep: optimize X-Git-Tag: 1_15_0~2 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=0da1c0a73298087def5f42be61913b79fd2d9193;p=oweals%2Fbusybox.git beep: optimize function old new delta beep_main 394 276 -118 Signed-off-by: Denys Vlasenko --- diff --git a/TODO_config_nommu b/TODO_config_nommu index 43d5420a8..1835b6e80 100644 --- a/TODO_config_nommu +++ b/TODO_config_nommu @@ -567,6 +567,9 @@ CONFIG_FEATURE_MOUNT_LOOP=y # CONFIG_ADJTIMEX=y CONFIG_BBCONFIG=y +CONFIG_BEEP=y +CONFIG_FEATURE_BEEP_FREQ=4000 +CONFIG_FEATURE_BEEP_LENGTH_MS=30 CONFIG_CHAT=y CONFIG_FEATURE_CHAT_NOFAIL=y CONFIG_FEATURE_CHAT_TTY_HIFI=y diff --git a/miscutils/Config.in b/miscutils/Config.in index 4e19bd8c4..9a81ecc6b 100644 --- a/miscutils/Config.in +++ b/miscutils/Config.in @@ -33,7 +33,7 @@ config FEATURE_BEEP_FREQ help Frequency for default beep. -config FEATURE_BEEP_LENGTH +config FEATURE_BEEP_LENGTH_MS int "default length" range 0 2147483647 default 30 diff --git a/miscutils/beep.c b/miscutils/beep.c index 79e75473c..f3266dc2d 100644 --- a/miscutils/beep.c +++ b/miscutils/beep.c @@ -11,92 +11,80 @@ #include #ifndef CLOCK_TICK_RATE -#define CLOCK_TICK_RATE 1193180 +# 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 */ #ifndef CONFIG_FEATURE_BEEP_FREQ # define FREQ (4000) #else # define FREQ (CONFIG_FEATURE_BEEP_FREQ) #endif -#ifndef CONFIG_FEATURE_BEEP_LENGTH +#ifndef CONFIG_FEATURE_BEEP_LENGTH_MS # define LENGTH (30) #else -# define LENGTH (CONFIG_FEATURE_BEEP_LENGTH) +# define LENGTH (CONFIG_FEATURE_BEEP_LENGTH_MS) #endif #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 beep_main(int argc, 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; + unsigned length, delay, rep; + unsigned tickrate_div_freq; + int c; - 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: + c = 'n'; + while (c != -1) { + if (c == 'n') { + tickrate_div_freq = CLOCK_TICK_RATE / FREQ; + length = LENGTH; + delay = DELAY; + rep = REPETITIONS; + } + c = getopt(argc, argv, "f:l:d:r:n"); +/* TODO: -s, -c: + * pipe stdin to stdout, but also beep after each line (-s) or char (-c) + */ + switch (c) { + case 'f': +/* TODO: what "-f 0" should do? */ + tickrate_div_freq = (unsigned)CLOCK_TICK_RATE / xatou(optarg); + continue; + case 'l': + length = xatou(optarg); + continue; + case 'd': +/* TODO: + * -d N, -D N + * specify a delay of N milliseconds between repetitions. + * -d specifies that this delay should only occur between beeps, + * that is, it should not occur after the last repetition. + * -D indicates that the delay should occur after every repetition + */ + delay = xatou(optarg); + continue; + case 'r': + rep = xatou(optarg); + continue; + case 'n': + case -1: + break; + default: + bb_show_usage(); + } 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); + xioctl(speaker, KIOCSOUND, (void*)(long)tickrate_div_freq); usleep(1000 * length); - ioctl(speaker, KIOCSOUND, 0); - if (rep--) + ioctl(speaker, KIOCSOUND, (void*)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; @@ -117,11 +105,11 @@ g=$((392*3)) -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 -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 \ */ diff --git a/scripts/defconfig b/scripts/defconfig index 394839bc9..797f275d1 100644 --- a/scripts/defconfig +++ b/scripts/defconfig @@ -569,7 +569,7 @@ CONFIG_ADJTIMEX=y # CONFIG_BBCONFIG is not set CONFIG_BEEP=y CONFIG_FEATURE_BEEP_FREQ=4000 -CONFIG_FEATURE_BEEP_LENGTH=30 +CONFIG_FEATURE_BEEP_LENGTH_MS=30 CONFIG_CHAT=y CONFIG_FEATURE_CHAT_NOFAIL=y # CONFIG_FEATURE_CHAT_TTY_HIFI is not set