Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema de bloqueo de la tarjeta de sonido con dsound

Iniciado por peterboss, 28 de Abril de 2010, 12:23:47 PM

« anterior - próximo »

peterboss

Hola a todos.

Vereis, soy estudiante de Ingenieria Informatica y estoy haciendo mi proyecto de fin de carrera.

La cuestion es que necesito capturar audio a traves de la entrada de la tarjeta de sonido de mi ordenador. Estoy programando en C++ con tecnologia .Net mediante Visual Studio 2008 y uso la SDK de directX para poder trabajar con DirectSound. El proyecto es una aplicacion de consola.

El codigo que tengo compila y captura correctamente pero el problema es el siguiente:

Al ejecutar la aplicacion en modo release desde el entorno de desarrollo Visual Studio 2008, todo transcurre correctamente. He tomado tiempos para saber lo que tarda entre llamada y llamada a la captura de audio mediante el buffer de dsound y es del orden de 400 milisegundos. Este dato lo imprimo en pantalla y el programa no se queda "colgado" ni tiene parones ni nada, todo transcurre correctamente.

El problema viene al relizar la ejecucion mediante el archivo exe, es decir, sin ejecutar desde el entorno de desarrollo. En este caso el tiempo entre llamada y llamada pasa a ser de 25 milisegundos. El programa se bloquea cada X tiempo. Lo se porque la salida que va imprimiendo por consola se queda pausada durante varios segundos y luego continua y asi sucesivamente. El tiempo de pausa es aleatorio y suele ser de varios segundos.

Sospecho que las llamadas al metodo Read del buffer de captura son demasiado continuas y esto hace que la tarjeta al verse inundada de peticiones se bloquee.

Por favor, alguien experto en el tema de DirectX prodria decirme si estoy en lo cierto?? o en caso contrario intentar iluminarme un poco sobre lo que esta pasando??

Por si fuera de ayuda dejo una copia del codigo fuente.

void Audio_linea::Capturar_bandaSonora()
   {
   int readposition, writeposition;
   int init_read_position;

   Stream^ MemStream = gcnew MemoryStream();
   
   BufferDX::aux_entrelazado->Clear(BufferDX::aux_entrelazado,0,longitud_entrelazado);
   
   BufferDX::buffer->GetCurrentPosition(writeposition, readposition);

   init_read_position = readposition - longitud_entrelazado;
   if(init_read_position<0) init_read_position += longitud_buffer_dx;

   //El BufferDX::buffer almacena 2 segundos
   //Necesito coger 1segundo exactamente, por lo que miro la readposition y calculo donde debo
   //comenzar a leer.
   BufferDX::buffer->Read(init_read_position, MemStream, longitud_entrelazado, LockFlag::None);

   MemStream->Seek(0, SeekOrigin::Begin);
   MemStream->Read(BufferDX::aux_entrelazado, 0, longitud_entrelazado);

   MemStream->Close();

   for(int i=0; i<longitud_entrelazado; i++)
      entrelazado = BufferDX::aux_entrelazado;
   }
Muchas gracias de antemano.
Un saludo.

synchrnzr

Mmmm... igual es sólo que estoy un poco desactualizado, pero en mis tiempos había que bloquear los buffers con Lock() antes de leer o escribir en ellos, y desbloquearlos a continuación.

sync






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.