/* BEEP.C - NewZAP support routines - (c) 1986 John Hodgson */

/* Absolute bare minimum beep routine. Allocates/deallocates all resources
   during entry & exit. Very easy to spruce up! */

#define SOUNDPRIORITY 50; /* completely arbitrary */

extern struct Window *pwindow; /* so we can find the Workbench screen */

Beep()
{
  struct IOAudio audioblock;
  struct MsgPort *replyport=0,*CreatePort();

  static UBYTE wave[] = {~127,~127,127,127}; /* cheapo square wave */
  static UBYTE allocmap[] = {1,2,4,8}; /* any available channel */

  long OpenDevice(),WaitIO();
  UBYTE *wavesample;

  setmem(&audioblock,sizeof(audioblock),0); /* start fresh */

  if ((replyport=CreatePort(0L,0L))==0) {
    DisplayBeep(pwindow->WScreen); /* flash if can't beep */
    return(0);
  }
 
  /* prepare for ALLOCATE */
  
  audioblock.ioa_Data=&allocmap[0];
  audioblock.ioa_Length=sizeof(allocmap);
  audioblock.ioa_Request.io_Message.mn_ReplyPort=replyport;
  audioblock.ioa_Request.io_Message.mn_Node.ln_Pri=SOUNDPRIORITY;

  /* attempt to ADCMD_ALLOCATE while opening */
 
  if (OpenDevice("audio.device",0L,&audioblock,0L)) {
    DeletePort(replyport);
    DisplayBeep(pwindow->WScreen);
    return(0); /* back if no channel available */
  }

  audioblock.ioa_Request.io_Command=CMD_WRITE;
  audioblock.ioa_Request.io_Flags=ADIOF_PERVOL;
  audioblock.ioa_Period=447; /* 2000 Hz for this waveform */
  audioblock.ioa_Volume=64/2; /* half volume */
  audioblock.ioa_Cycles=150; /* 1/15 sec. */
  audioblock.ioa_Data=&wave[0];
  audioblock.ioa_Length=sizeof(wave);

  BeginIO(&audioblock);
  if (WaitIO(&audioblock)) DisplayBeep(pwindow->WScreen);

  CloseDevice(&audioblock); /* clean up now */
  DeletePort(audioblock.ioa_Request.io_Message.mn_ReplyPort);
}
