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 curva del sonido en tiempo real.
AUDIOSTREAM *play_audio_stream(int len, bits, freq, vol, pan);
Esta función crea un nuevo flujo de audio y comienza a reproducirlo. len
es el tamaño de cada buffer de transferencia (en samples), que debería
ser de al menos 2k: buffers más grandes son más eficientes y requieren
menos actualizaciones, pero resultan en un desfase mayor entre los datos
que suministras y los que realmente están siendo reproducidos. El
parámetro bits debe ser 8 o 16, freq es la frecuencia de los datos, y vol
y pan son los mismos valores 0-255 que en las funciones regulares de
reproducción de samples. Su quiere modificar la frecuencia, el volumen, o
la panoramización del flujo una vez está siendo reproducido, puede usar
las funciones normales voice_*() con stream->voice como parámetro. Los
datos siempre están en formato sin signo, siendo las ondas estéreo una
alternación contínua de samples para los canales 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.