unit osc_vis; { Oscilloscope Visualyzation by Alessandro Cappellozza version 0.8 05/2002 http://digilander.iol.it/Kappe/audioobject } interface uses Windows, Dialogs, Graphics, SysUtils, CommonTypes, Classes; type TOcilloScope = Class(TObject) private VisBuff : TBitmap; BackBmp : TBitmap; BkgColor : TColor; ScopeOff : Integer; PenColor : TColor; DrawType : Integer; DrawRes : Integer; FrmClear : Boolean; UseBkg : Boolean; public Constructor Create (Width, Height : Integer); procedure Draw(HWND : THandle; WaveData : TWaveData; X, Y : Integer); procedure SetBackGround (Active : Boolean; BkgCanvas : TGraphic); property BackColor : TColor read BkgColor write BkgColor; property Offset : Integer read ScopeOff write ScopeOff; property Pen : TColor read PenColor write PenColor; property Mode : Integer read DrawType write DrawType; property Res : Integer read DrawRes write DrawRes; property FrameClear : Boolean read FrmClear write FrmClear; end; var OcilloScope : TOcilloScope; implementation Constructor TOcilloScope.Create(Width, Height : Integer); begin VisBuff := TBitmap.Create; BackBmp := TBitmap.Create; VisBuff.Width := Width; VisBuff.Height := Height; BackBmp.Width := Width; BackBmp.Height := Height; BkgColor := clBlack; ScopeOff := 50; PenColor := clWhite; DrawType := 0; DrawRes := 1; FrmClear := True; UseBkg := False; end; procedure TOcilloScope.SetBackGround (Active : Boolean; BkgCanvas : TGraphic); begin UseBkg := Active; BackBmp.Canvas.Draw(0, 0, BkgCanvas); end; procedure TOcilloScope.Draw(HWND : THandle; WaveData : TWaveData; X, Y : Integer); var i, YPos : LongInt; R, L : SmallInt; begin if FrmClear then begin VisBuff.Canvas.Pen.Color := BkgColor; VisBuff.Canvas.Brush.Color := BkgColor; if UseBkg then BitBlt(VisBuff.Canvas.Handle, // Destination 0, 0, // X, Y (target pos) VisBuff.Width, VisBuff.Height, // Size to copy BackBmp.Canvas.handle, // Source 0, 0, // X, Y (source pos) SrcCopy) // plain copy else VisBuff.Canvas.Rectangle(0, 0, VisBuff.Width, VisBuff.Height) // only if no background end; VisBuff.Canvas.Pen.Color := PenColor; R := SmallInt(LOWORD(WaveData[0])); L := SmallInt(HIWORD(WaveData[0])); YPos := Trunc(((R + L) / (2 * 65535)) * ScopeOff) ; VisBuff.Canvas.MoveTo(X , Y + YPos); for i := 1 to 256 do begin R := SmallInt(Loword(WaveData[i * DrawRes])); L := SmallInt(HIword(WaveData[i * DrawRes])); YPos := Trunc(((R + L) / (2 * 65535)) * ScopeOff) ; case DrawType of 0 : VisBuff.Canvas.lineto(X + i, Y + YPos); 1 : begin VisBuff.Canvas.MoveTo(X + i, Y); VisBuff.Canvas.lineto(X + i, Y + YPos); end; 2 : VisBuff.Canvas.Pixels[X + i, Y + YPos] := PenColor; end; end; BitBlt(HWND, 0, 0, VisBuff.Width, VisBuff.Height, VisBuff.Canvas.Handle, 0, 0, srccopy) end; end.