Ir al contenido



Foto

Detectar la intensidad de la señal del micrófono


  • Por favor identifícate para responder
5 respuestas en este tema

#1 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 junio 2011 - 09:39

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.

  • 0

#2 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.898 mensajes
  • LocationMadrid - España

Escrito 23 junio 2011 - 04:36

Quizás este ejemplo te de alguna pista:



delphi
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7.   Dialogs, MMSystem;
  8.  
  9. type
  10.   TForm1 = class(TForm)
  11.     procedure FormCreate(Sender: TObject);
  12.   private
  13.     WaveHdr: TWaveHdr;
  14.   protected
  15.     procedure OnWavein(var Message: TMessage); message MM_WIM_DATA;
  16.   public
  17.     { Public declarations }
  18.   end;
  19.  
  20. var
  21.   Form1: TForm1;
  22.  
  23. implementation
  24.  
  25. {$R *.dfm}
  26.  
  27. procedure TForm1.FormCreate(Sender: TObject);
  28. var
  29.   hWaveIn: Cardinal;
  30.   WaveFormatEx: TWaveFormatEx;
  31. begin
  32.   WaveFormatEx.wFormatTag:= 1;
  33.   WaveFormatEx.nChannels:= 1;
  34.   WaveFormatEx.nSamplesPerSec:= 8000;
  35.   WaveFormatEx.nAvgBytesPerSec:= 8000;
  36.   WaveFormatEx.nBlockAlign:= 1;
  37.   WaveFormatEx.wBitsPerSample:= 8;
  38.   WaveFormatEx.cbSize:= 0;
  39.   waveInOpen(@hWaveIn, WAVE_MAPPER, @WaveFormatEx, Handle, 0, CALLBACK_WINDOW);
  40.   WaveHdr.dwBufferLength := 1;
  41.   WaveHdr.lpData := Ptr(LocalAlloc(0, WaveHdr.dwBufferLength));
  42.   waveInPrepareHeader(hWaveIn, @WaveHdr, SizeOf(TWaveHdr));
  43.   waveInAddBuffer(hWaveIn, @WaveHdr, SizeOf(TWaveHdr));
  44.   waveInStart(hWaveIn);
  45. end;
  46.  
  47. procedure TForm1.OnWavein(var Message: TMessage);
  48. var
  49. lpWaveHdr: PWaveHdr;
  50. begin
  51.   lpWaveHdr := PWaveHdr(Message.lParam);
  52.  
  53.   // Disparar evento... Beep
  54.   if BYTE(lpWaveHdr.lpData^) > 200 then
  55.     windows.beep(1000, 100);
  56.  
  57.   waveInAddBuffer(Message.wParam, lpWaveHdr, SizeOf(TWaveHdr));
  58. end;
  59.  
  60. 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.
  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 23 junio 2011 - 04:46

Muchas gracias escafandra, lo probaré y comentaré. (y) (y)

Saludos

  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 24 junio 2011 - 06:55

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.

  • 0

#5 escafandra

escafandra

    Advanced Member

  • Moderadores
  • PipPipPip
  • 3.898 mensajes
  • LocationMadrid - España

Escrito 24 junio 2011 - 04:48

¿Te detecta bien la intensidad de señal?. Ya te comenté que lo probé con medios precarios...

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
  1. procedure TForm1.Timer1Timer(Sender: TObject);
  2. begin
  3.   WaveInEnable:= true;
  4.   //...........................
  5. end;
  6.  
  7. procedure TForm1.OnWavein(var Message: TMessage);
  8. var
  9. lpWaveHdr: PWaveHdr;
  10. begin
  11.   lpWaveHdr := PWaveHdr(Message.lParam);
  12.  
  13.   // Disparar evento... Beep
  14.   if (BYTE(lpWaveHdr.lpData^) > 200) and WaveInEnable  then
  15.     windows.beep(1000, 100);
  16.  
  17.   waveInAddBuffer(Message.wParam, lpWaveHdr, SizeOf(TWaveHdr));
  18. end;




Saludos.
  • 0

#6 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 junio 2011 - 07:44

Gracias por tu ayuda escafandra.  (y)
  • 0