unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, MMSystem, ComCtrls , MPlayer, Menus, Buttons, ExtCtrls, Gauges, WinSock;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure CheckAudio(Sender: TObject);
procedure StructFormat;
procedure OpenDevice;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
WOutCaps: TWAVEOUTCAPS;
wfx: TWAVEFORMATEX;
hEvent: THandle;
hwo: HWAVEOUT;
si: TSYSTEMINFO;
wh: array[0..1] of TWAVEHDR;
Buf: array[0..1] of PChar;
CnlBuf: array[0..1] of PChar;
implementation
{$R *.dfm}
//проверяем наличие аудиоустройства
procedure TForm1.CheckAudio(Sender: TObject);
begin
FillChar(WOutCaps, SizeOf(TWAVEOUTCAPS), #0);
if MMSYSERR_NOERROR <> WaveOutGetDevCaps(0, @WOutCaps, SizeOf(TWAVEOUTCAPS)) then
begin
ShowMessage('Error');
Exit;
end;
end;
//заканчиваем проверять наличие аудиоустройства
//заполняем структуру формата
procedure TForm1.StructFormat;
begin
FillChar(wfx, Sizeof(TWAVEFORMATEX), #0);
with wfx do
begin
wFormatTag:= WAVE_FORMAT_PCM;
nChannels:= 2;
nSamplesPerSec:= 44100;
wBitsPerSample:= 16;
nBlockAlign:= wBitsPerSample div 8 * nChannels;
nAvgBytesPerSec:= nSamplesPerSec * nBlockAlign;
cbSize:=0;
end;
end;
//заканчиваем заполнять структуру формата
//открываем устройство
procedure TForm1.OpenDevice;
begin
hEvent := CreateEvent(nil, false, false, nil);
if WaveOutOpen(@hwo, 0, @wfx, hEvent, 0, CALLBACK_EVENT) <> MMSYSERR_NOERROR then
begin
GetSystemInfo(si);
buf[0]:= VirtualAlloc(nil, ( BlockSize * 4)+ si.dwPageSize-1) div si.dwPagesize * si.dwPageSize, MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
buf[1]:= PChar(LongInt(Buf[1])+ BlockSize);
ChlBuf[0]:= PChar(LongInt(Buf[1]) + BlockSize);
ChlBuf[1]:= PChar(LongInt(CnlBuf[0]) + BlockSize div 2);
for I:= 0 to 1 do
begin
FillChar(wh[i], sizeof(TWAVEHDR), #0);
wh[i].lpData:= buf[i];
wh[i].dwBufferLength:= BlockSize;
waveOutPrepareHeader(hwo, @wh[i], sizeof(TWAVEHDR));
end;
Generator(CnlBuf[0], Typ[0], Freq[0], Lev[0], BlockSize div 2, tPred[0]);
Generator(CnlBuf[1], Typ[1], Freq[1], Lev[1], BlockSize div 2, tPred[1]);
Mix(buf[i], CnlBuf[0], CnlBuf[1], BlockSize div 2);
I:=0;
while not Terminated do
begin
waveOutWrite(hwo, @wh[i], sizeof(WAVEHDR));
WaitForSingleObject(hEvent, INFINITE);
I:=I xor 1;
Generator(CnlBuf[0], Typ[0], Freq[0], Lev[0], BlockSize div 2, tPred[0]);
Generator(CnlBuf[1], Typ[1], Freq[1], Lev[1], BlockSize div 2, tPred[1]);
Mix(buf[i], CnlBuf[0], CnlBuf[1], BlockSize div 2);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
OpenDevice;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
waveOutReset(hwo);
waveOutUnprepareHeader(hwo, @wh[0], sizeof(WAVEHDR));
waveOutUnprepareHeader(hwo, @wh[1], sizeof(WAVEHDR));
CloseHandle(hEvent);
end;
end.