;DELPHI制作录音话筒示意图怎样实现?该如何处理

;DELPHI制作录音话筒示意图怎样实现?
大家好:我现在在学习录音方面的知识,请教一个问题,怎样才能实现用一个简单的控件表示录音的时候话筒的音量?若有这方面的知识或代码请给点我帮助,非常感谢。

------解决方案--------------------
Delphi(Pascal) code

unit SoundCap; 

interface 
uses 
    Windows, Messages, MMSystem, Classes, SysUtils, Math, Forms,Dialogs, Controls,ExtCtrls; 
type 
  TData8 = array [0..127] of byte; 
  PData8 = ^TData8; 
  TData16 = array [0..127] of smallint; 
  PData16 = ^TData16; 
  
  TSoundCap = Class(TCustomControl) 
  private 
  protected 
  public 
    FilterValve : Integer; //音频过滤的阀值 
    isCapture : boolean ; 
    MaxValue :integer; 
    constructor Create(handle : THandle); //overload; 
    destructor Destroy; override; 
    procedure OpenCapture(handle : THandle); 
    procedure CloseCapture; 
    procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;  //录音缓冲区满后,进行数据处理,将数据送到播放缓冲区 
    procedure StartCap; 
    procedure StopCap; 
  end; 

implementation 
var 
  WaveIn: hWaveIn; 
  hBuf: THandle; 
  BufHead: TWaveHdr; 
  bufsize: integer; 
  Bits16: boolean; 
  stop: boolean = false; 
  StartTime : DWORD ; 
  Count : integer = 0; 
  header: TWaveFormatEx; 
{ TSoundCap } 
//关闭音频捕捉 

procedure TSoundCap.CloseCapture; 
begin 
  if stop = false then 
    Exit; 
  stop := false; 
  while not stop do 
  Application.ProcessMessages; 
  stop := false; 
  WaveInReset(WaveIn);  // 停止声音输入设备工作 
  WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead)); 
  WaveInClose(WaveIn);  //停止声音输入 
  GlobalUnlock(hBuf); 
  GlobalFree(hBuf); 
end; 

constructor TSoundCap.Create(handle: THandle); 
begin 
  Inherited Create(nil); 
  ParentWindow := handle; 
  isCapture := false; 
  FilterValve := 3; 
end; 

destructor TSoundCap.Destroy; 
begin 
  inherited; 
  CloseCapture; 
end; 
//处理Wave数据采集 

procedure TSoundCap.OnWaveIn(var Msg: TMessage);  //缓冲区数据已满则处理消息 
var 
  data8 : PData8; 
  i, x, y : integer; 
  StartPos, EndPos, SCount : integer; 
  tmp : Integer; 
begin 
  MaxValue := 0; 
  Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData); 
  for i := 0 to BufSize - 1 do 
  Begin 
    x := i; 
    y := Round(abs(data8^[i] - 128) * 100 / 128); //data8^[i] 为 128 - 256 之间 
    tmp := Round(abs(data8^[i] - 128) * 100 / 128); 
    if tmp > MaxValue Then 
      MaxValue := tmp; 
  End; 
  if MaxValue = 1 then 
    MaxValue := 0; 
  Data8 := nil; 
  if stop then 
    WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam),SizeOf(TWaveHdr)) 
  else 
    stop := true; 
end; 
//打开音频捕捉 

procedure TSoundCap.OpenCapture(handle: THandle); 
var 
  BufLen: word; 
  buf: pointer; 
begin 
  BufSize := 3 * 500 + 100; 
  Bits16 := false; 
  with header do 
  begin 
    wFormatTag := WAVE_FORMAT_PCM; 
    nChannels := 1; 
    nSamplesPerSec :=44100;// 22050; 
    wBitsPerSample := integer(Bits16) * 8 + 8; 
    nBlockAlign := nChannels * (wBitsPerSample div 8 ); 
    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign; 
    cbSize := 0; 
  end; 
  WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),self.Handle , 0, CALLBACK_WINDOW); 
  BufLen := header.nBlockAlign * BufSize; 
  hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen); //从全局内存堆中分配一块内存(该内存可移动并且可供应用程序共享),并返回该内存块的句柄 
  Buf := GlobalLock(hBuf);                    //锁定全局内存并返回指向该内存块的指针 
  with BufHead do 
  begin 
    lpData := Buf; 
    dwBufferLength := BufLen; 
    dwFlags := WHDR_BEGINLOOP; 
  end; 
  WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead)); //预备声音输入缓冲区 
  WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));    //向声音输入设备发送缓冲区 
  stop := true;                                                // 停止声音输入设备工作 
  WaveInStart(WaveIn); 
end; 
//开始监视捕捉 

procedure TSoundCap.StartCap; 
begin 
  isCapture := true; 
  StartTime := GetTickCount; 
end; 
//停止监视音频捕捉 

procedure TSoundCap.StopCap; 
begin 
  isCapture := false; 
end; 

end.