(*-------------------------------------------------------------------------*)
(*                                                                         *)
(*  Amiga Oberon Library Module: Beep                 Date: 02-Nov-92      *)
(*                                                                         *)
(*   © 1992 BY Fridtjof Siebert                                            *)
(*                                                                         *)
(*-------------------------------------------------------------------------*)

MODULE Beep;

IMPORT e   := Exec,
       au  := Audio,
       es  := ExecSupport,
       sys := SYSTEM;

CONST  (* $DataChip+ *)
  RectTable = "\x7F\x80";
  RectTableSize = 2;
  AllocationMap = "\x01\x08\x02\x04";

VAR
  AllocPort: e.MsgPortPtr;
  AllocIOB:  au.IOAudio;
  AudioOpen: BOOLEAN;

PROCEDURE Beep*(low: BOOLEAN);
BEGIN

  AllocIOB.request.message.node.pri  := -40;
  AllocIOB.request.message.replyPort := AllocPort;
  AllocIOB.data   := sys.ADR(AllocationMap);
  AllocIOB.length := 4;

  IF (e.OpenDevice("audio.device",0,sys.ADR(AllocIOB),LONGSET{})=0) &
     (AllocIOB.request.error = 0) THEN

    AudioOpen := TRUE;

    AllocIOB.request.command := e.write;
    AllocIOB.request.flags   := SHORTSET{4};
    AllocIOB.data            := sys.ADR(RectTable);
    AllocIOB.length          := RectTableSize;
    AllocIOB.volume          := 64;

    IF low THEN AllocIOB.period := 6000; AllocIOB.cycles :=   75;
           ELSE AllocIOB.period := 3000; AllocIOB.cycles :=  150 END;

    es.BeginIO(sys.ADR(AllocIOB));
    IF e.WaitIO(sys.ADR(AllocIOB))=0 THEN END;

    AudioOpen := FALSE;
    e.CloseDevice(sys.ADR(AllocIOB));

  END;

END Beep;


BEGIN

  AudioOpen := FALSE;
  AllocPort := es.CreatePort("",0);
  IF AllocPort=NIL THEN HALT(20) END;

CLOSE

  IF AudioOpen     THEN e.CloseDevice(sys.ADR(AllocIOB)) END;
  IF AllocPort#NIL THEN es.DeletePort(AllocPort)     END;

END Beep.


