| 
| 
 | Вопрос # 1 278/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!
 
 здравствуйте мне нужено доработать
 нижеприложенный пример пример
 чтения байтов с микрофона
 к примеру у меня нет литературы
 мне нужно чтобы данные
 были записаны в массив типа integer
 пажалуйста помогите.
 Приложение:Переключить в обычный режим     --------------------------------------------------------------------------------      CD-ROM ----------|     MIDI ------------|                     }unit Unit1; interface uses  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, ExtCtrls, ComCtrls, MMSystem, Buttons, CheckLst; type  TData8 = array [0..127] of byte;  PData8 = ^TData8;  TData16 = array [0..127] of smallint;  PData16 = ^TData16;  TPointArr = array [0..127] of TPoint;  PPointArr = ^TPointArr;  TForm1 = class(TForm)    SpeedButton1: TSpeedButton;    SpeedButton2: TSpeedButton;    TrackBar1: TTrackBar;    Image1: TImage;    CheckBox1: TCheckBox;    Image2: TImage;    procedure FormDestroy(Sender: TObject);    procedure CheckBox1Click(Sender: TObject);    procedure FormCreate(Sender: TObject);    procedure SpeedButton1Click(Sender: TObject);    procedure SpeedButton2Click(Sender: TObject);  private    { Private declarations }  public    procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;end; var  Form1: TForm1; implementation {$R *.DFM} var  WaveIn: hWaveIn;  hBuf: THandle;  BufHead: TWaveHdr;  bufsize,SD: integer;  Bits16: boolean;  p: PPointArr;  stop: boolean = false;  OCHKI:STRING; procedure TForm1.OnWaveIn;var  i: integer;  data8: PData8;  data16: PData16;  h: integer;  XScale, YScale: single;begin   IMAGE2.Canvas.Brush.Style:=bsClear;  IMAGE2.Canvas.Font.Size:=12;  IMAGE2.Canvas.Font.Name:='MSSANSSERIF';  SetTextColor(IMAGE2.canvas.handle, rgb(255, 0, 0));  SetBKmode(IMAGE2.canvas.handle, transparent);          h := IMAGE1.Height;   XScale := IMAGE1.Width / BufSize;  if Bits16 then  begin    data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);    YScale := h / (1 shl 16);    for i := 0 to BufSize - 1 do      p^[i] := Point(round(i * XScale),    round(h / 2 - data16^[i] * YScale));   OCHKI:=INTTOSTR(data16^[i]);    end  else  begin    Data8 := PData8(PWaveHdr(Msg.lParam)^.lpData);    YScale := h / (1 shl 8);    for i := 0 to BufSize - 1 do      p^[i] := Point(round(i * XScale),    round(h - data8^[i] * YScale));  OCHKI:=INTTOSTR(data8^[i]);    end;   with IMAGE1.Canvas do  begin    Brush.Color := clWhite;    FillRect(ClipRect);    Polyline(Slice(p^, BufSize));   end;    {}    if stop then    WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam), SizeOf(TWaveHdr))  else    stop := true;end; procedure TForm1.FormDestroy(Sender: TObject);begin//  Button2.Click;end; procedure TForm1.CheckBox1Click(Sender: TObject);begin  if stop then  begin //   Button2.Click;   // Button1.Click;  end;end; procedure TForm1.FormCreate(Sender: TObject);begin  TrackBar1.OnChange := CheckBox1Click;  SPEEDButton1.Caption := 'Start';  SPEEDButton2.Caption := 'Stop';  CheckBox1.Caption := '16 / 8 bit';end; procedure TForm1.SpeedButton1Click(Sender: TObject);var  header: TWaveFormatEx;  BufLen: word;  buf: pointer;begin   Bits16 := CheckBox1.Checked;  with header do  begin    wFormatTag := WAVE_FORMAT_PCM;       nBlockAlign := nChannels * (wBitsPerSample div 8);    nAvgBytesPerSec := nSamplesPerSec * nBlockAlign;    cbSize := 0;  end;  WaveInOpen(Addr(WaveIn), WAVE_MAPPER, addr(header),  Form1.Handle, 0, CALLBACK_WINDOW);  BufLen := header.nBlockAlign * BufSize;  hBuf := GlobalAlloc(GMEM_MOVEABLE and GMEM_SHARE, BufLen);  Buf := GlobalLock(hBuf);  with BufHead do  begin    lpData := Buf;    dwBufferLength := BufLen;    dwFlags := WHDR_BEGINLOOP;  end;  WaveInPrepareHeader(WaveIn, Addr(BufHead), sizeof(BufHead));  WaveInAddBuffer(WaveIn, addr(BufHead), sizeof(BufHead));  GetMem(p, BufSize * sizeof(TPoint));  stop := true;  WaveInStart(WaveIn); end; procedure TForm1.SpeedButton2Click(Sender: TObject); begin  if stop = false then    Exit;  stop := false;  while not stop do    Application.ProcessMessages;  stop := false;  WaveInReset(WaveIn);  WaveInUnPrepareHeader(WaveIn, addr(BufHead), sizeof(BufHead));  WaveInClose(WaveIn);  GlobalUnlock(hBuf);  GlobalFree(hBuf);  FreeMem(p, BufSize * sizeof(TPoint)); end; end.      
|  |   Вопрос задал: Дмитрий-1648 (статус: Посетитель)Вопрос отправлен: 21 января 2008, 21:13
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Вадим К Здравствуйте, ДМИТРИЙ!Вот здесь http://www.torry.net/vcl/mmedia/audio/acmcomponents16.zip можно скачать абсолюно бесплатно набор компонент, которые вам точно помогут. один с компонентов, входящих в набор, умеет принимать звук с разных устройств ввода и генерирует событие, когда внутренний буфер, являющийся массивом целых чисел, заполняеться. А с ним можно делать, всё что хотите. Примеры естественно прилагаются (передача звука по сети:))
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 22 января 2008, 09:39
 
 |  
 Мини-форум вопросаМини-форум пуст. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |