📄 mmlevel.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/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 + -