beep: optimize
authorDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Aug 2009 16:00:39 +0000 (18:00 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Sat, 22 Aug 2009 16:00:39 +0000 (18:00 +0200)
function                                             old     new   delta
beep_main                                            394     276    -118

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
TODO_config_nommu
miscutils/Config.in
miscutils/beep.c
scripts/defconfig

index 43d5420a886b4155a04bd72241c3762f61cd8586..1835b6e80b6cc1ee74f2e18942c5c13748ac545e 100644 (file)
@@ -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
index 4e19bd8c4124709467bdccf479967ab8a5560b37..9a81ecc6b62b1d4c2d4d002e40c06117c47f3e85 100644 (file)
@@ -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
index 79e75473c86ae617a882e05605a9d7845caac30c..f3266dc2df15b935329a6d26a695a2626d087f24 100644 (file)
 
 #include <linux/kd.h>
 #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 \
 */
index 394839bc915482e9a1c3231153bebcfa0c575699..797f275d1929736a90cb208d0924ad852c1163fb 100644 (file)
@@ -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