⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bleepint.pas

📁 GPRS/CDMA DTU数据中心源代码,基于DataCenterX控件开发.
💻 PAS
字号:
Unit BleepInt; { Version 4.2 }

{ Andy Preston - Apollo Developments, Swindon U.K. andy@apollod.freeserve.co.uk

  HACKERS OF THE WORLD UNITE!    HACKERS OF THE WORLD UNITE!    HACKERS OF THE WORLD UNITE!    HACKERS OF THE WORLD UNITE! 

  How to make your Delphi programs bleep like FRACTINT!  See Demo1.pas/Demo1.dfm or Bleepint.htm for details 
}

Interface

Type
  TBleepType = (bOK, bInterrupt, bError);

Procedure ShutUp; { Added to help counter the effects of DoBleep (Freq, -1).
                    If you are producing a tone, & you want to stop without doing another Bleep, call this procedure }

Procedure DoBleep (Freq : Word; MSecs : Integer); { Duration of -1 means bleep until the next bleep sent, or ShutUp is called }

Procedure Bleep (BleepType : TBleepType);

Implementation

Uses
  {$IFDEF WIN32} Windows, {$ELSE} WinProcs, {$ENDIF}
  {$IFNDEF CONSOLE} Forms; {$ENDIF} { Michl Ladislav suggested removing the Forms unit from 32-bit Console Apps, saving 130K }


{ -- --- -- --- -- --- -- --- -- --- -- --- -- --- Assembler Bits for Wind 3.x And '95 -- --- -- --- -- --- -- --- -- --- }

Procedure AsmShutUp; {$IFDEF WIN32} Pascal; {$ENDIF}
Begin
  Asm
    In AL, $61  { Stop Bleeping }
    And AL, $FC
    Out $61, AL
  End;
End;

Procedure AsmBeep (Freq : Word); {$IFDEF WIN32} Pascal; {$ENDIF}
Label
  Skip;
Begin
  Asm
        Push BX
        In AL, $61
        Mov BL, AL
        And AL, 3
        Jne Skip
        Mov AL, BL
        Or AL, 3
        Out $61, AL
        Mov AL, $B6
        Out $43, AL
  Skip: Mov AX, Freq
        Out $42, AL
        Mov AL, AH
        Out $42, AL
        Pop BX
  End;
End;

{ -- --- -- --- -- --- -- --- -- --- -- --- -- --- Low Level Bits for Wind 3.x And '95 -- --- -- --- -- --- -- --- -- --- }

Procedure HardBleep (Freq : Word; MSecs : Integer);
Var
  { Changed FirstTickCount from LongInt to DWord to counter P.Satyanarayana's Delphi 4 Warning - see below }
  FirstTickCount : {$IFDEF WIN32} DWord {$ELSE} LongInt {$ENDIF};
Begin
  { Michl Ladislav pointed out that having a delay when the bleep freq is out of range is a waste of 'stuff' so I've added
    another BEGIN END }
  If (Freq>=20) And (Freq<=5000) Then Begin
    AsmBeep (Word (1193181 Div LongInt(Freq)));
    If MSecs>=0 Then Begin
      { P.Satyanarayana Get's a warning under Delphi 4 here 'Comparing signed and unsigned types - widened both operands'
        This should be cleared up by the fact that FirstTickCount is now a DWord under Win32 }
      FirstTickCount:=GetTickCount;
      { Michl Ladislav suggested changing the old WHILE DO to a REPEAT UNTIL so as to fit his modifications in easyer }
      Repeat
        { Michl Ladislav suggested removing the Forms unit from 32-bit Console Apps, saving 130K }
        {$IFNDEF CONSOLE} If MSecs>1000 Then Application.ProcessMessages; {$ENDIF}
      Until ((GetTickCount-FirstTickCount)>LongInt(MSecs));
      AsmShutUp;
    End;
  End;
End;

{ -- --- -- --- -- --- -- --- -- --- -- --- -- --- -- --- Procedures for you to use -- --- -- --- -- --- -- --- -- --- -- --- }

Procedure Bleep (BleepType : TBleepType);
Begin
  Case BleepType of
    bOK: Begin
      DoBleep (1047,100);
      DoBleep (1109,100);
      DoBleep (1175,100);
    End;
    bInterrupt: Begin
      DoBleep (2093,100);
      DoBleep (1976,100);
      DoBleep (1857,100);
    End;
    bError: DoBleep (40,500);
  End;
End;

{$IFDEF WIN32} Var SysWinNT : Boolean; {$ENDIF}

Procedure DoBleep (Freq : Word; MSecs : Integer);
Begin
  {$IFDEF WIN32} If SysWinNT Then Windows.Beep (Freq, MSecs) Else {$ENDIF}
  HardBleep (Freq, MSecs);
End;

Procedure ShutUp;
Begin
  {$IFDEF WIN32} If SysWinNT Then Windows.Beep (1, 0) Else {$ENDIF}
  AsmShutUp;
End;

{$IFDEF WIN32}

  Procedure InitSysType;
  Var
    VersionInfo : TOSVersionInfo;
  Begin
    VersionInfo.dwOSVersionInfoSize:=SizeOf (VersionInfo);
    GetVersionEx (VersionInfo);
    SysWinNt:=VersionInfo.dwPlatformID=VER_PLATFORM_WIN32_NT;
  End;

  Initialization
    InitSysType;

{$ENDIF}

End.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -