procedure TForm1.OpenDevice;
var
BlockSize:dword;
ChlBuf :array of string;
i:integer;
Terminated :boolean;
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;