aycock@cs-sun-fsa.cpsc.ucalgary.ca (John Aycock) (01/04/91)
While trying to compile a large program that was prone to errors, I thought
it would be nice for it to beep if it stopped. So I wrote this program to
do just that. Unfortunately, it causes intermittent machine crashes, so I'm
obviously doing something wrong. I suspect it has to do with something not
initialized properly, or me not waiting/responding correctly. It seems to
be a delayed reaction, though... it doesn't usually crash right away, but
later, when I start up the editor, say. Thanks in advance for any help.
BTW, is there a good book that would desribe ports and messages (as opposed
to flipping through 7 sections in two ungainly RKMs)???
:ja
/*
* Quick hack to beep the speaker... beep [<n> [<delay]]
* The waveform && period are from the Hardware Manual, page 143.
* John Aycock, 1991
*/
#include <stdio.h>
#include <string.h>
#include <libraries/dos.h>
char *progname;
#include <exec/exec.h>
#include <devices/audio.h>
#define PRI_EMERG 100
#define WAVELEN 8
typedef unsigned char bool;
typedef unsigned char byte;
int beep ()
{
int i, error = 0;
bool audioopen = FALSE;
byte *wave = NULL;
struct MsgPort *port = NULL;
struct IOAudio *IOB = NULL;
static byte ch_alloc[] = { 1, 2, 4, 8 };
static byte sinewave[] = { 0, 90, 127, 90, 0, -90, -127, -90 };
if (!(port = (struct MsgPort *) CreatePort (NULL, 0L))) goto crapout;
if (!(IOB = (struct IOAudio *) AllocMem (sizeof(struct IOAudio),
MEMF_PUBLIC|MEMF_CLEAR))) goto crapout;
IOB->ioa_Request.io_Message.mn_Node.ln_Type = NT_MESSAGE;
IOB->ioa_Request.io_Message.mn_Node.ln_Pri = PRI_EMERG;
IOB->ioa_Request.io_Message.mn_ReplyPort = port;
IOB->ioa_Request.io_Message.mn_Length = sizeof(struct IOAudio);
IOB->ioa_Data = ch_alloc;
IOB->ioa_Length = 4;
if (OpenDevice (AUDIONAME, 0, IOB, 0)) goto crapout;
audioopen = TRUE;
if (!(wave = (byte *) AllocMem (WAVELEN, MEMF_CHIP))) goto crapout;
for (i = 0; i < WAVELEN; i++) wave[i] = sinewave[i];
IOB->ioa_Request.io_Command = CMD_WRITE;
IOB->ioa_Request.io_Flags = ADIOF_PERVOL;
IOB->ioa_Data = wave;
IOB->ioa_Length = WAVELEN;
IOB->ioa_Period = 447;
IOB->ioa_Volume = 64; /* maximum volume */
IOB->ioa_Cycles = 125; /* a guess */
BeginIO (IOB);
WaitIO (IOB);
error = 1;
crapout:
error -= 1;
if (port) DeletePort (port);
if (IOB) FreeMem (IOB, sizeof(struct IOAudio));
if (audioopen) CloseDevice (IOB);
if (wave) FreeMem (wave, WAVELEN);
return (error);
}
void main (argc, argv)
int argc;
char *argv[];
{
int n = 0, deltime = 0;
long sigs;
for (progname = argv[0] + strlen(argv[0]) - 1;
progname != argv[0] && *(progname-1) != '/' && *(progname-1) != ':';
--progname) ;
if (argc > 3 || (argc == 2 && !strncmp ("-h", argv[1], 2))) {
fprintf (stderr, "Usage: %s [<n> [<time>]]\n", progname);
fprintf (stderr, " %s -h[elp]\n", progname);
exit (0);
}
if (argc > 1) n = atoi (argv[1]);
if (argc > 2) deltime = atoi (argv[2]);
do {
beep();
if (!(sigs = SetSignal(0, 0) & SIGBREAKF_CTRL_C) && n) Delay (deltime);
} while (!sigs && --n > 0);
exit (0);
}
--
//\|_||\| John D. Aycock aycock@cpsc.ucalgary.ca
\/ \/| || | (403) 285-8727