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

📄 mmdspmtr.pas

📁 一套及时通讯的原码
💻 PAS
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 08.07.98 - 03:32:54 $                                        =}
{========================================================================}
unit MMDSPMtr;

{$I COMPILER.INC}

interface

uses
{$IFDEF WIN32}
    Windows,
{$ELSE}
    WinTypes,
    WinProcs,
{$ENDIF}
    SysUtils,
    Controls,
    Classes,
    Forms,
    MMSystem,
    MMObj,
    MMUtils,
    MMTimer;

const
    INTERVAL = 100;

type
    {-- TMMMDSPMeter ----------------------------------------------------------}
    TMMDSPMeter = class(TMMNonVisualComponent)
    private
       FTimerID     : Longint;
       FInitCount   : Longint;
       FMeasureTime : Longint;
       FStartTime   : Longint;
       FMeasureCount: Longint;
       FLastTime    : FLoat;
       FCurTime     : Longint;

       function GetValue: integer;
    public
       constructor Create(aOwner: TComponent); override;
       destructor  Destroy; override;

       procedure Init;
       procedure Done;

       procedure StartMeasurement;
       procedure StopMeasurement;

       property  Value: integer read GetValue;
    end;

procedure InitDSPMeter;
procedure DoneDSPMeter;
procedure StartDSPMeter;
procedure StopDSPMeter;

implementation

const
     GlobalDSPMeter: TMMDSPMeter = nil;

{------------------------------------------------------------------------------}
procedure InitDSPMeter;
begin
   if (GlobalDSPMeter <> nil) then
   begin
      GlobalDSPMeter.Init;
   end;
end;

{------------------------------------------------------------------------------}
procedure DoneDSPMeter;
begin
   if (GlobalDSPMeter <> nil) then
   begin
      GlobalDSPMeter.Done;
   end;
end;

{------------------------------------------------------------------------------}
procedure StartDSPMeter;
begin
   if (GlobalDSPMeter <> nil) then
   begin
      GlobalDSPMeter.StartMeasurement;
   end;
end;

{------------------------------------------------------------------------------}
procedure StopDSPMeter;
begin
   if (GlobalDSPMeter <> nil) then
   begin
      GlobalDSPMeter.StopMeasurement;
   end;
end;

{------------------------------------------------------------------------}
procedure TimeCallBack(uTimerID, dwUser: Longint); export;
const
   Decay = 0.9;
var
   CurTime: Longint;
begin
  if (dwUser <> 0) then
  with TMMDSPMeter(dwUser) do
  begin
     if (FInitCount > 0) then
     begin
        if (FMeasureCount > 0) then
        begin
           CurTime := TimeGetTime;
           inc(FMeasureTime,CurTime-FStartTime);
           FStartTime := CurTime;
        end;

        FLastTime := FLastTime*Decay+(1-Decay)*FMeasureTime+0.05;
        FCurTime := Trunc(FLastTime);
        FMeasureTime := 0;
     end;
  end
end;

{== TMMDSPMeter ===============================================================}
constructor TMMDSPMeter.Create(aOwner: TComponent);
begin
   inherited Create(aOwner);

   FInitCount := 0;

   TimeBeginPeriod(1);

   if (GlobalDSPMeter = nil) then GlobalDSPMeter := Self;

   ErrorCode := ComponentRegistered(InitCode, Self, ClassName);
   if (ErrorCode <> 0) then RegisterFailed(InitCode, Self , ClassName);
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
destructor TMMDSPMeter.Destroy;
begin
   TimeEndPeriod(1);

   if (GlobalDSPMeter = Self) then GlobalDSPMeter := nil;

   inherited Destroy;
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
procedure TMMDSPMeter.Init;
begin
   if (GlobalDSPMeter <> Self) then exit;

   inc(FInitCount);
   if (FInitCount = 1) then
   begin
      FMeasureCount := 0;
      FMeasureTime := 0;
      FLastTime := 0;
      FCurTime := 0;
      FTimerID := MMTimeSetEvent(INTERVAL, False, TimeCallBack, Longint(Self));
   end;
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
procedure TMMDSPMeter.Done;
begin
   if (FInitCount > 0) then
   begin
      dec(FInitCount);
      if (FInitCount = 0) then
      begin
         MMTimeKillEvent(FTimerID);
      end;
   end;
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
procedure TMMDSPMeter.StartMeasurement;
begin
   if (FInitCount > 0) then
   begin
      inc(FMeasureCount);
      if (FMeasureCount = 1) then FStartTime := TimeGetTime;
   end;
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
procedure TMMDSPMeter.StopMeasurement;
begin
   if (FInitCount > 0) then
   begin
      dec(FMeasureCount);
      if (FMeasureCount = 0) then
      begin
         inc(FMeasureTime,TimeGetTime-FStartTime);
      end;
   end;
end;

{-- TMMDSPMeter ---------------------------------------------------------------}
function TMMDSPMeter.GetValue: integer;
begin
   Result := 0;

   if (FInitCount > 0) then
   begin
      Result := Min((FCurTime * 100) div INTERVAL,100);
   end;
end;

end.

⌨️ 快捷键说明

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