|
Вопрос # 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
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|