利用声卡作示波器

一、初始化声卡

 function TForm1.InitWave(): Boolean;
var
  Res: Integer;
  numberDevs, i: Integer;
  pwic: TWAVEINCAPS;
begin
with gbWaveFmt do
  begin
    //波形声音的格式
    wFormatTag := WAVE_FORMAT_PCM;
    //音频文件的通道数量,单声道为1。立体声,此值为2.
    nChannels := 1;
    //采样率       设置每个声道播放和记录时的样本频率。
    //如果wFormatTag = WAVE_FORMAT_PCM,那么nSamplesPerSec通常为8.0 kHz,
    //11.025 kHz, 22.05 kHz和44.1 kHz。
    nSamplesPerSec := 96000; //11025//22050//44100
    //  iscp1.SamplesPerSecond := 96000;

    //根据wFormatTag的类型设置每个样本的位深(即每次采样样本的大小,以bit为单位)。
    //如果wFormatTag = WAVE_FORMAT_PCM,此值应该设为8或16,
    //对于非PCM格式,根据厂商的说明设置。一些压缩的架构不能设置此值,此时wBitsPerSample应该为零。
    wBitsPerSample := 8;
    //每秒多少字节, =nSamplesPerSec*wBitsPerSample/8。
    nAvgBytesPerSec := Trunc(nSamplesPerSec * wBitsPerSample / 8);
    //以字节为单位设置块对齐。块对齐是指最小数据的原子大小。
    //如果wFormatTag = WAVE_FORMAT_PCM,nBlockAlign 为  (nChannels*wBitsPerSample)/8
    nBlockAlign := Trunc((nChannels * wBitsPerSample) / 8);
    //额外信息的大小,以字节为单位,
    //额外信息添加在WAVEFORMATEX结构的结尾。
    //这个信息可以作为非PCM格式的wFormatTag额外属性,
    //如果wFormatTag不需要额外的信息,此值必需为0,对于PCM格式此值被忽略
    cbSize := 0;
  end;

  //FBufferSize :=1024;

  {用回调函数取得采集的音频数据}
  res := WaveInOpen(@FWaveInHandle, WAVE_MAPPER, @gbWaveFmt,
    cardinal(@WaveInCallback), cardinal(Self), CALLBACK_FUNCTION);

  case Res of
    MMSYSERR_NOERROR:
      begin
        result := True;
      end;
    MMSYSERR_BADDEVICEID:
      begin
        ShowMessage('设备未插入');
        Exit;
      end;
  else
    exit;
  end;

  {为音频输入设备一次添加多个缓冲区,这些缓冲区有系统调度}
  Getmem(gbWaveHeader, SizeOf(TWaveHDR));
  Getmem(gbWaveHeader.lpData, FBufferSize);
end;

二、开始录音

procedure StartWave(hwave: HWaveIn; header: PWaveHdr);
var
  Res: Integer;
begin
  with header^ do
  begin

    dwBufferLength := FBufferSize;
    dwBytesRecorded := 0; //WHDR_DONE
    dwFlags := 0;
    dwLoops := 0;
  end;
  Res := WaveInPrepareHeader(hwave, header, sizeof(TWaveHDR));
  if Res <> 0 then
    Exit;
  Res := WaveInAddBuffer(hwave, header, SizeOf(TWaveHDR));
  if Res <> 0 then
    Exit;
  WaveInStart(hwave);
end;


  三、定时画波形

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麻雀123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值