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

📄 mmlevel.pas

📁 一套及时通讯的原码
💻 PAS
📖 第 1 页 / 共 5 页
字号:
{========================================================================}
{=                (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/index.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: 10.01.99 - 15:45:43 $                                        =}
{========================================================================}
Unit MMLevel;

{$C FIXED PRELOAD PERMANENT}

{$I COMPILER.INC}

Interface

Uses
{$IFDEF WIN32}
    Windows,
{$ELSE}
    WinTypes,
    WinProcs,
{$ENDIF}
    SysUtils,
    Messages,
    Classes,
    Graphics,
    Controls,
    Forms,
    Dialogs,
    Menus,
    MMSystem,
    MMUtils,
    MMString,
    MMObj,
    MMTimer,
    MMMulDiv,
    MMMath,
    MMRegs,
    MMPCMSup,
    MMWaveIO,
    MMDIBCv,
    MMScale;

const
    {$IFDEF CBUILDER3} {$EXTERNALSYM MAXDECAYCOUNT} {$ENDIF}
    MAXDECAYCOUNT   = 32;  { Maximum amount of temporal averaging allowed }
    {$IFDEF CBUILDER3} {$EXTERNALSYM VALUERANGE} {$ENDIF}
    VALUERANGE      = 100; { Range for SetValue/GetValue, here 0..100%    }

    SYNCBARS : integer = 2;

type
    EMMLevelError     = class(Exception);
    TMMLevelKind      = (lkHorizontal, lkVertical);
    TMMLevelDirection = (dirNormal, dirReversed,dirSymetric);

    TMMLevelDrawBar   = procedure(Sender: TObject; DIB: TMMDIBCanvas;
                                  Rect: TRect; nSpots, Peak: integer) of object;

    { array for uniform decay mode values }
    TDataBuf  = array[0..MAXDECAYCOUNT-1] of Long;

    {-- TMMCustomLevel ---------------------------------------------------------}
    TMMCustomLevel = class(TMMDIBGraphicControl)
    private
      FTimerID      : Longint;      { timer for peak handling              }
      FBarDIB       : TMMDIBCanvas; { bitmap for inactive spots            }
      FEnabled      : Boolean;      { Enable or disable Level              }
      FKind         : TMMLevelKind; { draw horizontal / vertikal bars      }
      FBar1Color    : TColor;       { Farbe f黵 die Punkte im 1. Abschnitt }
      FBar2Color    : TColor;       { Farbe f黵 die Punkte im 2. Abschnitt }
      FBar3Color    : TColor;       { Farbe f黵 die Punkte im 3. Abschnitt }
      FInact1Color  : TColor;       { foreColor for inactive spots 1       }
      FInact2Color  : TColor;       { foreColor for inactive spots 2       }
      FInact3Color  : TColor;       { foreColor for inactive spots 3       }
      FInactiveDoted: Boolean;      { draw the inactive spots doted        }
      FActiveDoted  : Boolean;      { draw the active spots doted          }
      FPoint1       : integer;      { Schwelle von 1. zu 2. Abschnitt %    }
      FPoint2       : integer;      { Schwelle von 2. zu 3. Abschnitt %    }
      FPoint1Spot   : integer;      { on which spot begins next color      }
      FPoint2Spot   : integer;      { on which spot begins next color      }
      FSpotSpace    : integer;      { Horizontal space between spots       }
      FSpotWidth    : integer;      { the spot width in pixel              }
      FFirstSpace   : integer;      { the space before the first spot      }
      FNumSpots     : integer;      { number of Spots                      }
      FDirection    : TMMLevelDirection;{ draw direction, forward/backward }
      FBits         : TMMBits;      { bit8 or bit16                        }
      FChannel      : TMMChannel;   { chBoth, chLeft or chRigth            }
      FMode         : TMMMode;      { mMono or mStereo                     }
      FBytes        : Longint;      { calculated data bytes per level      }
      FGain         : Integer;      { the linear gain for the pcm data     }
      FSamples      : integer;      { number of samples for calculation    }
      FSensitivy    : integer;      { here starts the display (db) scaling }
      FLogAmp       : Boolean;      { set to True for log-based amp. scale }
      FData         : integer;      { the current data for the level       }
      FDataBuf      : TDataBuf;     { Memory for averaging mode            }
      FDecay        : integer;      { the current Decay value              }
      FDecayMode    : TMMDecayMode; { indicating decay mode on/off         }
      FDecayFactor  : Float;        { Geometric decay factor               }
      FDecayCount   : integer;      { Temporal averaging parameter         }
      FDecayCntAct  : integer;      { Total num of bins averaged so far    }
      FDecayPtr     : integer;      { Index for averaging buffer location  }
      FLastVal_F    : Float;        { Lastvalue for exp decay mode         }
      FLastVal      : Longint;      { Lastvalue for uniform averaging      }
      FNumPeaks     : integer;      { number of spots displayed as peak    }
      FDrawScale    : Boolean;      { draw the scale or not                }
      FCurPeak      : integer;      { the actual sample Peak Value         }
      FPeak         : integer;      { the actual Peak Value for the display}
      FPeakDelay    : integer;      { the delay for the peak spot          }
      FPeakSpeed    : integer;      { the decrease speed for the peak spot }
      FPeakCounter  : integer;      { internal Peak delay counter          }
      FWidth        : integer;      { calculated width without border      }
      FHeight       : integer;      { calculated height without border     }
      FClientRect   : TRect;        { calculated beveled Rect              }
      FRange        : Longint;      { pcm input dynamic range              }
      FRefresh      : Boolean;      { needs the peak a refresh ?           }
      FDCOffsetL    : integer;
      FDCOffsetR    : integer;
      FDrawReversed : Boolean;

      { Events }
      FOnPaint       : TNotifyEvent;
      FOnGainOverflow: TNotifyEvent;
      FOnPcmOverflow : TNotifyEvent;
      FOnDrawBar     : TMMLevelDrawBar;

      procedure ResetDecayBuffers;
      procedure CalcNumSpots;
      procedure SetBytesPerLevel;
      procedure DrawInactiveSpots;
      procedure DrawLevelHorizontal(DIB: TMMDIBCanvas; nSpots, Peak: integer; DrawAll: Boolean);
      procedure DrawLevelVertical(DIB: TMMDIBCanvas; nSpots, Peak: integer; DrawAll: Boolean);
      procedure DrawLevel(Dummy: Boolean);

      procedure SetOnDrawBar(aValue: TMMLevelDrawBar);
      procedure SetEnabled(aValue: Boolean);
      procedure SetKind(aValue: TMMLevelKind);
      Procedure SetColors(Index: Integer; aValue: TColor);
      procedure SetPoints(Index, aValue: integer);
      procedure SetSpotSpace(aValue: integer);
      procedure SetSpotWidth(aValue: integer);
      procedure SetDirection(aValue: TMMLevelDirection);
      procedure SetPCMWaveFormat(wf: TPCMWaveFormat);
      function  GetPCMWaveFormat: TPCMWaveFormat;
      procedure SetBits(aValue: TMMBits);
      procedure SetChannel(aValue: TMMChannel);
      procedure SetMode(aValue: TMMMode);
      procedure SetGain(aValue: Integer);
      function  GetGain: integer;
      procedure SetSamples(aValue: integer);
      procedure SetDecayMode(aValue: TMMDecayMode);
      procedure SetDecay(aValue: integer);
      procedure SetNumPeaks(aValue: integer);
      procedure SetPeakDelay(aValue: integer);
      procedure SetPeakSpeed(aValue: integer);
      procedure SetInactiveDoted(aValue: Boolean);
      procedure SetActiveDoted(aValue: Boolean);
      procedure SetSensitivy(aValue: integer);
      procedure SetLogAmp(aValue: Boolean);
      procedure SetValue(aValue: integer);
      function  GetValue: integer;
      function  GetPeak: integer;
      function  GetPeakValue: integer;
      procedure SetDCOffset(Index, aValue: integer);
      function  GetDCOffset(Index: integer): integer;

      procedure CMColorChanged(var Message: TMessage); message CM_COLORCHANGED;

    protected
      procedure SetBPP(aValue: integer); override;
      procedure Paint; override;
      procedure Loaded; override;
      procedure GainOverflow; dynamic;
      procedure PcmOverflow; dynamic;
      procedure Changed; override;

    public
      constructor Create(AOwner: TComponent); override;
      destructor  Destroy; override;

      procedure   ChangeDesigning(aValue: Boolean); override;
      procedure   SetBounds(aLeft, aTop, aWidth, aHeight: integer); override;

      property    DrawReversed: Boolean read FDrawReversed write FDrawReversed;

      procedure   RefreshPCMData(PCMData: Pointer);
      procedure   SetData(SampleValue: integer);
      procedure   ResetData;

      property    BytesPerLevel: Longint read FBytes;
      property    PCMWaveFormat: TPCMWaveFormat read GetPCMWaveFormat write SetPCMWaveFormat;

      property    NumSpots: integer read FNumSpots;
      property    Point1Spot: integer read FPoint1Spot;
      property    Point2Spot: integer read FPoint2Spot;
      property    Peak: integer read FCurPeak;
      property    PeakDisplay: integer read GetPeak;
      property    PeakValue: integer read GetPeakValue;

    protected
      { Events }
      property OnPaint: TNotifyEvent read FOnPaint write FOnPaint;
      property OnDrawBar: TMMLevelDrawBar read FOnDrawBar write SetOnDrawBar;
      property OnGainOverflow: TNotifyEvent read FOnGainOverflow write FOnGainOverflow;
      property OnPcmOverflow: TNotifyEvent read FOnPcmOverflow write FOnPcmOverflow;

      property ParentColor default False;
      property Color default clBlack;
      property Height default 17;
      property Width default 200;
      property Enabled: Boolean read FEnabled write SetEnabled default True;
      property Kind: TMMLevelKind read FKind write SetKind default lkHorizontal;
      property SpotSpace: integer read FSpotSpace write SetSpotSpace default 1;
      property SpotWidth: integer read FSpotWidth write SetSpotWidth default 1;
      property Bar1Color: TColor index 0 read FBar1Color write SetColors default clAqua;
      property Bar2Color: TColor index 1 read FBar2Color write SetColors default clAqua;
      property Bar3Color: TColor index 2 read FBar3Color write SetColors default clRed;
      property Inactive1Color: TColor index 3 read FInact1Color write SetColors default clTeal;
      property Inactive2Color: TColor index 4 read FInact2Color write SetColors default clTeal;
      property Inactive3Color: TColor index 5 read FInact3Color write SetColors default clMaroon;
      property InactiveDoted: Boolean read FInactiveDoted write SetInactiveDoted default False;
      property ActiveDoted: Boolean read FActiveDoted write SetActiveDoted default False;
      property Point1: integer index 0 Read FPoint1 write SetPoints default 50;
      property Point2: integer index 1 Read FPoint2 write SetPoints default 85;
      property Direction: TMMLevelDirection read FDirection write SetDirection default dirNormal;
      property BitLength: TMMBits read FBits write setBits default b8bit;
      property Channel: TMMChannel read FChannel write setChannel default chBoth;
      property Mode: TMMMode read FMode write SetMode default mMono;
      property Gain: Integer read getGain write setGain default 0;
      property Samples: integer read FSamples write SetSamples default 50;
      property Sensitivy: integer read FSensitivy write SetSensitivy default -35;
      property LogAmp: Boolean read FLogAmp write SetLogAmp default True;
      property NumPeaks: integer read FNumPeaks write SetNumPeaks default 1;
      property PeakDelay: integer read FPeakDelay write SetPeakDelay default 20;
      property PeakSpeed: integer read FPeakSpeed write SetPeakSpeed default 0;
      property DecayMode: TMMDecayMode read FDecayMode write SetDecayMode default dmNone;
      property Decay: integer read FDecay write SetDecay default 1;
      property Value: integer read GetValue write SetValue stored False default 0;
      property DCOffsetL: integer index 0 read GetDCOffset write SetDCOffset default 0;
      property DCOffsetR: integer index 1 read GetDCOffset write SetDCOffset default 0;
    end;

    {-- TMMLevel --------------------------------------------------------}
    TMMLevel = class(TMMCustomLevel)
    published
      property OnClick;
      property OnDblClick;
      property OnMouseDown;
      property OnMouseMove;
      property OnMouseUp;
      property OnDrawBar;
      property OnGainOverflow;
      property OnPcmOverflow;
      property OnPaint;
      property OnDragDrop;
      property OnDragOver;
      property OnEndDrag;
      property OnStartDrag;

      property Align;
      property Bevel;
      property PopupMenu;
      property ParentShowHint;
      property ParentColor;
      property ShowHint;
      property Visible;
      property Color;
      property DragCursor;
      property Enabled;
      property Kind;
      property Height;
      property Width;
      property SpotSpace;
      property SpotWidth;
      property Bar1Color;
      property Bar2Color;
      property Bar3Color;
      property Inactive1Color;
      property Inactive2Color;
      property Inactive3Color;
      property InactiveDoted;
      property ActiveDoted;
      property Point1;
      property Point2;
      property Direction;
      property BitLength;
      property Channel;
      property Mode;
      property Gain;
      property Samples;
      property Sensitivy;
      property LogAmp;
      property NumPeaks;
      property PeakDelay;
      property PeakSpeed;
      property DecayMode;
      property Decay;
      property Value;
      property DCOffsetL;
      property DCOffsetR;
    end;

    {-- TMMLevScale -----------------------------------------------------}
    TMMLevScale    = class(TMMCustomScale)
    published
        property Visible default False;
        property TickCount;
        property EnlargeEvery;
        property Size;
        property Origin;
        property Connect;
    end;

    TMMScalePos    = (spAboveOrLeft, spBelowOrRight, spBoth);

    {-- TMMLevelScale ---------------------------------------------------}
    TMMLevelScale  = class(TMMGraphicControl)
    private
       FScaleTicks : integer;   { draw every FScaleTicks a volume string }
       FPoint1     : integer;   { Schwelle von 1. zu 2. Abschnitt %      }
       FPoint2     : integer;   { Schwelle von 2. zu 3. Abschnitt %      }
       FScale1Color: TColor;    { Farbe f黵 die Punkte im 1. Abschnitt   }
       FScale2Color: TColor;    { Farbe f黵 die Punkte im 2. Abschnitt   }
       FScale3Color: TColor;    { Farbe f黵 die Punkte im 3. Abschnitt   }
       FKind       : TMMLevelKind;
       FDirection  : TMMLevelDirection;
       FSensitivy  : integer;
       FLogAmp     : Boolean;
       FScale      : TMMLevScale;
       FScalePos   : TMMScalePos;

       procedure SetScale(Value: TMMLevScale);
       procedure SetScalePos(Value: TMMScalePos);
       procedure ScaleChanged(Sender: TObject);
       procedure SetSensitivy(aValue: integer);
       procedure SetLogAmp(aValue: Boolean);
       procedure SetScaleTicks(aValue: integer);
       procedure SetPoints(Index, aValue: integer);
       procedure SetColors(Index: Integer; aValue: TColor);
       procedure SetKind(aValue: TMMLevelKind);
       procedure SetDirection(aValue: TMMLevelDirection);

    public
       constructor Create(AOwner: TComponent); override;
       destructor  Destroy; override;

       procedure Paint; override;

    published
       { Events }
       property OnClick;
       property OnDblClick;
       property OnMouseDown;
       property OnMouseMove;
       property OnMouseUp;

       property Align;
       property Width default 200;
       property Height default 7;
       property Visible;
       property Enabled;
       property PopupMenu;
       property ParentShowHint;
       property ParentFont default False;
       property Font;
       property Color default clBlack;
       property ScaleTicks: integer read FScaleTicks write SetScaleTicks default 8;
       property Point1: integer index 0 Read FPoint1 write SetPoints default 50;
       property Point2: integer index 1 Read FPoint2 write SetPoints default 85;
       property Scale1Color: TColor index 0 read FScale1Color write SetColors default clWhite;

⌨️ 快捷键说明

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