Las rutinas de flujo de sonido son para reproducir sonidos digitales que son demasiado grandes para caber en la estructura SAMPLE, bien porque son ficheros enormes que quiere cargar en trozos según necesita los datos, o porque está haciendo algo inteligente como generar la onde del sonido en tiempo real.
AUDIOSTREAM *play_audio_stream(int len, bits, stereo, freq, vol, pan);
Esta función crea un nuevo flujo de audio y empieza a reproducirlo. El
parámetro len es el tamaño de cada búffer de transferencia (en samples),
que normalmente debería ser una potencia de 2 y cercana a 1k: búffers
más grandes son más eficientes y requieren menos actualizaciones, pero
hay un desfase mayor entre los datos que usted porporciona y los que se
están reproduciendo actualmente. El parametro bits debe ser 8 o 16, freq
es la frecuencia de muestreo de los datos, y los valores vol y pan usan
el el mismo rango 0-255, como las funciones normales de reproducción de
samples. Si quiere ajustar la frecuencia, el volumen o la panoramización
del flujo una vez se esté reproduciendo, puede usar las funciones normales
voice_*() con stream->voice como un parámetro. Los datos del sample estan
siempre en formato sin signo, con formas de onda en estéreo que consisten
en samples alternativos izquierda/derecha.
void stop_audio_stream(AUDIOSTREAM *stream);
Destruye un flujo de audio cuando no lo necesite más.
void *get_audio_stream_buffer(AUDIOSTREAM *stream);
Debe llamar este función a intervalos regulares mientras el flujo de
audio está siendo reproducido, para proveer el siguiente buffer de datos
del sample (cuanto más pequeño sea el tamaño del buffer del flujo, más
frecuentemente debe llamar esta función). Si devuelve NULL, el flujo
todavía está reproduciendo los datos y no debe hacer nada. Si devuelve un
valor, esa es la localización del próximo buffer a tocar, y debería
cargar el número apropiado de samples (tantos como especificó al crear
el flujo) a esa dirección, por ejemplo usando un fread() de un fichero.
Después de llenar el buffer con datos, llame free_audio_stream_buffer()
para indicar que los datos nuevos ahora son válidos. Fíjese que esta
función no debería ser llamada desde una función de temporizador.
void free_audio_stream_buffer(AUDIOSTREAM *stream);
Llame esta función después de que get_audio_stream_buffer() devuelva una
dirección que no sea NULL, para indicar que ya ha cargado un nuevo bloque
de samples en esa dirección y que los datos están listos para ser
reproducidos.