2011-12-06 23 views
16

Creé una aplicación simple que genera una onda cuadrada de frecuencia determinada y la reproduce usando AudioTrack en modo STREAM (STREAM_MUSIC). Todo parece estar funcionando bien y el sonido se reproduce bien, sin embargo, cuando la corriente está terminado recibo mensajes en el registro:Reinicio de AudioTrack incluso después de detenerlo

W/AudioTrack (7579): obtainBuffer() pista 0x14c228 discapacitados, reiniciando ...

Incluso después de llamar a la función stop() todavía los obtengo. Creo que configuré correctamente el tamaño del búfer de AudioTrack, en función del tamaño mínimo requerido por AudioTrack (en mi caso, 6x1024). Lo alimento con pequeños amortiguadores de 1024 pantalones cortos.

¿Está bien que los obtenga y debería dejarlo así?

Respuesta

15

Bien, creo que el problema está resuelto. El error se genera cuando el buffer no está completamente lleno de datos a tiempo (underrun del buffer). No tengo idea de lo que es el tiempo de espera, pero si experimenta este asegúrese de que:

  1. no se llama el método de reproducción hasta que tenga algunos datos en el búfer.

  2. Puede generar los datos lo suficientemente rápido como para superar el tiempo de espera.

  3. Una vez que haya terminado de alimentar el búfer con los datos, antes de llamar al método stop(), asegúrese de que el "último" búfer estaba completamente lleno de datos antes del tiempo de espera.

que se ocupó de la edición pasada por siempre a la espera de una función poco (hasta el tiempo de espera), entonces el envío de 1 buffer lleno de ceros y finalmente llamar a la parada().

Tenga en cuenta que siempre debe enviar el búfer en trozos más pequeños, incluso si tiene listo el gran fragmento. Todavía me molesta un poco que no estoy 100% seguro si ese es el camino correcto, pero los errores se han ido, así que creo que puedo vivir con eso :)

5

He encontrado que incluso cuando el buffer es técnicamente lo suficiente, y lleno de bytes, si no están formateados correctamente (audio cortos convertidos a una matriz de bytes) todavía le arrojará ese error.

4

Recibí esa advertencia cuando instalé el Audiotrack, llamado audioTrack.play() y hubo un ligero retraso entre la llamada play() y audioTrack.write(). Si llamé al play() justo antes de write(), la advertencia desapareció.

+0

Ese es el punto - llenar el buffer con los datos antes de llamar a juego. Luego asegúrate de que puedes generar los datos a tiempo. Tendrás latencia y depende de tu teléfono (tamaño de búfer mínimo), frecuencia de muestreo y resolución dinámica que usas. Soy mi caso (HTC Desire) 6kB. Esto es alrededor de 3000 muestras de 16 bits mono. Puede calcular fácilmente la latencia resultante teniendo en cuenta la frecuencia de muestreo. Si usas la API de audio nativa, puedes obtener latencias mucho más pequeñas, pero lejos de los 5 millones de iPhone ... –

0

He resuelto por esta

 if (mAudioTrack.getPlayState()!=AudioTrack.PLAYSTATE_PLAYING) 
      mAudioTrack.play(); 
     mAudioTrack.write(b, 0, sz * 2); 
     mAudioTrack.stop(); 
     mAudioTrack.flush(); 
Cuestiones relacionadas