Carga de archivos de audio multi-muestra de gran tamaño en la memoria para la reproducción - la manera de evitar la congelación temporal

StackOverflow https://stackoverflow.com/questions/2373094

Pregunta

Estoy escribiendo una aplicación necesita utilizar grandes de audio multi-muestras, por lo general alrededor de 50 MB de tamaño. Un archivo contiene aproximadamente 80 grabaciones de sonido individuales corta, que puede conseguir reproducir en mi solicitud en cualquier momento. Por esta razón, todos los datos de audio se carga en memoria para un acceso rápido.

Sin embargo, cuando uno carga de estos archivos, puede tardar muchos segundos para poner en la memoria, lo que significa mi programa si se congela temporalmente. ¿Qué es una buena manera de evitar que esto ocurra? Debe ser compatible con Windows y OS X. Se congela a esto:. myMultiSampleClass->open(); que tiene que hacer un montón de asignación dinámica de memoria y la lectura del archivo usando ifstream

He pensado en dos opciones posibles:

  1. Abrir el archivo y cargarlo en la memoria en otro hilo por lo que mi proceso de solicitud no se congela. He mirado en la biblioteca Boost hacer esto, pero hay que hacer un buen montón de lectura antes de que esté listo para aplicar. Todo lo que tendría que hacer es llamar a la función open () en el hilo luego destruir el hilo después.

  2. Vamos con un plan para asegurarse de que no cargue el archivo en la memoria en un momento dado, sólo se carga sobre la marcha por así decirlo. El problema es cualquier muestra podría ser activado en cualquier momento. Sé que algún otro software tiene este tipo de sistema en el lugar, pero no estoy seguro de cómo funciona. Depende en gran medida de las especificaciones del ordenador individuales, podría funcionar muy bien en mi equipo, pero alguien con un disco duro / memoria lenta podría ser muy malos resultados. Una idea que tenía era de carga x muestras de cada grabación de audio en la memoria, entonces si tengo que jugar, iniciar la reproducción de las muestras ya existentes mientras se carga el resto del audio en la memoria.

Todas las ideas o críticas? Gracias de antemano: -)

¿Fue útil?

Solución

I como solución al 1 como un primer intento -. Simple y al punto

Si está en Windows, puede hacer las operaciones de archivos asincrónica - lo que ellos llaman OVERLAPPED -. para decirle al sistema operativo para cargar un archivo y hacerle saber cuando está listo

Otros consejos

Utilice un de memoria archivo asignado. El tiempo de carga es inicialmente "instantánea", y la sobrecarga de I / O será propagación en el tiempo.

i que la mejor solución es cargar un pequeño trozo o muestra individual de datos de onda en un momento durante la reproducción usando asíncrono I / O (como se mencionó John Dibling) a un tamaño fijo de tampón de reproducción.

la estrategia será la primera llenar el búfer de reproducción entonces el juego (esto añadirá pequeño retraso, pero garantiza la reproducción continua), mientras se reproduce el búfer, se puede volver a llenar otro búfer de reproducción de hilo diferente (solapado), al menos es necesario tener dos búfer de reproducción, una para jugar y otro para la recarga en el fondo, y luego cambiar en tiempo real

más adelante se puede establecer cuán grande es el tamaño del búfer de reproducción basado en el rendimiento del PC cliente (que será el comercio entre el tamaño de la memoria y potencia de procesamiento, CPU más rápida requerirá búfer menor demora por lo tanto inferior).

Es posible que desee considerar un enfoque href="http://en.wikipedia.org/wiki/Producer-consumer_problem" rel="nofollow noreferrer"> productor-consumidor

El lector de datos es el productor, y la transmisión de los datos a la tarjeta de sonido es el consumidor. Es necesario alta de agua y líneas de bajamar de modo que, si el búfer se llena, el productor deja de leer, y si el buffer está baja, el productor comienza a leer de nuevo.

A C ++ productor-consumidor de concurrencia Template Library
http://www.bayimage.com/code/pcpaper.html

EDIT: Debo añadir que este tipo de cosas es difícil. Si usted está construyendo un reproductor de muestras, la carga en el sistema varía continuamente en función de los cuales se están jugando las llaves, el número de sonidos están jugando a la vez, el tiempo que la duración de cada sonido es, si se presiona el pedal de resonancia, y otros factores tales como la velocidad de disco duro y tampón, y la cantidad de caballos de fuerza procesador disponible. Algunas optimizaciones de programación que finalmente se emplean no ser evidente a primera vista.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top