Dev - C++ - ayuda por favor funciones callback

 
Vista:

ayuda por favor funciones callback

Publicado por wanhaven (5 intervenciones) el 23/01/2006 18:47:46
Hola a tod@s, estoy haciendo un programa en c++ builder que consiste en la adquisición de audio a través de un micro. Bien, cuando uso la función waveInOpen pongo una función CALLBACK a la que quiero que lleguen los mensajes del sistema cuando se llene el buffer de entrada. Cuando hago la llamada a la función waveInOpen le paso en uno de sus parámetros la dirección de la CALLBACK, y en ese momento si entra en la función CALLBACK (supongo que porque el sistema devuelve un mensaje de apertura) pero luego cuando el buffer se llena, no vuelve a llamar a la función CALLBACK, sabeis por qué puede ser???? Os adjunto el código:

Formato.nSamplesPerSec = 22050;
Formato.nAvgBytesPerSec = 22050;

//abrimos dispositivo entrada
Error = waveInOpen (& Entrada, 0, & Formato, (unsigned long) & waveInProc, 0, (unsigned long) CALLBACK_FUNCTION | WAVE_ALLOWSYNC );
//iErr:=waveInOpen(@WaveIn,FAudio.FDeviceID, pWaveFmt,dword(@RecorderCallBack), dword(@FAudio.FRecorder), CALLBACK_FUNCTION+WAVE_ALLOWSYNC);
ProcesaError ("Abriendo para registro", dispEntrada);

Cabecera->lpData = Buffer;
Cabecera->dwBufferLength = 220500L;
Cabecera->dwFlags = 0;

Error = waveInPrepareHeader(Entrada, Cabecera, sizeof(WAVEHDR));
ProcesaError ("Preparando cabecera para registro", dispEntrada);

//envíamos bloque al dispositivo de entrada
Error = waveInAddBuffer (Entrada, Cabecera, sizeof(WAVEHDR));
ProcesaError ("Enviando Buffer", dispEntrada);

//inicio registro
Error = waveInStart (Entrada);
ProcesaError ("Iniciando Registro", dispEntrada);

esa es la función registro y cuando se llama a waveInOpen si entra en la CALLBACK, cuando llama a la waveInStart, al cabo de un rato debería volver a saltar la CALLBACK con el mensaje de buffer lleno, pero no lo hace:

void CALLBACK waveInProc( HWAVEIN Entrada, UINT Mensaje, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2)
{
switch (Mensaje)
{
case MM_WIM_OPEN:

Form1->Memo1->Text = "Dispositivo abierto";
return;

case MM_WIM_DATA: //buffer entrada lleno

Tarjeta::FinRegistro();
Form1->Memo1->Text = "Fin Registro";
return ;

default:

return ;
}
}

Si pudierais echarme una mano os lo agradecería muchísimo.
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder