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.