Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con microsilencios al intentar enlazar dos sonidos

Iniciado por Beyond, 01 de Diciembre de 2007, 07:53:44 PM

« anterior - próximo »

Beyond

Primero de todo contextualizo el problema.

Hemos estructurado los temas musicales del juego en estados para adaptar la música a la situación del juego, y a su vez hemos dividido cada estado en diversos loops de 6-8 segundos, para poder cambiar de estado con relativa rapidez. Por lo tanto el sistema funciona poniendo loop tras loop de un mismo estado, hasta que se produce un cambio del juego, entonces esperamos a la finalización del loop actual y lo enlazamos con el primer loop del siguiente estado.

Espero que con esto os hagáis una idea del funcionamiento. Ahora viene el problema, el cambio entre loop y loop produce un pequeño salto, que aun siendo muy pequeño es perceptible, por lo que rompe la continuidad de la canción. Son pocos milisegundos de silencio pero suficiente para hacerse notar.

Las librerías que estamos utilizando para gestionar el sonido son: libogg, libvorbis y OpenAL. Y los loops están en formato ogg, evidentemente.

Si alguno de vosotros tenéis idea de que puede ser o ya habéis sufrido este problema o alguno similar, os estaremos muy agradecidos con vuestros comentarios.
Xavi Sánchez
Evolution Dreams Studio
www.planetdelta.net
www.bombdisposalexpert.com

gdl

La verdad es que no tengo ni idea de porqué pasa esto. Teniendo una descompresión por medio puede ser cualquier cosa. Que le falte warming al descompresor, que no coincidan los bloques de descompresión y audio (y algo por ahí no lo solucione), que por ahí unos estados se pongan a cero y no deban, etc.

Ideas para solucionar esto:

Asegurate que la latencia del descompresor, si tiene, esté compensada (el warming). No he usado ogg así que no te puedo ayudar en esto.

Investiga si coinciden o no los bloques del reproductor y los bloques del descompresor. Si no coinciden, asegurate de que tu loop es mínimo común múltiplo de ambos bloques. No he usado OpenAL así que tampoco te puedo ayudar en esto.

En el peor de los casos:

En vez de cambiar de un loop a otro, empiezas a reproducir el segundo unos 200ms antes de que acabe el primero a volumen cero y les haces un crossfade.

Puede que haya algún pequeña perturbación en el ritmo, pero en principio será menos grave que un artefacto en las muestras.

H-K

¿Estáis reproduciendo la música por streaming o lo estáis cargando como buffers estáticos?
Si lo hacéis por streaming podéis hacer que el último buffer que use el primer loop sea usado también por el principio del siguiente loop, y luego seguir encolando lo que venga. O podéis tener preparados los buffers del siguiente loop y encolarlos antes de que termine de reproducir el anterior loop.
Otra solución es el crossfade como ha dicho gdl. Si puedes dar más detalles de cómo lo habéis hecho, quizás te pueda ayudar en condiciones :P
"It's not who I am underneath, but what I do that defines me"

Pogacha

Si usas por ejemplo DSound el microsilencio es inevitable, pero en un mixer donde tu pongas los datos solo tienes que ponerlos uno a continuacion del otro y si no te demoras en hacerlo como para que quede un buffer sin llenar entonces no hay tal silencio.
Saludos

Beyond

Merci por la ayuda.

De momento vamos a intentar un par de cosas con lo que habéis comentado. Si seguimos con problemas ya se pasará por el foro un compañero que está más puesto que yo en el tema para concretaros más todo.
Xavi Sánchez
Evolution Dreams Studio
www.planetdelta.net
www.bombdisposalexpert.com

Konde

Muy buenas!
Yo soy ese de quien os hablaba Beyond. Antes de nada gracias a los que habéis contestado.

Pues no hemos podido solucionarlo todavía... :(

- El tema está en que genera algún milisegundo de silencio al llamar a "alSourcePlay"  (los buffers y sources ya han sido llenados préviamente, así q no sé pq lo hace)

- ** Otro problema que me he encontrado es que con OpenAL no sé cómo obtener pq segundo va de reproducción, ni tp indicarle que reproduzca a partir de tal sec. He estado buscando información y no sé si soy muy tonto o qué pero no lo he encontrado. :|

- Tambien he probado de ir encadenando los loops con alSourceQueueBuffers, que lo hace sin espacios (ok) pero claro.... una vez lo inserto al haber finalizado la reproducción, al volver a dar a play comienza desde el principio de todo, que no interesa (sólo interesaría la parte que se ha insertado nueva)


En fin, seguiré probando alguna cosilla que me queda... pero espero que alguien me pueda ayudar antes de que termine desquiciao! ^_^

Muchas gracias!

synchrnzr

Citar- El tema está en que genera algún milisegundo de silencio al llamar a "alSourcePlay" (los buffers y sources ya han sido llenados préviamente, así q no sé pq lo hace)

Esa función llamará a otra función de la plataforma subyacente que sí tendrá retardo (por ejemplo, si llama a un Play() de un buffer de DirectSound, que en Windows es muy posible que esté implementado así, fijo que hay retardo) En ese caso, para hacerlo bien y sin chapuzas, lo que deberíais hacer es crear una fuente tipo streaming y rellenar vosotros los buffers. No sé exactamente cómo se hará en OpenAL porque no lo he tocado mucho, pero si os liáis, aquí estamos :)

sync

H-K

Konde, yo tengo bastante experiencia con OpenAL y creo que puedo ayudaros. Si quieres mándame un MP y ya hablamos.
"It's not who I am underneath, but what I do that defines me"

fjfnaranjo

En fin, no se si tendrá mucho que ver, pero haciendo un reproductor en Java para canciones de juegos RPG que implementase la posibilidad de definir loops en las mismas (para que se mantengan en reproducción lo que sea necesario), me encuentro con el mismo problema, o bien tengo silencios o bien glichs (esos sonidos tan desagradables cuando los buffers se vacían). He probado absolutamente todo, incluso redondeando los saltos a "frames", pero no consigo quitarme el maldito corte...

Creo que se producen cuando cojemos cualquier forma de onda y la ponemos a continuación de otra distinta, en fin, un lio. Como solución parcial se me ocurrió (e implemente de manera semisatisfactoria) un fade entre los dos segmentos. Osea, reducir gradualmente el sonido del final de loop mientras aumento gradualmente el sonido del principio del loop. Si os sirve de algo pues guay. Un apunte curioso, en que Metal Gear Solid 2: Sons of Liberty usa un sistema similar al que vosotros citais para pasar de la música de SNEAK a la de ALERT o FIGHTING, solo que utilizan samples intermedios y otras cosas variadas muy chulas (se puede observar con detalle en dvd extra de Metal Gear Solid: Substance). Probablemente usen un pequeño sistema de script para definir como se hacen las transiciones depende de en que parte de la canción estes y tal.

Mi ilusión era poder usar un sistema parecido para aprovechar las canciones del Never Winter Nights o el World of Warcraft mientras dirijo partidas de rol, para ambientar la sesión un poco, en fin, seguiré dándole vueltas. Si alguien conoce el problema (estoy usando las JavaSound y reproduciendo wavs por ahora) y me pega un toque al correo o por aquí se lo agradecería mucho.
fjfnaranjo.com - Creating entertainment - Creando entretenimiento
fjfnaranjo [4t] gm4il [d0t] c0m (mail y msn)






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.