Thread View: comp.sys.amiga.tech
1 messages
1 total messages
Started by John Aycock
Fri, 04 Jan 1991 12:26
Need help with ports, messages, audio.device...
Author: John Aycock
Date: Fri, 04 Jan 1991 12:26
Date: Fri, 04 Jan 1991 12:26
102 lines
3845 bytes
3845 bytes
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
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads