Выпуск № 1405 от 16.07.2009, 17:35
Администратор рассылки: Калашников О.А., Руководитель
В рассылке: подписчиков - 560, экспертов - 190
В номере: вопросов - 1, ответов - 1
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
Вопрос № 170353: Имеется аудиопоток на микрофонном входе. Необходимо составить программу, которая через заданные промежутки времени (например через каждые 50 мс.) брала значение амплитуды аудиосигнала в данный момент времени и прописывала эти значения например в Rich...
Вопрос № 170353:
Имеется аудиопоток на микрофонном входе. Необходимо составить программу, которая через заданные промежутки времени (например через каждые 50 мс.) брала значение амплитуды аудиосигнала в данный момент времени и прописывала эти значения например в RichEdit.
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 (Россия) |
Еще номера >>
Вам помогли? Пожалуйста, поблагодарите эксперта за это!
Нам очень важно Ваше мнение об этом выпуске рассылки. Вы можете оценить этот выпуск по пятибалльной шкале, пройдя по ссылке: оценить выпуск >>
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.