misc/67995: Morse plays beeps 10 times faster than it should.
Jukka A. Ukkonen
Jukka.Ukkonen at mawit.com
Thu Jun 17 05:21:24 GMT 2004
The following reply was made to PR misc/67995; it has been noted by GNATS.
From: "Jukka A. Ukkonen" <Jukka.Ukkonen at mawit.com>
To: freebsd-gnats-submit at FreeBSD.org, jau at iki.fi
Cc:
Subject: Re: misc/67995: Morse plays beeps 10 times faster than it should.
Date: Thu, 17 Jun 2004 08:10:03 +0300
Aargh! - My second patch would make it OK for speaker output, but at the same
time it obviously would break the ttyout() function on system with higher HZ
than 100. So, I re-iterate once more.
This time I also added morse the ability show the dot-dash patterns at the
same time the speaker is playing the sound. This is beneficial if/when one
wishes to use morse for learning morse code.
// jau
--- morse.c.orig Wed Jun 16 07:26:18 2004
+++ morse.c Thu Jun 17 07:53:30 2004
@@ -67,6 +67,33 @@
#include <machine/speaker.h>
#endif
+struct clockrate {
+ unsigned hz;
+ unsigned tick;
+ unsigned tickadj;
+ unsigned stathz;
+ unsigned profhz;
+};
+
+_HZ ()
+{
+ struct clockrate rates;
+ size_t bufsize = sizeof (rates);
+ int ret;
+
+ ret = sysctlbyname ("kern.clockrate",
+ (void *) &rates, &bufsize, NULL, 0);
+
+ if (ret < 0)
+ return (100); /* Wild guess. */
+
+ return (rates.hz);
+}
+
+static unsigned _hz;
+
+#define HZ (! _hz ? (_hz = _HZ ()) : _hz)
+
struct morsetab {
char inchar;
char *morse;
@@ -326,14 +353,17 @@
fputs(USAGE, stderr);
exit(1);
}
- if ((pflag || device) && sflag) {
- fputs("morse: only one of -p, -d and -s allowed\n", stderr);
+
+ if ((pflag || sflag) && device) {
+ fputs("morse: -d cannot be used with -p or -s\n", stderr);
exit(1);
}
+
if ((pflag || device) && ((wpm < 1) || (wpm > 60))) {
fputs("morse: insane speed\n", stderr);
exit(1);
}
+
if ((pflag || device) && (freq == 0))
freq = FREQUENCY;
@@ -369,12 +399,19 @@
(void)signal(SIGQUIT, sighandler);
(void)signal(SIGTERM, sighandler);
}
- if (pflag || device) {
+ if (pflag) {
dot_clock = wpm / 2.4; /* dots/sec */
dot_clock = 1 / dot_clock; /* duration of a dot */
dot_clock = dot_clock / 2; /* dot_clock runs at twice */
/* the dot rate */
- dot_clock = dot_clock * 100; /* scale for ioctl */
+ dot_clock = dot_clock * HZ; /* scale for ioctl() */
+ }
+ else if (device) {
+ dot_clock = wpm / 2.4; /* dots/sec */
+ dot_clock = 1 / dot_clock; /* duration of a dot */
+ dot_clock = dot_clock / 2; /* dot_clock runs at twice */
+ /* the dot rate */
+ dot_clock = dot_clock * 100; /* scale for usleep() */
}
argc -= optind;
@@ -466,7 +503,13 @@
#ifdef SPEAKER
const char *c;
+ if (sflag)
+ printf(" %c", *s);
+
for (c = s; *c != '\0'; c++) {
+ if (sflag)
+ printf(" %c", *c);
+
switch (*c) {
case '.':
sound.frequency = freq;
@@ -483,6 +526,7 @@
default:
sound.duration = 0;
}
+
if (sound.duration) {
if (ioctl(spkr, SPKRTONE, &sound) == -1) {
perror("ioctl play");
More information about the freebsd-bugs
mailing list