Показать сообщение отдельно
  #5  
Старый 19.09.2009, 22:46
Аватар для grigory
grigory grigory вне форума
Прохожий
 
Регистрация: 14.09.2009
Сообщения: 17
Репутация: 11
По умолчанию

Код:
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.

Нашел код. Решил воплотить в жизнь, а не работает. Всё что знал, всё подключил.
Ответить с цитированием