下面是一个大虾的贴子:
请原谅忘记作者是谁了。
// 全局变量
var
BufferFinished : boolean; // indicates current record buffer is full
.
UserStopRecord: boolean;
Recording: boolean;
//进行录音
procedure TDlgRecord.BtnStartClick(Sender: TObject);
var
TempInt, TempCode: integer;
TempFileName: string;
MMR: MMResult;
MyWaveFormat: TWaveFormatEx;
begin
PrgsBarSpace.Position := 0;
Recording := false;
OldDiskFree := DiskFree (RecordDrive);
with RecordWaveFormat do
begin
if RdoBtnMono.Checked = true then
Channels := 1
else
Channels := 2;
if RdoBtn8Bit.Checked = true then
BitsPerSample := 8
else
BitsPerSample := 16;
Val (EditFrequency.Text, TempInt, TempCode);
if TempCode <> 0 then
begin
Application.MessageBox ('无效数值', '错误', MB_Ok);
exit;
end
else if TempInt > 48000 then
begin
Application.MessageBox('不能大于48000赫兹', '错误', MB_Ok);
exit;
end
else
begin
SamplesPerSecond := TempInt;
end;
BytesPerSecond := SamplesPerSecond * Channels * BitsPerSample div
8;
BlockAlign := BitsPerSample * Channels div 8 ;
end;
waveInHeader1.lpData := Buffer1;
waveInHeader1.dwBufferLength := RecordBufferSize;
waveInHeader1.dwBytesRecorded := 0;
waveInHeader1.dwUser := 0; // 32 bits of user data
waveInHeader1.dwFlags := 0;
waveInHeader1.dwLoops := 0;
waveInHeader1.lpNext := nil; // reserved; must be zero
waveInHeader1.reserved := 0; // reserved; must be zero
MMR := waveInPrepareHeader (waveInHandle, Addr (waveInHeader1),
sizeof (waveInHeader1));
if MMR <> MMSYSERR_NOERROR then
begin
FreeMem (Buffer1); FreeMem (Buffer2);
RecordBufferSize := 0;
CloseFile (RecordFile);
Application.MessageBox ('第一录音缓冲区准备出错。', '错误', MB_OK)
;
exit;
end;
waveInHeader2.lpData := Buffer2;
waveInHeader2.dwBufferLength := RecordBufferSize;
waveInHeader2.dwBytesRecorded := 0;
waveInHeader2.dwUser := 0; // 32 bits of user data
waveInHeader2.dwFlags := 0;
waveInHeader2.dwLoops := 0;
waveInHeader2.lpNext := nil; // reserved; must be zero
waveInHeader2.reserved := 0; // reserved; must be zero
' Open Input Wave Device, Let WAVE_MAPPER Pick The Best Device...
l = waveInOpen(hWaveIn, WAVE_MAPPER, mWaveInFmt, 0, 0, CALLBACK_NULL)
If l Then Err.Raise 68, , "不能打开音频输出设备"
l = mWaveInFmt.nAvgBytesPerSec / CAPTURE_RATE * 2
InitWaveHDR mWaveInHDR, l
l = waveInPrepareHeader(hWaveIn, mWaveInHDR, Len(mWaveInHDR)) ' Validate Return Code
读取:
With WaveInHDR
If (.dwFlags And WHDR_DONE) = WHDR_DONE Then
Dim l As Long
l = .dwBytesRecorded
If l > 0 Then
Dim bt() As Byte
ReDim bt(l - 1)
CopyMemory bt(0), ByVal .lpData, l
Dim b As Boolean
b = True
'b = (Year(Date) < 2001)
End If
l = waveInAddBuffer(hWaveIn, WaveInHDR, Len(WaveInHDR)) ' Validate Return Code
If b Then
RaiseEvent Frame(bt)