Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на Delphi


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Чемпионы рейтинга экспертов в этой рассылке

Сарумян
Статус: Практикант
Рейтинг: 412
∙ повысить рейтинг >>
Тимошенко Дмитрий
Статус: Студент
Рейтинг: 296
∙ повысить рейтинг >>
Jimhucksly
Статус: 5-й класс
Рейтинг: 207
∙ повысить рейтинг >>

∙ / КОМПЬЮТЕРЫ И ПО / Языки программирования / Delphi

Выпуск № 1405 от 16.07.2009, 17:35
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 560, экспертов - 190
В номере: вопросов - 1, ответов - 1

Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
оценить выпуск >>

Вопрос № 170353: Имеется аудиопоток на микрофонном входе. Необходимо составить программу, которая через заданные промежутки времени (например через каждые 50 мс.) брала значение амплитуды аудиосигнала в данный момент времени и прописывала эти значения например в Rich...



Вопрос № 170353:

Имеется аудиопоток на микрофонном входе. Необходимо составить программу, которая через заданные промежутки времени (например через каждые 50 мс.) брала значение амплитуды аудиосигнала в данный момент времени и прописывала эти значения например в RichEdit.

Отправлен: 11.07.2009, 09:53
Вопрос задал: Phoenix707, Посетитель
Всего ответов: 1
Страница вопроса >>


Отвечает Евгений/Genia007/, Студент :
Здравствуйте, Phoenix707.
Могу предложить свой вариант решения данной задачи, возможно он Вам подойдёт.
Код:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, MMSystem, StdCtrls, ExtCtrls;

type
TData16 = array [0..127] of smallint;
PData16 = ^TData16;
TPointArr = array [0..127] of TPoint;
PPointArr = ^TPointArr;
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
RichEdit1: TRichEdit;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure OnWaveIn(var Msg: TMessage); message MM_WIM_DATA;
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

var
WaveIn: hWaveIn;
hBuf: THandle;
BufHead: TWaveHdr;
bufsize: integer;
p: PPointArr;
stop: boolean = false;
z: integer;

procedure TForm1.OnWaveIn;
var
data16: PData16;
begin
sleep(z); {выставляем промежутки времени}
data16 := PData16(PWaveHdr(Msg.lParam)^.lpData);
RichEdit1.Lines.Add(IntToStr(data16[0]));
if stop then
WaveInAddBuffer(WaveIn, PWaveHdr(Msg.lParam), SizeOf(TWaveHdr))
else
stop := true;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
header: TWaveFormatEx;
BufLen: word;
buf: pointer;
begin
z:= StrToInt(Edit1.Text);
RichEdit1.Clear;
BufSize := 1; { Размер буфера }
with header do
begin
wFormatTag := WAVE_FORMAT_PCM;< br> nChannels := 1; { количество каналов }
nSamplesPerSec := 22050; { частота }
wBitsPerSample := 16; { 8 / 16 бит }
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.Button2Click(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;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Button2.Click;
end;

end.
Сигнал снимается с микрофонного входа, промежутки времени для фиксации выставляются в Edit1, выводится результат в RichEdit1. При решении задачи использовались материалы сайта DelphiWorld.
-----
Помогли тебе, помоги и ты.

Ответ отправил: Евгений/Genia007/, Студент
Ответ отправлен: 11.07.2009, 16:12

Оценка ответа: 5

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 252075 на номер 1151 (Россия) | Еще номера >>
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке:
    оценить выпуск >>

    подать вопрос экспертам этой рассылки >>

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров >>

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2009, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.5 от 08.07.2009

    В избранное