2011-05-09 7 views
5

Cuando se trabaja con la reproducción de audio que estoy acostumbrado a la siguiente distribución:¿Qué hilo usar para la decodificación de audio?

  • un disco (o red) hilo que lee datos desde el disco (o la red) y llena un buffer circular
  • un hilo de audio que lee datos del buffer circular, posiblemente realiza DSP, y escribe en hardware de audio (tirar o empujar API)

Esto funciona bien, y no hay ningún problema cuando se trabaja con, por ejemplo, un archivo WAV.

Ahora, si los datos de origen están codificados en un formato comprimido, como Vorbis o MP3, la decodificación lleva algo de tiempo.

Y parece que es bastante común realizar decodificación en el hilo de disco/red.

¿Pero no es este diseño incorrecto? Mientras que el disco o los bloques de acceso a la red, hay tiempo de CPU disponible para la decodificación, pero se desperdicia si la decodificación ocurre en el mismo hilo.

Me parece que si las redes se vuelven lentas, los riesgos de subutilización de memoria intermedia son mayores si la decodificación se realiza de forma secuencial.

Entonces, ¿no debería realizarse la decodificación en el hilo de audio?

En mi contexto, preferiría evitar agregar un hilo de descodificación dedicado. Es para plataformas móviles y SMP es bastante raro en este momento. Pero por favor, dígame si un hilo de descodificación dedicado realmente tiene sentido para usted.

Respuesta

2

Es más importante que el hilo de audio esté disponible para reproducir audio sin problemas que para el hilo de red para mantener un búfer de tamaño perfecto. Si solo está utilizando dos hilos, entonces la decodificación debe hacerse en el hilo de la red. Si tuviera que decodificar el hilo de reproducción, es posible que llegue el momento en que necesite enviar más audio al hardware, pero el hilo está ocupado decodificando. Es mejor si mantiene un búfer de audio decodificado.

Lo ideal sería utilizar tres hilos. Uno para leer la red, uno para decodificar y otro para jugar. En nuestra aplicación que maneja la captura de audio/video, la grabación y la transmisión, tenemos ocho hilos por transmisión (recientemente aumentado a partir de seis hilos desde que agregamos nueva funcionalidad recientemente). Es mucho más fácil para cada subproceso tener su propia funcionalidad y luego puede medir apropiadamente su desempeño contra aquellos de sus búferes entrantes/salientes. Esto también beneficia el perfilado y la optimización.

+0

Tiene razón, en el caso de 2 hilos, la decodificación debe realizarse en el hilo de la red. Me di cuenta después de escribir que dado que la decodificación de audio se basa en paquetes, puede bloquear durante un largo tiempo cada N ciclos de audio, y eso causará un xrun. Dicho esto, el hilo de decodificación dedicado se está volviendo cada vez más atractivo para mí, especialmente para transmisiones en red (o discos lentos/almacenamiento). – olivierg

2

Si su dispositivo tiene una sola CPU, todos los hilos lo están compartiendo. El intercambio de hilos del SO suele ser muy eficiente (no perderá ninguna potencia significativa de la CPU para el intercambio). Por lo tanto, debe crear más hilos si simplificará su lógica.

En su caso, hay una tubería. El hilo diferente para cada etapa de la tubería es un buen patrón. La alternativa, como usted nota, involucra lógica compleja, sincronizaciones, eventos, interrupciones, o lo que sea. A veces no hay buenas alternativas en absoluto.

Por lo tanto, mi sugerencia es crear un hilo dedicado para la decodificación de audio.

Si tiene más de una sola CPU, incluso obtendrá una mayor eficiencia al usar una sola cadena para cada paso de la tubería.

+0

He leído muchas veces que tener demasiados hilos puede ser pesado. Así que generalmente lo pienso dos veces antes de agregar un nuevo hilo, y aún más cuando trabajo en una plataforma móvil. No estoy seguro de que simplificar la lógica sea necesariamente una buena razón para agregar un hilo en la tubería. Pero en este contexto, un hilo de decodificación dedicado parece tener sentido. – olivierg

+0

Creo que cientos de hilos pueden ser un problema (aunque he usado 300 hilos en Windows sin ningún problema). Sin embargo, otros mecanismos/estrategias de sincronización también tienen su costo. Este costo puede ser mayor o menor, pero generalmente el efecto es pequeño. Si los subprocesos de canalización se implementan correctamente, la mayoría de las veces solo dormirán y esperarán a los eventos. –

Cuestiones relacionadas