none
waveinproc ¡ el programa explota! RRS feed

  • Pregunta

  • Hola, he ido paso por paso como me especifica la documentación de microsoft:

    http://msdn.microsoft.com/en-us/library/ms925318.aspx

    Nota: todas las funciones han sido verificadas que no devuelven error.

    0º me creo una estructura Recurso

    typedef struct Recurso {
        HWAVEIN hwi;
        WAVEFORMATEX wfx;
        WAVEHDR whdr;
        CHAR wavBuffer[6400];
    }

    1º Bien eleigo el dispositivo

    2º me defino mi función callback con el siguiente código:
    static void CALLBACK waveInCallback(HWAVEIN hwi, UINT uMsg, DWORD dw, DWORD d1, DWORD d2) {
        Recurso *lochnd = (Recurso*)dw;
        WAVEHDR *pw;
        MMRESULT result;
        if (uMsg == WIM_DATA) {

            pwhdr = (WAVEHDR*)d1;   
            result = waveInAddBuffer(lochnd->hwi, pwhdr, sizeof(WAVEHDR));
           //nota result no da error, comprobado,simplemente el programa explota!!!
           //si leo me lee del buffer, el problema es que se queda como en bucle infinito y el programa explota.

        }else if(  uMsg == WIM_OPEN ){
            MessageBox("device open for record");
        }else if( uMsg == WIM_CLOSE ){
            MessageBox(" cerrado dispositivo")   
        }
    }

    3º abro el dispositivo con waveinopen
    //nota Recurso recurso,inicializado a 16 khz , 2 canales y PCM
    waveInOpen(&(recurso->hwi), recurso->wavedev, &(recurso->wfx), (DWORD)waveInCallback, 0 , CALLBACK_FUNCTION);

    4º llamo a 

    waveInPrepareHeader(recurso->hwi, &(recurso->whdr), sizeof(WAVEHDR) )

    5º llamo a

    waveInAddBuffer(recurso->hwi, &(recurso->whdr[0]), sizeof(WAVEHDR))

    6º llamo a

    waveInStart(recurso->hwi);

    todo comienza......

    ¡y el programa explota!

    Bien releyendo la especificación waveinproc, por lo visto

    deberia de tener o llamar a estas funciones con un semaforo

    Set_event , create_event y  WaitForSingleObject.

    me estado documentando un poco , y mas o menos se usarlas , pero no se si este es el camino correcto para mi solución y la verdad estoy harto de pegarme chocazos por mi pobre ignorancia.

    La verdad es que estoy empezando un poco con el api de windows  mi pregunta es.

    ¿como hacer para quitar esa "petardazo" que me da el programa (seguramente por un deadlock )  ?


    Muchas Gracias de antemano.

    Un saludo a tod@s


    viernes, 11 de diciembre de 2009 16:58

Respuestas

Todas las respuestas

  •         pwhdr = (WAVEHDR*)d1;   
            result = waveInAddBuffer(lochnd->hwi, pwhdr, sizeof(WAVEHDR));
           //nota result no da error, comprobado,simplemente el programa explota!!!
           //si leo me lee del buffer, el problema es que se queda como en bucle infinito y el programa explota.



    y si lo escribes así,

    if ((pwhdr->dwFlags & WHDR_DONE) == WHDR_DONE)
    {
    pwhdr->dwFlags = 0;   // limpias el flag antes de rebotárselo al driver

     ... = waveInAddBuffer(...);
    }

    tipicamente vos usarás varios búferes (al menos 2), para tener tiempo de procesar lo capturado.
    viernes, 11 de diciembre de 2009 18:15
  • Hola al final he descubierto como hacerlo, por si alguien tiene el mismo problema.

    muchas gracias al usuario  sopita , valoro mucho su ayuda, aunque creo que ese no era  el problema, ya que yo al usar un callback cuando llamo a waveinaddbuffer automaticamente cuando el buffer esta lleno me lo notifica el callback, con lo cual el uso de banderas no es necesario. ( o deberia no serlo)

    el programa sigue explotando


    nada a investigar se ha dicho ...., y si algunos de ustedes sabe como hacerlo o alguna idea o sugerencia, bienvenido sea.

    Muchas gracias.

    Un saludo.
    sábado, 12 de diciembre de 2009 1:30
  • pon un bloque __try/__except, habilita SEH en las opciones del proyecto, y captura la excepción. Al final del enlace tienes un ejemplo sobre cómo hacerlo:

    http://msdn.microsoft.com/en-us/library/s58ftw19.aspx


    Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    martes, 15 de diciembre de 2009 12:20
    Moderador