busybox/miscutils/beep.c
<<
>>
Prefs
   1/* vi: set sw=4 ts=4: */
   2/*
   3 * beep implementation for busybox
   4 *
   5 * Copyright (C) 2009 Bernhard Reutner-Fischer
   6 *
   7 * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
   8 *
   9 */
  10#include "libbb.h"
  11
  12#include <linux/kd.h>
  13#ifndef CLOCK_TICK_RATE
  14# define CLOCK_TICK_RATE 1193180
  15#endif
  16
  17/* defaults */
  18#ifndef CONFIG_FEATURE_BEEP_FREQ
  19# define FREQ (4000)
  20#else
  21# define FREQ (CONFIG_FEATURE_BEEP_FREQ)
  22#endif
  23#ifndef CONFIG_FEATURE_BEEP_LENGTH_MS
  24# define LENGTH (30)
  25#else
  26# define LENGTH (CONFIG_FEATURE_BEEP_LENGTH_MS)
  27#endif
  28#define DELAY (0)
  29#define REPETITIONS (1)
  30
  31int beep_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  32int beep_main(int argc, char **argv)
  33{
  34        int speaker = get_console_fd_or_die();
  35        unsigned tickrate_div_freq = tickrate_div_freq; /* for compiler */
  36        unsigned length = length;
  37        unsigned delay = delay;
  38        unsigned rep = rep;
  39        int c;
  40
  41        c = 'n';
  42        while (c != -1) {
  43                if (c == 'n') {
  44                        tickrate_div_freq = CLOCK_TICK_RATE / FREQ;
  45                        length = LENGTH;
  46                        delay = DELAY;
  47                        rep = REPETITIONS;
  48                }
  49                c = getopt(argc, argv, "f:l:d:r:n");
  50/* TODO: -s, -c:
  51 * pipe stdin to stdout, but also beep after each line (-s) or char (-c)
  52 */
  53                switch (c) {
  54                case 'f':
  55/* TODO: what "-f 0" should do? */
  56                        tickrate_div_freq = (unsigned)CLOCK_TICK_RATE / xatou(optarg);
  57                        continue;
  58                case 'l':
  59                        length = xatou(optarg);
  60                        continue;
  61                case 'd':
  62/* TODO:
  63 * -d N, -D N
  64 * specify a delay of N milliseconds between repetitions.
  65 * -d specifies that this delay should only occur between beeps,
  66 * that is, it should not occur after the last repetition.
  67 * -D indicates that the delay should occur after every repetition
  68 */
  69                        delay = xatou(optarg);
  70                        continue;
  71                case 'r':
  72                        rep = xatou(optarg);
  73                        continue;
  74                case 'n':
  75                case -1:
  76                        break;
  77                default:
  78                        bb_show_usage();
  79                }
  80                while (rep) {
  81//bb_info_msg("rep[%d] freq=%d, length=%d, delay=%d", rep, freq, length, delay);
  82                        xioctl(speaker, KIOCSOUND, (void*)(uintptr_t)tickrate_div_freq);
  83                        usleep(1000 * length);
  84                        ioctl(speaker, KIOCSOUND, (void*)0);
  85                        if (--rep)
  86                                usleep(1000 * delay);
  87                }
  88        }
  89
  90        if (ENABLE_FEATURE_CLEAN_UP)
  91                close(speaker);
  92        return EXIT_SUCCESS;
  93}
  94/*
  95 * so, e.g. Beethoven's 9th symphony "Ode an die Freude" would be
  96 * something like:
  97a=$((220*3))
  98b=$((247*3))
  99c=$((262*3))
 100d=$((294*3))
 101e=$((329*3))
 102f=$((349*3))
 103g=$((392*3))
 104#./beep -f$d -l200 -r2 -n -f$e -l100 -d 10 -n -f$c -l400 -f$g -l200
 105./beep -f$e -l200 -r2 \
 106        -n -d 100 -f$f -l200 \
 107        -n -f$g -l200 -r2 \
 108        -n -f$f -l200 \
 109        -n -f$e -l200 \
 110        -n -f$d -l200 \
 111        -n -f$c -l200 -r2 \
 112        -n -f$d -l200 \
 113        -n -f$e -l200 \
 114        -n -f$e -l400 \
 115        -n -f$d -l100 \
 116        -n -f$d -l200 \
 117*/
 118