Unit1; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TForm1 = (TForm) Button1: TButton; Button2: TButton; Button3: TButton; FormCreate(Sender: TObject); Button1Click(Sender: TObject); Button2Click(Sender: TObject); Button3Click(Sender: TObject); WndProc( m: TMessage); ; ; Form1: TForm1; MMSystem; whIn1,whIn2, whOut: TWaveHdr; hWaveIn,hWaveOut: HWAVE; fmt: TWaveFormatEx; buf1,buf2,SaveBuf: TBytes; TForm1.FormCreate(Sender: TObject); Button1.Caption := ; Button2.Caption := ; Button3.Caption := ; ; TForm1.Button1Click(Sender: TObject); fmt.wFormatTag := WAVE_FORMAT_PCM; fmt.nChannels := ; fmt.nSamplesPerSec := ; fmt.nAvgBytesPerSec := ; fmt.nBlockAlign := ; fmt.wBitsPerSample := ; fmt.cbSize := ; SaveBuf := ; waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, Handle, , CALLBACK_WINDOW) = SetLength(buf1, *); SetLength(buf2, *); whIn1.lpData := PAnsiChar(buf1); whIn1.dwBufferLength := Length(buf1); whIn1.dwBytesRecorded := ; whIn1.dwUser := ; whIn1.dwFlags := ; whIn1.dwLoops := ; whIn1.lpNext := ; whIn1.reserved := ; whIn2.lpData := PAnsiChar(buf2); whIn2.dwBufferLength := Length(buf2); whIn2.dwBytesRecorded := ; whIn2.dwUser := ; whIn2.dwFlags := ; whIn2.dwLoops := ; whIn2.lpNext := ; whIn2.reserved := ; waveInPrepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInPrepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInAddBuffer(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInAddBuffer(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInStart(hWaveIn); ; ; TForm1.Button2Click(Sender: TObject); waveInStop(hWaveIn); waveInUnprepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInUnprepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInClose(hWaveIn); ; TForm1.Button3Click(Sender: TObject); whOut.lpData := PAnsiChar(SaveBuf); whOut.dwBufferLength := Length(SaveBuf); whOut.dwBytesRecorded := ; whOut.dwUser := ; whOut.dwFlags := ; whOut.dwLoops := ; whOut.lpNext := ; whOut.reserved := ; waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, Handle, , CALLBACK_WINDOW); waveOutPrepareHeader(hWaveOut, @whOut, SizeOf(TWaveHdr)); waveOutWrite(hWaveOut, @whOut, SizeOf(TWaveHdr)); ; TForm1.WndProc( m: TMessage); ordLen: Integer; ; m.Msg MM_WIM_OPEN: ; MM_WIM_CLOSE: ; MM_WIM_DATA: ordLen := Length(SaveBuf); SetLength(SaveBuf, ordLen + PWaveHdr(m.LParam).dwBytesRecorded); CopyMemory(Ptr(DWORD(SaveBuf)+ordLen), PWaveHdr(m.LParam).lpData, PWaveHdr(m.LParam).dwBytesRecorded); waveInAddBuffer(hWaveIn, PWaveHdr(m.LParam), SizeOf(TWaveHdr)); ; MM_WOM_OPEN: ; MM_WOM_CLOSE: ; MM_WOM_DONE: waveOutUnprepareHeader(hWaveOut, PWaveHdr(m.LParam), SizeOf(TWaveHdr)); waveOutClose(hWaveOut); ; ; ; .
使用回调函数处理音频设备发出的消息:
Unit1; Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; TForm1 = (TForm) Button1: TButton; Button2: TButton; Button3: TButton; FormCreate(Sender: TObject); Button1Click(Sender: TObject); Button2Click(Sender: TObject); Button3Click(Sender: TObject); ; Form1: TForm1; MMSystem; whIn1,whIn2, whOut: TWaveHdr; hWaveIn,hWaveOut: HWAVE; fmt: TWaveFormatEx; buf1,buf2,SaveBuf: TBytes; WaveProc(hWave: HWAVE; uMsg, dwInstance, dwParam1, dwParam2: DWORD); ; ordLen: Integer; uMsg MM_WIM_OPEN: ; MM_WIM_CLOSE: ; MM_WIM_DATA: ordLen := Length(SaveBuf); SetLength(SaveBuf, ordLen + PWaveHdr(dwParam1).dwBytesRecorded); CopyMemory(Ptr(DWORD(SaveBuf)+ordLen), PWaveHdr(dwParam1).lpData, PWaveHdr(dwParam1).dwBytesRecorded); waveInAddBuffer(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr)); ; MM_WOM_OPEN: ; MM_WOM_CLOSE: ; MM_WOM_DONE: waveOutUnprepareHeader(hWave, PWaveHdr(dwParam1), SizeOf(TWaveHdr)); waveOutClose(hWave); ; ; ; TForm1.FormCreate(Sender: TObject); Button1.Caption := ; Button2.Caption := ; Button3.Caption := ; ; TForm1.Button1Click(Sender: TObject); fmt.wFormatTag := WAVE_FORMAT_PCM; fmt.nChannels := ; fmt.nSamplesPerSec := ; fmt.nAvgBytesPerSec := ; fmt.nBlockAlign := ; fmt.wBitsPerSample := ; fmt.cbSize := ; SaveBuf := ; waveInOpen(@hWaveIn, WAVE_MAPPER, @fmt, DWORD(@WaveProc), , CALLBACK_FUNCTION) = SetLength(buf1, *); SetLength(buf2, *); whIn1.lpData := PAnsiChar(buf1); whIn1.dwBufferLength := Length(buf1); whIn1.dwBytesRecorded := ; whIn1.dwUser := ; whIn1.dwFlags := ; whIn1.dwLoops := ; whIn1.lpNext := ; whIn1.reserved := ; whIn2.lpData := PAnsiChar(buf2); whIn2.dwBufferLength := Length(buf2); whIn2.dwBytesRecorded := ; whIn2.dwUser := ; whIn2.dwFlags := ; whIn2.dwLoops := ; whIn2.lpNext := ; whIn2.reserved := ; waveInPrepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInPrepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInAddBuffer(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInAddBuffer(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInStart(hWaveIn); ; ; TForm1.Button2Click(Sender: TObject); waveInStop(hWaveIn); waveInUnprepareHeader(hWaveIn, @whIn1, SizeOf(TWaveHdr)); waveInUnprepareHeader(hWaveIn, @whIn2, SizeOf(TWaveHdr)); waveInClose(hWaveIn); ; TForm1.Button3Click(Sender: TObject); whOut.lpData := PAnsiChar(SaveBuf); whOut.dwBufferLength := Length(SaveBuf); whOut.dwBytesRecorded := ; whOut.dwUser := ; whOut.dwFlags := ; whOut.dwLoops := ; whOut.lpNext := ; whOut.reserved := ; waveOutOpen(@hWaveOut, WAVE_MAPPER, @fmt, DWORD(@WaveProc), , CALLBACK_FUNCTION); waveOutPrepareHeader(hWaveOut, @whOut, SizeOf(TWaveHdr)); waveOutWrite(hWaveOut, @whOut, SizeOf(TWaveHdr)); ; .