Hola compañeros, estoy desarrollando una pequeña aplicación que graba clips de sonido, necesito que el procedimiento "Grabar" (que ya está listo) se ejectute solo cuando haya cierta intensidad de sonido (cuando el lector habla) y que el procedimiento "Detener" se ejecute cuando la intensidad baja (cuando el lector se calla). Espero se entienda.
Gracias de antemano.
Saludos.

Detectar la intensidad de la señal del micrófono
Started by
Wilson
, Jun 23 2011 09:39 AM
5 replies to this topic
#1
Posted 23 June 2011 - 09:39 AM
#2
Posted 23 June 2011 - 04:36 PM
Quizás este ejemplo te de alguna pista:
Este código emite un Beep cuando la señas sobrepasa de cierto valor.
He realizado alguna prueba con un micrófono muy malo y que no funciona bien, aún así dispara el Beep.
Puede ser una forma de empezar...
Saludos.
delphi
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, MMSystem; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private WaveHdr: TWaveHdr; protected procedure OnWavein(var Message: TMessage); message MM_WIM_DATA; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); var hWaveIn: Cardinal; WaveFormatEx: TWaveFormatEx; begin WaveFormatEx.wFormatTag:= 1; WaveFormatEx.nChannels:= 1; WaveFormatEx.nSamplesPerSec:= 8000; WaveFormatEx.nAvgBytesPerSec:= 8000; WaveFormatEx.nBlockAlign:= 1; WaveFormatEx.wBitsPerSample:= 8; WaveFormatEx.cbSize:= 0; waveInOpen(@hWaveIn, WAVE_MAPPER, @WaveFormatEx, Handle, 0, CALLBACK_WINDOW); WaveHdr.dwBufferLength := 1; WaveHdr.lpData := Ptr(LocalAlloc(0, WaveHdr.dwBufferLength)); waveInPrepareHeader(hWaveIn, @WaveHdr, SizeOf(TWaveHdr)); waveInAddBuffer(hWaveIn, @WaveHdr, SizeOf(TWaveHdr)); waveInStart(hWaveIn); end; procedure TForm1.OnWavein(var Message: TMessage); var lpWaveHdr: PWaveHdr; begin lpWaveHdr := PWaveHdr(Message.lParam); // Disparar evento... Beep if BYTE(lpWaveHdr.lpData^) > 200 then windows.beep(1000, 100); waveInAddBuffer(Message.wParam, lpWaveHdr, SizeOf(TWaveHdr)); end; end.
Este código emite un Beep cuando la señas sobrepasa de cierto valor.
He realizado alguna prueba con un micrófono muy malo y que no funciona bien, aún así dispara el Beep.
Puede ser una forma de empezar...
Saludos.
#3
Posted 23 June 2011 - 04:46 PM
Muchas gracias escafandra, lo probaré y comentaré.
Saludos


Saludos
#4
Posted 24 June 2011 - 06:55 AM
escafandra, yo necesito que la detección de la señal se active cuando habilite un timer, ¿Qué código debo colocar en el evento OnTimer para activar la detección?
Gracias de antemano.
Gracias de antemano.
#5
Posted 24 June 2011 - 04:48 PM
¿Te detecta bien la intensidad de señal?. Ya te comenté que lo probé con medios precarios...
Haber si te entiendo. Quieres que tras activar un Timer, en el evento OnTimer se de permiso para que se pueda detectar la señal...
Bueno, en ese caso coloca una bandera:
Saludos.
escafandra, yo necesito que la detección de la señal se active cuando habilite un timer, ¿Qué código debo colocar en el evento OnTimer para activar la detección?
Haber si te entiendo. Quieres que tras activar un Timer, en el evento OnTimer se de permiso para que se pueda detectar la señal...
Bueno, en ese caso coloca una bandera:
delphi
procedure TForm1.Timer1Timer(Sender: TObject); begin WaveInEnable:= true; //........................... end; procedure TForm1.OnWavein(var Message: TMessage); var lpWaveHdr: PWaveHdr; begin lpWaveHdr := PWaveHdr(Message.lParam); // Disparar evento... Beep if (BYTE(lpWaveHdr.lpData^) > 200) and WaveInEnable then windows.beep(1000, 100); waveInAddBuffer(Message.wParam, lpWaveHdr, SizeOf(TWaveHdr)); end;
Saludos.
#6
Posted 27 June 2011 - 07:44 AM
Gracias por tu ayuda escafandra.
