Como hacéis un loop con una canción CDDA?

Started by Ryo Suzuki, September 01, 2016, 01:27:19 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Ryo Suzuki

Pues eso, que llevo un buen rato dandole vueltas a esto que pensé que sería realmente sencillo.

Lo que quiero hacer es que la pista de audio que estoy reproduciendo desde el CD sea eterna en un loop para que la música nunca se detenga aunque llegue al final de la canción.

Estaba usando dentro de un while:

(cd_status(0) == CD_STOPPED or  cd_status(0) == CD_PAUSED) 

entonces volvía a reproducir la pista pista de CDDA si esta condición se cumplía. Estaba confiado de que funcionaría cuando me he dado cuenta que no va. La pista llega al final y no vuelve a reproducirse de nuevo.

Tras darle varias vueltas con condicionales y bucles, haciendolo al contrario con CD_PLAYING y elses y demás y preguntándome porqué diablos no iba me ha dado por printar en screen el status del cdrom...

Resulta que siempre es 2, que es CD_PLAYING. Con lo que claro, aunque acabe de reproducir la canción y esté en silencio para Bennu siempre cree que continua haciéndolo con lo que no puedo mandarle que vuelva a reproducirla de nuevo para entrar en bucle eterno, que es lo que pretendo.

¿Qué estoy haciendo mal? Porque estoy casi seguro que esto es posible, reproducir una CDDA track en loop infinito hasta que lo paremos con cd_stop o reprouciendo otra canción...

Gracias, un saludo.

panreyes

Hace muchos años yo usaba IS_PLAYING_CD().

Ahora, desaconsejo el uso de CD en extremo xD
Sobre todo, no sé si estará corregido o no, pero en su momento no era posible leer datos del CD mientras estaba reproduciéndose la música.

Ryo Suzuki

Comprendo. No lo hago por gusto, es que estoy haciendo un pequeño proyecto para la Dreamcast y no puede bien con los oggs así que la mejor forma de tener música de fondo sin que consuma recursos es audio tracks...

He seguido probando y no hay forma humana que yo sepa, ya que estoy en el callejón sin salida que para BennuGD parece estar siempre reproduciendo una canción aunque la misma haya acabado y reine un silencio sepulcral...

¿A qué te refieres con IS_PLAYING_CD()? Qué sintaxis debo usar? (si es el cd status de CD_PLAYING, no sirve, como comentaba)

Por cierto lo de leer algunos assets aunque esté sonando la música sí que parece funcionar bien tanto en PC como en DC :)

A ver si me podéis echar un cable. Gracias!!

P.D: Estoy pensando a las malas una chapuza gorda de implementar un temporizador y sabiendo lo que dura la pista mandarle cd play de nuevo cuando acabe, pero tampoco sé hacerlo, creo...


panreyes

Vale, is_playing_cd() es la versión de Fénix. En BennuGD es cd_status y cd_playing. Si no te funciona, es porque está roto en Dreamcast.

Te tocará hacer usar un timer y cambiar la canción a los x segundos.

Ryo Suzuki

#4
De acuerdo.

He llegado a la conclusión de que es un bug de BennuGD de PC.

Cuando una canción llega su fin continua estando en cd_status(2 The CD is playing) cuando debería estar en STOP o PAUSE.

De esta forma es imposible detectar cuando se ha llegado al final de una CDDA track para mandarle a hacer loop o lo que quisiemos hacer una vez que el tema ha finalizado. ¿A quién debería reportar esto a ver si pudiera solventarse en futuras versiones?


Como parece ser un error insalvable del propio Bennu, hemos intentando usar el mod_dream de la Dreamcast y usar el DC_CDDAPLAY del propio KOS de la Dreamcast para controlar la reproducción de pistas de audio y así hacer el loop pero tampoco nos funciona, nos crashea...

A ver si se pudiera solventar, porque entiendo que esto afectará no solo al Bennu en sí, sino a todos los ports que quieran usar CDDA por el problema del cd_status.

Gracias por la ayuda, como siempre. Un saludo.

Drumpi

No me hagas mucho caso, pero creo que había algún problema con la librería de acceso al CD, y se avisó que podía funcionar mal (concretamente creo que se mencionaba este caso) y se desaconsejaba el uso del mismo. Lo que ya no recuerdo es cuándo se dijo, si fue en una release de Bennu, o en alguna de Fenix reportada por Slainte o por Splinter.

¿De cuándo es la mod_dream y qué versión de Bennu estás usando? es posible que en alguna actualización de bennu se haya tocado el tema de la carga de módulos y los binarios antiguos no valgan y haya que recompilarlos. Es más, es posible que incluso necesites compilar el propio juego en la Dreamcast (a mi me pasó alguna vez en Wii).
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Ryo Suzuki

Me hago cargo que se desaconsejara en el pasado, como decís. Lo que pasa es que no tenía ni idea porque no comentan nada en la wiki oficial de la documentación (estaría bien quizás editarlo y ponerlo ahí porque a más gente le puede pasar).

Como ya comentaba panreyes está roto en PC, así que a cualquier port le va a pasar lo mismo...

No lo usaría y tiraría de ogg de cierta calidad como supongo que hacéis vosotros. Pero no puedo en la Dreamcast porque al parecer ese hilo de descompresión de audio hace que se vaya todo al garete y no puede con él, así que una opción buena que pensé fue usar CDDA con loops y asunto resuelto (como de hecho hacen muchos juegos comerciales en esta máquina e incluso lanzamientos indies recientes).

La mod dream me la ha preparado mi amigo Indiket, pero eso es tema a parte porque eso era para usar el CDDA de KOS cuando en principio no haría falta y podría utilizar el de Bennu si no fuese por el bug de que no reconoce que la pista ha terminado.

La versión de Bennu que estoy usando es la última que habéis sacado. El problema no es de la Dreamcast, es directamente que corriendo en PC ya no se puede hacer loop de las pistas CDDA (de hecho en Dreamcast se comporta exactamente igual con las pistas de audio que en el PC)

Compilar en Dreamcast no sé a qué te refieres. En principio solo es el interpréte y le pasas el .dcb y funciona todo bien (solo has de tener en cuenta algunas limitaciones y particularidades porque es una máquina ya vieja del 98). Ese no es el problema, el meollo del asunto es como decías el bug del CDDA que se produciría supongo en alguna release de Fenix o Bennu.

--

Hasta que se pueda solucionar y como estoy obligado practicamente a usar CDDA, ¿cómo podría hacer un temporizador para volver a reproducir la track y hacerme un loop custom?

He estado intentando con &timer y me aparece un contador del tiempo que está pasando desde que el programa inicia pero no puedo interceptarlo con un condicional o un repeat until hasta que llegue a un valor para volver a reproducir la pista. No sé porqué no parece funcionar con valores comparativos de == o >< ...

Echadme una mano, please. Necesitaría un proceso que no impidiese la ejecución del resto de cosas pero que estuviese contando el tiempo que está pasando para volver a reproducir una CDDA pasados x segundos.

GRACIAS!!

Drumpi

Antes que nada, no tomes mi palabra como algo exacto, porque en los últimos meses parece que mi cabeza anda algo descolocada (y más ahora que acabo de volver a casa ^^U), así que es posible que no se dijera nada sobre el CDDA y fuera otra cosa, espera confirmación de otra fuente por si acaso :P

El resto del mensaje era por lo del crash de la mod_dream: suena a que hay alguna incompatibilidad entre el módulo y Bennu, aunque podría ser la propia librería, no lo descartemos. Yo me inclinaba a que si la librería tenía tantos años como el primer port de Bennu a Dreamcast, pero estábais usando un Bennu moderno, es posible que hubiera un conflicto de versiones. Si hubiera un log de errores...
También me refería a que es posible que el DCB fuera incompatible. Como comento, en Wii, un DCB que se me leía en Windows, Linux y Wiz, no era capaz de hacerlo en Wii, y tuve que generarlo mediante un BGDC para Wii. No sé si sería por lo de big/little endian, la alineación de variables o qué, pero recibía un crash.

Los timers son un array de 10 valores que cuentan centésimas de segundo desde que se inicia el programa o desde que los pones a cero:
timer[2] = 0;
Sí, se les pueden asignar valores, pero automáticamente se incrementan con el tiempo transcurrido desde el último frame. La pega es que estos valores nunca son fijos, y a 50fps, en un frame te puede incrementar 15 milesimas de segundo, y al siguiente 22. La idea es que deberías comprobar si superan el tiempo que necesitas, en lugar de usar == o ><

loop
    timer[0] = 0;
    play_cd(3);
    while (timer[0] < 3000) frame; end
end


De todas formas, en mi opinión personal (aquí ya hablo de gustos), el uso de timers me parece muy poco preciso, y prefiero usar contadores, ya que si usas set_fps(50,0), sabes que cada 50 frames ha pasado un segundo, y que cada frame es 0'02 segundos.

Y otro detalle ¿Qué pasa con los OGG? ¿Que se ralentiza el juego? Puedes probar con música en formato WAV sin compresión. Play_song admite todos los formatos de sonido, y los grandes creo que los carga bajo demanda, en lugar de hacerlo de golpe. El formato WAV, al no estar comprimido, aunque su tamaño sea monstruoso, necesita muchos menos recursos para ser reproducido, y lo mismo soluciona tu problema.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Ryo Suzuki

Es interesante lo que comentas, Drumpi. Se nota que sabéis un montón del tema.

Finalmente ya está solventado. Conseguimos hacerlo con libmod_dream.dll y usando la función directa de KOS que hace el loop sin ningún problema, aunque es cierto que nos dio bastantes quebraderos de cabeza hasta conseguirlo (postearé un tutorial si puedo en un futuro).

El Bennu de Dreamcast que estoy usando, aunque está basado en el de los Coldev tiene ya muchos cambios y fixes y me lo va proporcionando mi amigo Indiket (algo así como yo hago trabajo de campo poniendo a prueba cosas en la práctica y el arregla lo que va petando por aquí y por allá). De todas formas creo que no hay problema con compilar con la versión más actual de Bennu ya que el port de Dreamcast creo que está lo más actualizado posible y no parece generar muchas movidas...

Lo de la Wii que comentas no deja de ser curioso. En Dreamcast ahora que lo pienso creo que se podría quizás tratar de compilar en la propia máquina y que escribiese el .dcb resultante quizás en la VMU o en alguna SD o algo así, lo cierto es que nunca lo había pensado porque en principio no cuenta con unidad de almacenamiento para estos menesteres.

Tu ejemplo me ha ido perfecto. Ahora sí que puedo hacer LOOP en las CDDA de audio tanto usando mod_dream como un contador custom gracias a lo que me has proporcionado (aunque he tenido que rehacer un montón de cosa de los procesos porque el tema es delicado que esté siempre ahí rulando en todo momento). Ahora hay las dos opciones, que es lo mejor.

Con los ogg por lo que pude probar petardea mucho la música más que apreciarse ralentizaciones en el juego. Aun usando compresiones muy modestas para que el archivo pese poco había problemas. Eso usando el mixer normal de Bennu de la Dreamcast, otra opción era usar mod_dream de nuevo y hace OGG_INIT y tirar de nuevo en teoría de KOS que rendía algo más, pero me encontraba con el problema que sí tenía música no oía los FX Wav y demás, por algún motivo no hacía la mezcla, o sonaba una cosa u otra :S

Lo de Wav gordo en plan audio track a lo bestia, se me había pasado por la cabeza pero es bastante complicado por el tamaño del buffer de audio de la Dreamcast que creo que son solo 2 megas. Así que imaginate una canción de 3 minutos que puede ocupar 50-60 megas o lo que sea se hace totalmente inviable. Aunque me parece muy interesante si tiene eso de que puede ir cargando on demand según lo necesite...

De hecho estoy teniendo problemas hasta con los FX ya que tengo que optimizar mucho los wavs para encontrar un equilibrio entre que suenen bien y no pesen en exceso. Lo ideal sería poder usar ADPCM WAV que la Dreamcast lo descomprime automáticamente por hardware y pesa bastante poco para la calidad que da, lo que pasa es que no sé como hacer funcionar eso a través de Bennu.

Muchas gracias por todo.


Drumpi

Me alegro de que vayas encontrando soluciones a los problemas.
De todas maneras, dile a Indiket que, aunque los de coldev tienen el código fuente de BennuGD muy actualizado, Splinter va subiendo los cambios a su git... o al menos o iba haciendo hace tiempo :D Y además, seguro que agradecerá que le indique cualquier cambio que haga al código fuente para ver si hay algún bug con el código oficial, o si merece añadirse al código directamente.

También, cualquier solución que encuentres, será bienvenida en el foro, aunque lo expliques muy por encima, le ahorrarías muchos quebraderos de cabeza a más de uno :D
Por cierto ¿no podeis usar Bennu para los SFX y la mod_dream para la música? ¿Tan poco espacio hay en la RAM para no poder tener cargados y reproducir los SFX?
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Ryo Suzuki

#10
De acuerdo, se lo comunicaré a Indiket.

Lo que comentas mod_dream para la música se puede usar para CDDA como digo (aunque ahora con tu timer he comprobado que se puede seguir usando la opción de mod_cd de Bennu también en DC). Otra cosa que he probado es usar OGG del mod_dream para FX ya que pesan muy poco y con archivos cortos y ligeros no debería haber problema. Lo malo es que cuando reproduces cualquier ogg para totalmente cualquier otra cosa, ya sean CDDA tracks, wavs fx o lo que se tercie. No entiendo porqué ogg deshabilita cualquier cosa en la mezcla (no al hacer ogg_init, al hacer play del ogg). Si pusieron reproducción de ogg en ese mod se supone que se debería reproducir efectos de sonido también, quizás falte implementar un PLAY WAV del KOS...

Lo de las soluciones que encuentro, es cierto que vas pillando muchos trucos y cosas "a base de palos" y pruebas. Lo ideal sería que hiciese algunos minitutoriales por aquí o por mi web con las cosas que hay que tener en cuenta cuando se usa el Bennu orientado para luego correr en Dreamcast.

Quiero acabar un pequeño proyecto que tengo que así de alguna manera demostraría que es posible usar el port actualizado de Indiket de manera real, pero siempre van saliendo nuevas movidas inesperadas...

P.D: La última: No hace unloads de wavs y no reproduce mas de 5 sonidos FX diferentes, lol!