Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





buffer dinámico con OpenAL

Iniciado por burb, 19 de Febrero de 2010, 11:51:27 AM

« anterior - próximo »

burb

Me gustaría poder actualizar un buffer que se reproduce de manera continuada en tiempo real y con la mínima latencia posible como hacía con DirectSound, para reproducir un sonido continuado. El caso es que no se si se podrá hacer también así con OAL o si hay que usar otra técnica.

Con DS se creaba un buffer dinámico,  y se podia actualizar mientras se reproducía en un loop, aunque siempre había que hacerlo unos milisegundos antes de que "llegase" la posición de reproducción, lo que le daba la inevitable latencia, pero era suficiente.

No tengo casi nada de experiencia con OAL, pero he intentado rellenar un buffer antes de empezarlo a reproducir, y no se puede una vez que se ha asociado a un source, se recibe un error.

¿Cómo se puede hacer?, había pensado en usar 2 microbuffers y mientras se reproduce uno actualizar el otro, pero tampoco estoy seguro de que sea correcto, ni se como hacerlo.

burb

Bueno, creo que ya sé cómo es, probaré hacerlo así, pero si alguien tiene algo que sugerir estupendo.

Citar
Queuing Buffers on a Source

To continuously stream audio from a source without interruption, buffer queuing is required.  To
use buffer queuing, the buffers and sources are generated in the normal way, but alSourcei is not
used to attach the buffers to the source.  Instead, the functions alSourceQueueBuffers and
alSourceUnqueueBuffers are used.  The program can attach a buffer or a set of buffers to a
source using alSourceQueueBuffers, and then call alSourcePlay on that source.  While the
source is playing, alSourceUnqueueBuffers can be called to remove buffers which have already
played.  Those buffers can then be filled with new data or discarded.  New or refilled buffers can
then be attached to the playing source using alSourceQueueBuffers.  As long as there is always
a new buffer to play in the queue, the source will continue to play.

H-K

Es exactamente así, con la cola de Buffers. Eres rápido, vaquero.  8)
"It's not who I am underneath, but what I do that defines me"

burb

Pues el caso es que estoy haciendo una prueba, intentando actualizar un buffer asignado a un source con alSourceQueueBuffers y que se reproduce correctamente una vez que he llenado de datos.

Para actualizarlo uso antes alSourceUnqueueBuffers que según parece hay que desasignarlo del source, pero al hacerlo me da el error de AL_INVALID_ENUM, cosa extraña porque para esa solo deberían dar estos:

Possible Error States
AL_INVALID_VALUE  At least one buffer can not be unqueued because it has not been processed yet.
AL_INVALID_NAME  The specified source name is not valid.
AL_INVALID_OPERATION  There is no current context.

A ver si alguien que haya usado streaming en OpenAL me puede explicar como debo hacerlo de manera correcta.

H-K

#4
Pues si me enseñas cómo lo estás haciendo, te podré decir qué es lo que puede estar fallando, porque a grandes rasgos lo que dices es lo que hay que hacer.

Por lo de los errores, la documentación está algo incompleta en algunos aspectos, con lo que no te extrañe que ese error no esté contemplado.
"It's not who I am underneath, but what I do that defines me"

burb

Gracias por la ayuda, ya creo que lo tengo controlado, pero he tenido que comerme la cabeza un montón de horas hasta que he ido solucionando todos los problemas y me he aclarado con el tema. Me ha venido bien el tutorial este: http://www.devmaster.net/articles/openal-tutorials/lesson8.php










Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.