说说你们是怎么做的,我现在正在实现这个程序。不过还没有实现同时录音和播放。 用mmtools控件: procedure TForm1.WaveInStart(Sender: TObject); begin { set the stream size for max speed } MemStream.SetSize(wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime)); OutMemStream.SetSize(wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime)); MemStream.Position := 0; OutMemStream.Position := 0; BytesRecorded := 0; edit1.Text := IntToStr(MemStream.Size); btnRecord.Enabled := False; btnPlay.Enabled := False; btnStop.Enabled := True; end;{------------------------------------------------------------------------------} procedure TForm1.WaveInStop(Sender: TObject); begin WaveIn.Close; btnPlay.Enabled := True; btnRecord.Enabled := True; btnStop.Enabled := False; end;{------------------------------------------------------------------------------} procedure TForm1.WaveInBufferReady(Sender: TObject; lpWaveHdr: PWaveHdr); begin { we got new data from WaveIn, put it in the stream } MemStream.Write(lpWaveHdr^.lpData^, lpWaveHdr^.dwBytesRecorded); OutMemStream.Write(lpWaveHdr^.lpData^, lpWaveHdr^.dwBytesRecorded); //BytesRecorded := 0; edit2.Text := IntToStr(BytesRecorded); inc(BytesRecorded, lpWaveHdr^.dwBytesRecorded); //if (wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime) <= BytesRecorded + 2*WaveIn.BufferSize) then ///begin // self.Timer1.Enabled := True; //showmessage('OK'); //end; end;{------------------------------------------------------------------------------} procedure TForm1.WaveOutStart(Sender: TObject); begin btnRecord.Enabled := False; btnPlay.Enabled := False; btnStop.Enabled := True; end;{------------------------------------------------------------------------------} procedure TForm1.WaveOutStop(Sender: TObject); begin WaveOut.Close; btnPlay.Enabled := True; btnRecord.Enabled := True; btnStop.Enabled := False; end;{------------------------------------------------------------------------------} procedure TForm1.WaveOutBufferLoad(Sender: TObject; lpWaveHdr: PWaveHdr; var MoreBuffers: Boolean); var nBytes: Longint; begin { how many bytes do we need for this buffer } nBytes := lpWaveHdr^.dwBufferLength; { do we have enough data ? } if (BytesRecorded-BytesPlayed < nBytes) then nBytes := BytesRecorded-BytesPlayed; { WaveOut needs Data, get it from the stream } Move((PChar(OutMemStream.Memory)+BytesPlayed)^, lpWaveHdr^.lpData^,nBytes); { flag how many bytes we have loaded } lpWaveHdr^.dwBytesRecorded := nBytes; { and increase our counter } inc(BytesPlayed, nBytes); { flag if we have more data to play } MoreBuffers := BytesPlayed < BytesRecorded; edit2.Text := IntToStr(lpWaveHdr^.dwBufferLength); end;{------------------------------------------------------------------------------} procedure TForm1.btnRecordClick(Sender: TObject); begin { start recording } WaveIn.Start; WaveOut.PWaveFormat := WaveIn.PWaveFormat; end;
--------------------------------------------
这个讲的比较清楚,可惜---是VC的
请问mmtools的dll或ocx的接口那里能找到帮助,他提供的东西太丰富了
用mmtools控件:
procedure TForm1.WaveInStart(Sender: TObject);
begin
{ set the stream size for max speed } MemStream.SetSize(wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime));
OutMemStream.SetSize(wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime));
MemStream.Position := 0;
OutMemStream.Position := 0;
BytesRecorded := 0; edit1.Text := IntToStr(MemStream.Size);
btnRecord.Enabled := False;
btnPlay.Enabled := False;
btnStop.Enabled := True;
end;{------------------------------------------------------------------------------}
procedure TForm1.WaveInStop(Sender: TObject);
begin
WaveIn.Close;
btnPlay.Enabled := True;
btnRecord.Enabled := True;
btnStop.Enabled := False;
end;{------------------------------------------------------------------------------}
procedure TForm1.WaveInBufferReady(Sender: TObject; lpWaveHdr: PWaveHdr);
begin
{ we got new data from WaveIn, put it in the stream }
MemStream.Write(lpWaveHdr^.lpData^, lpWaveHdr^.dwBytesRecorded); OutMemStream.Write(lpWaveHdr^.lpData^, lpWaveHdr^.dwBytesRecorded);
//BytesRecorded := 0;
edit2.Text := IntToStr(BytesRecorded);
inc(BytesRecorded, lpWaveHdr^.dwBytesRecorded);
//if (wioTimeToBytes(WaveIn.PWaveFormat,WaveIn.MaxRecordTime) <= BytesRecorded + 2*WaveIn.BufferSize) then
///begin
// self.Timer1.Enabled := True;
//showmessage('OK');
//end;
end;{------------------------------------------------------------------------------}
procedure TForm1.WaveOutStart(Sender: TObject);
begin
btnRecord.Enabled := False;
btnPlay.Enabled := False;
btnStop.Enabled := True;
end;{------------------------------------------------------------------------------}
procedure TForm1.WaveOutStop(Sender: TObject);
begin
WaveOut.Close;
btnPlay.Enabled := True;
btnRecord.Enabled := True;
btnStop.Enabled := False;
end;{------------------------------------------------------------------------------}
procedure TForm1.WaveOutBufferLoad(Sender: TObject; lpWaveHdr: PWaveHdr; var MoreBuffers: Boolean);
var
nBytes: Longint;
begin
{ how many bytes do we need for this buffer }
nBytes := lpWaveHdr^.dwBufferLength; { do we have enough data ? }
if (BytesRecorded-BytesPlayed < nBytes) then
nBytes := BytesRecorded-BytesPlayed; { WaveOut needs Data, get it from the stream }
Move((PChar(OutMemStream.Memory)+BytesPlayed)^, lpWaveHdr^.lpData^,nBytes); { flag how many bytes we have loaded }
lpWaveHdr^.dwBytesRecorded := nBytes; { and increase our counter }
inc(BytesPlayed, nBytes); { flag if we have more data to play }
MoreBuffers := BytesPlayed < BytesRecorded;
edit2.Text := IntToStr(lpWaveHdr^.dwBufferLength);
end;{------------------------------------------------------------------------------}
procedure TForm1.btnRecordClick(Sender: TObject);
begin
{ start recording }
WaveIn.Start;
WaveOut.PWaveFormat := WaveIn.PWaveFormat;
end;