Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Menu

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menu

Mensajes - peterboss

#1
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.





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.