一、初始化声卡
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;
三、定时画波形