¡Oh no! ¿Dónde está el JavaScript? El navegador Web no tiene JavaScript activado o no es compatible con JavaScript. Active JavaScript en su explorador Web para ver correctamente este sitio Web o actualizar a un navegador Web que admita JavaScript.
Sabías que...
NHL 2K2 fue el último juego vendido en EEUU (febrero de 2002).

Libera Ram Dreamcast - Pero audios se escuchan en 1 solo parlante

Última actualización en 1 year hace
Publicado 2 year hace
Hola!!
Mi nombre es Gabriel Santoferrara.
Les escribo desde Argentina.

Llegué aqui por medio del foro de BennuGD y por la página de segasaturno.com smile
Les quería contar que desde hace tiempo estoy desarrollando un juego para dreamcast llamado Blocks Attack
Les dejo un video del avance y se pueden bajar una demo para jugar en la descripción del videosmile
https://www.youtube.com/watch?v=lPxR1t__Kgw

En el foro de bennugd veniamos hablando con Ryo Suzuki y me brindo un interprete para bennu
1ST_READ.bin (del miércoles, ‎01‎ de ‎enero‎ de ‎2020 y pesa 1.943.572 bytes) que solucionaba un problema que se había detectado que en dreamcast no se liberaba la RAM en los juegos, Gracias a este archivo pude avanzar con mi juego y agregarle muchos niveles y demás cosas al no depender de un nro limitado de ram para consumir. Funciona genial!!!!

Ahora.... resulta que noté algo que sucede con este intérprete y es que los archivos .wav que se cargan en bennu, al ejecutar el juego en dreamcast se escuchan solamente por 1 solo parlante... de un solo lado. En realidad, si ponemos un audio muy muy fuerte se escucha por ambos parlantes, pero un canal mucho mas alto que el otro... como si el audio estuviese paneado completamente hacia uno de los lados.
Probé con un 1ST_READ.bin anterior (del ‎jueves, ‎13‎ de ‎agosto‎ de ‎2015 y pesa 1.106.980 bytes) y los audios se escuchan bien por ambos parlantes perfectamente así que tuvo que pasar algo en esta actualización.
Lamentablemente no puedo usar esa versión vieja porque no me libera la ram....
Quería saber si me podrían ayudar o si podría hacer algo para solucionar este problema o si quizás existe un 1ST_READ.bin mas nuevo del 2020 donde se haya resuelto este tema.
Les agradecería infinitamente si me pueden ayudar con esto.
Muchísimas gracias de antemano!!
Saludos desde Argentina!!
Gabriel
IndiketIndiketAdministrador
Publicado 2 year hace
Hola Gabriel!

Yo soy Indiket, el que mantuvo la versión de BennuGD de Dreamcast que estás usando. Mi gran amigo Ryo Suzuki de segasaturno.com me dio un poco de guerra con este port, mejorándolo y añadiéndole cosas por un lado y por otro. Hace ya algunos años que ya no reviso este código (y tampoco me verás activo por la scene por motivos laborales, etc). Digamos que "nos hacemos viejos jeje".

Respecto a tu tema, tienes que saber que está versión de BennuGD está compilada con una librería mía que la llamé "fake_Mixer". Harto de que nos diera muchos problemas de estabilidad y de memoria con la ineficaz "SDL_Mixer", lo que hice es una pequeña librería que traduce los comandos de la SDL_Mixer a la librería "Mikmod". Es decir, uso una librería más liviana y mantengo la compatibilidad con aplicacions que usen la SDL_Mixer.

Por fortuna o desgracia, no todos los comandos están implementados en mi versión de "fake_Mixer". Uno de ellos es el Mix_SetPanning, con lo cual en archivos MONO, efectivamente, sólo se escucha por el parlante izquierdo.

Una solución rápida es que tus WAV estén en estéreo. El panning no tiene sentido en estéreo y se escucha en los 2 parlantes.

La otra... es usar esta versión experimental (nuevo Build) de BennuGD. Aviso: No lo he probado, debería ir...
https://www.dreamcast.es/descargas/pr...082022.zip

Recuerda que en BENNU debes llamar a "SET_PANNING" con el canal, volumen izquierdo y volumen derecho.
Los valores de volumen van de 0 a 255. Si lo quieres centrado, usa 128 en izquierdo y 128 en derecho.
Esta función es válida mientras se está reproduciendo en el canal (es decir, haz el play y a continuación, setea el panning).

Disculpa por la tardanza en la respuesta!

Un gran saludo,
Indiket.
Publicado 2 year hace
Hola Indiket, un gusto en saludarte!!!
Antes que nada, muchísimas gracias por responder! Si, todos nos volvemos grandes y no podemos dedicar el tiempo que quisiéramos a algunas cosas. Yo tengo una hija de 2 años que me demanda la vida jeje.
Probé el intérprete nuevo que me pasaste. Primero te cuento una cosa muy buena... Aparentemente está mas optimizado, porque ahora mi juego anda mucho mas fluido... Antes notaba algunas caidas de fps cuando se movían muchos sprites y tuve que bajar la resolución a 320x240 para que ande bien. Ahora, con este intérprete anda muy muy fluido, no noto ninguna caida de fps.... se siente genial... y hasta me dan ganas de probar de nuevo con sprites de resolucion en 640x480. Esa parte espectacular!!

Y ahora la mala... el audio.... probé con archivos estereo tanto con el intérprete del 2020 que tenia y el nuevo que me brindaste, con ninguno de los 2 se me escuchan, ni siquiera por 1 solo parlante. Directamente no suenan.... Con wavs Mono si se escuchan, pero de igual manera con ambos intérpretes, es decir solo por 1 parlante... (En realidad se escuchan por los 2 pero en uno muy muy muy bajito)
Te comento como estoy haciendo la llamada al wav, entiendo que es como me indicaste, pero cualquier cosa me dices...

Tengo 2 variables int...
int wav;
int id_SND_Opening_CANAL;

wav = load_wav(cadenaruta + "sega3.wav"wink; //Cargo el wav
id_SND_Opening_CANAL = play_wav(wav,0); //le doy play y me guardo el canal
SET_PANNING(id_SND_Opening_CANAL,128,128); //hago el set_panning al canal mitad y mitad...

Probé también sumar otras funciones como Set_Wav_Volume(128).....Resume_wav(id_SND_Opening_CANAL) (después del play_wav) pero sin ningún resultado.
Si te preguntas que hace "cadenaruta", solo tiene un string "/cd/" que lo seteo solo para cuando OS_ID == OS_DC, es para tener la ruta correcta en dreamcast...

Acá dejo un codigo de ejemplo de reproducción muy simple y un archivo .cdi para que lo veas... "sega3.wav" Está en Estereo... "sega2.wav" está en MONO por si lo quieres cambiar y probar....
https://files.fm/u/yt3hw8z4y

No estoy seguro si la versión de bennu que uso podría tener algo que ver... yo usé siempre la que venia en un devkit (aparentemente del 2011), bajé la ultima versión de bennu y cambié todos los bin, (los adjunté también en el link por las dudas, los archivos SDL.dll y SLD_mixer.dll van cambian de versión)
El juego levanta bien con tu nuevo intérprete y con la última versión de bennu pero el audio lo mismo... solo suena por 1 parlante los MONO y los ESTERO directamente no suenan.

En fin... Puedes tomarte el tiempo que quieras en responder!!! Yo cada tanto reviso el hilo. Además este tema del audio no me es un impedimento para avanzar en el desarrollo del juego, es solo un detalle, pero si me gustaría solucionarlo en algún momento. smile
Muchísimas gracias por la ayuda!!
Abrazo Grande
Gabriel
Editado por gabysantof en 08-08-2022 00:27, 2 year hace
Publicado 2 year hace
Hola!!
Una cosita mas que agrego a la note anterior para ver si ayuda.....

Cuando cargamos un archivo.wav MONO el id del "wav" en Dreamcast queda con un número negativo bastante grande... y el audio suena por 1 parlante.
Cuando cargamos un archivo.wav STEREO el id del "wav" en Dreamcast queda en "0" (como que no se pudo cargar el wav) y el channel queda con valor "-1".
Hay algo raro al intentar cargar wavs en estero. En fin si hay manera de cargar un wav y se escuche por ambos parlantes no hay problema que sea estero, Son siempre un poquito mas pesados pero se optimizan y listo. El asunto es hacer que se escuche por ambos parlantes :)

wav = load_wav(cadenaruta + "sega3.wav");
id_SND_Opening_CANAL = play_wav(wav,-1);
SET_PANNING(id_SND_Opening_CANAL,128,128);

Abrazo!
Gabriel
Editado por gabysantof en 11-08-2022 22:08, 2 year hace
IndiketIndiketAdministrador
Publicado 2 year hace
Hola Gabriel!!

En primer lugar, las malas noticias: no he logrado tu objetivo de reproducir en ambos parlantes. Llevo varios días con el asunto y no le veo una solución "fácil".
Pero, en este mensaje, voy a explicar mis experiencias y lo que he probado para dar a luz las diferentes opciones. Agarra unas palomitas y arrancamos :)

- En primer lugar, la librería Mikmod es excelente para reproducir ficheros MOD sin depender de la SDL_Mixer. Hace tiempo que hice el código que envía los datos RAW al AICA de la consola con instrucciones KOS (el "driver"). Hace mixing de múltiples audios y de forma rápida. Como añadido, también carga ficheros WAV (como "samples"), pero la documentación de Mikmod dice, bien claro:

"Currently, MikMod only supports uncompressed mono WAV files as samples."

Por esa razón no carga ningún fichero WAV estéreo. Y respecto a usar los dos parlantes, no he encontrado la forma de hacerlo (pensaba que era el panning... pero no).

Bien, como se que KOS admite WAVs estéreos, investigué y exploré diferentes opciones:

1. Modplug. Probé hace tiempo de compilar y usar esta lib, pero el sistema KOS no le gusta y causa "Unhandled exceptions" al intentar reproducir material. La versión del kos-port es muy obsoleta, y recortada. Las actuales fallan.

2. El propio KOS. El mismo sistema operativo permite reproducir WAVs, así que "no debería ser tan complicado" hacer una pequeña librería que cargue mis WAVs y los reproduzca.
De mi librería "fake_mixer", hay funciones para cargar música y otras para los samples (WAV). Estas segunda, en vez de usar Mikmod, escribí mi código para que reproduciera WAVS. De nuevo, dos opciones.

- KOS tiene una librería llamada "sfxmgr" para simplificar la carga y reproducción de WAVs. Problema: sólo acepta samples de 65534 de longitud (aproximadamente, un WAV de 1 o 2 segundos). No nos sirve, ya que nuestros WAVs tienen un tamaño mayor.

- Programar unas funciones para usar el Streaming de audio de la Dreamcast (SPU AICA). Por un lado, se amplía la dificultad de programación (tienes que preparar buffers, realizar callbacks, etc). Además de leer y parsear los WAVs (por ejemplo, saber si es stereo o mono para reservar los canales, etc). Una guía de lo que hablo: https://dreamcast.wiki/Streaming_audio

Encontré que un usuario (BB Hood, de dcemulation) creó una librería de ayuda a hacer streaming de audio.
La llamó "libwav" https://github.com/andressbarajas/libwav , y también es la que usa DCMC (en sus primeras versiones).

Con esa librería, reprogramé mi "fake_mixer" para que en caso de ficheros WAV, cargara esa "libwav" y esta se encargara de usar el AICA de la consola.
La parte buena, es que efectivamente carga el WAV (mono o estéreo) y lo reproduce.
Lo malo:
- Algunos WAV no los carga, directamente da error de ejecución.
- No soporta la carga de múltiples ficheros WAV. Con Mikmod no había problema, ya que se encargaba de hacer el mixing. Pero aquí no... no hay ninguna gestión. Un juego te carga al principio X Wavs en buffer y luego los va usando. Aquí no es posible, hay que programarlo todo...

3. OpenAL.
Me acordé que el bueno de "Kazade" (Luke Benstead) está trabajando en Simulant (su propio engine usando KOS). Este gran proyecto, implementa una nueva versión de OpenGL y también de OpenAL (lo llama "ALdc). OpenAL es una muy buena librería de reproducción de WAVs, al estilo de la SDLMixer. Así pues, como Luke hizo el código de la implementación AICA de OpenAL, me decidí por un nuevo intento. Usar esta librería para los WAV.

El web del proyecto Simulant, usando ALdc 2.0: https://gitlab.com/simulant/aldc

Esta librería tiene también sus luces y sus sombras. Por un lado, está implementada la reproducción de WAVs tanto mono como estéreo. Permite gestionar varios buffers y canales a la vez, con lo que se puede cargar varios wavs y reproducirlos. Por el otro, está WIP y algunas funcionalidades no las tiene añadidas (faltan funciones ALUT, no implementa algunos efectos, etc).

Bien, de nuevo reprogramé mi "mixer" y conecté con OpenAL. Resultado:
- Reproduce WAVs pero no al nivel de Mikmod. Algún fichero no consigo que se oiga, es un poco más lento que Mikmod... Además, no es tan trivial reproducir varios WAVs a la vez (tienes que gestionar los buffers y sources por tu cuenta).
- FIcheros grandes de WAV no los carga por defecto. La librería se queja que son demasiados samples (ok), pero luego tiene una funcionalidad de carga por streaming. Es decir, ir cargando el WAV en trozos como lo hacíamos con KOS directamente. Se puede hacer, pero la cosa se complica de nuevo! Te recomiendan usar otra librería (libsndfile) para parsear el WAV y cargar los datos en trozos, y luego el código hay que cambiarlo para usar varios buffers, sources e ir gestionando los datos. Sinceramente, demasiado complicado...

Mira, aquí un ejemplo muy bueno de lo que se propone:
https://riunet.upv.es/bitstream/handl... audio.pdf

-----------------------------------------------------

Despúes de "romperme los cuernos" varios días, decido no seguir y dejarlo como está. Hay alternativas como OGG, o ficheros MOD. La librería mikmod va estupendo con WAVs mono y su sistema de mixing usando el AICA de KOS.

En fin Gabriel, gracias por tu feedback. Estoy abierto a nuevas alternativas :)

Un saludo,
Indiket
Publicado 2 year hace
Hola Indiket!!!
Antes que nada, muchísimas gracias por tu tiempo y por la ayuda.
Te hice trabajar un montón, no era necesario tomártelo con tanta prisa :) De verdad muchas gracias por la ayuda.
Una lástima que no puedas dar con la solución.

Se me ocurren un par de ideas / comentarios, luego tu me dirás que te parece, Esto es obviamente sin ninguna presión de tiempo! jeje

-- Con SDL_Mixer comentabas que tenías muchos problemas de memoria y por eso pasaste a usar Mikmod. Entiendo que cuando usabas SDL_Mixer se reproducían bien los wavs y aquella versión del 1ST_READ.bin del 2015 usaba eso....
La realidad es que los wavs, en mi caso , los uso para reproducir sonidos FX, se cargarían al comenzar el juego y no se liberarían de la ram... son simples sonidos muy cortitos de disparos y explosiones... de hecho, cuando comentaste en alguna de las opciones que funcionaba con wavs de 1 o 2 segundos... CASI CASI que me alcanza. jejeje
Mi pregunta allí sería.... será posible utilizar sdl_mixer como antes SOLO para los wavs cortos de modo que se escuche por ambos parlantes y sabiendo que estos wavs no se liberarán nunca.....
y por otro lado para wavs mono y mas largos como ahora con tu fake_sdl_mixer que usa el mikmod?
De esa manera sonidos muy chiquitos los podemos cargar de una vez como wavs (y no los liberamos la ram nunca) y sonidos mas largos que sean mono y se escuchen por 1 parlante y se pueden liberar de la ram si se necesita.... Es una solución poco ortodoxa quizás pero creo que le serviría a la mayoría....

-- Por otro lado... La realidad es que (al menos a mi) no me interesa que sean sonidos wavs, raw, ogg, opus, etc.... mientras se reproduzca bien para mi es indistinto. es cuestion de reconvertir el formato del FX y listo....
Probé archivos .mod, .xm, .it, y suenan perfectos, pero me es dificil (o sinceramente no se como hacer) para crear efectos FX (o crear voces) con este formato.... entiendo que es un formato de trackers, se hacen con sintetizadores... no se puede reconvertir un Wav a mod o a xm, quizás con suerte un .midi a xm se puede, con mucha paciencia. Así que bueno, si hay otro formato que funcione (que no sea un tracker) lo puedo usar sin drama.
En algún momento, con Ryo hablamos de los ogg pero me dijo que en esta versión lo sacaron porque no les funcionaban bien, (acá dejo el link)
https://forum.bennugd.org/index.php/topic,4573.0.html
Lo probé con el interprete nuevo que me pasaste y tampoco funcionan los ogg, seguramente no está.
También comentó de incorporar OPUS, a mi me da igual, mientras lo pueda cargar y reproducir, el formato me es indistinto... el tema es que los .mod o .xm no los puedo usar para FX... o al menos no es fácil convertirlos jeje.

-- Una mas... Esto es algo que tiro al aire.... conoces los archivos ADX?? es un formato de audio que sé que Dreamcast manejaba y varias consolas de la época...
https://segaretro.org/ADX
Acá hay una librería que te podes bajar para kos:
https://dcemulation.org/phpBB/download/file.php?id=627
Lo encontré en:
https://dcemulation.org/phpBB/viewtopic.php?t=101638
También encontré esto
https://github.com/dospro/adx_tools
Quizás se pueda incorporar y entonces levantar archivos de este tipo.

Te mando un gran abrazo Indiket
Estamos en contacto!

Gaby
IndiketIndiketAdministrador
Publicado 2 year hace
Buenas gabriel!

Respondo a tus comentarios:

- Sobre usar SDL_Mixer, no tendría sentido mi librería si lo usáramos porqué lo que hace es emular las llamadas de esa librería pero en el fondo ejecuta un código totalmente diferente. SDL_mixer necesita SDL ya que hace transformaciones a canales de SDLAudio (y, paradójicamente, usando la fake_Mixer no es necesario ni que uses SDL). Consume muchos recursos y tiene varios bugs, y no se puede usar "solo para wavs". O se carga todo el sistema SDL_Mixer + SDL o no. Como dices, es una solución poco ortodoxa y he preferido hacerlo con Mikmod (aunque haya esa limitación de wavs estéreo).

- El formato de trackers es muy chulo, pero hay sonidos y voces imposibles de convertir a formato mod. No hay ninguna herramienta buena que convierta WAVs a S3M. Y como bien dices, con esfuerzo puedes pasar de un MIDI a un XM.

- En el intérprete que tienes de Dreamcast, este puede reproducir los ficheros OPUS! Efectivamente, usé la librería que está en nuestros repositorios de kos-ports.

Para usarla, hay que cargar el "mod_dream" (es el módulo customizado de Dreamcast. En Windows, como mucho lo tendrás pero sus funciones no harán nada).

Una vez cargado, tienes las funciones "OGG_INIT", "OGG_PLAY(filename, loops)", "OGG_STOP", "OGG_IS_PLAYING", "SET_OGG_VOLUME" y "OGG_CLOSE".
Recuerda que OPUS usa el contenedor OGG, pero los ficheros están usando un flujo Opus.

Inicialmente tenía OGG con la oggvorbis, pero probé el rendimiento con Opus y era claramente superior, con lo que hice el cambio de oggvorbis a libopus.

- Se puede mirar de añadir ADX, ya vi que el DCMC tiene una implementación de libadx. Pero creo que usando Opus puede ser suficiente, no?

Saludos,
Indiket.
Editado por Indiket en 21-08-2022 15:53, 2 year hace
Publicado 2 year hace
Hola Indiket y a todos los que lean!

Estuve unos días enfermo y luego bastante atareado así que me demoré en responder sobre este tema.
Como siempre tenemos buenas y malas noticias, jeje.

La buena noticia es que probé los archivos .opus con la función "ogg_play" y funciona bien!!! Reproduce los archivos .opus y se escuchan perfecto en ambos parlantes ejecutando en los emuladores de dreamcast.

¿Que pasó ahora entonces?
Resulta que para la música de fondo en los niveles yo venía utilizando pistas de audio, con la función "dc_cddaplay" que Ryo Suzuki había recomendado.
Esta función es genial porque casi no utiliza recursos y el audio se escucha obviamente excelente.
Y para los efectos, por supuesto venía usando el play_wav y acá teniamos el problema del audio en 1 solo parlante.

Entonces, al reemplazar (para dreamcast) el play_wav por el ogg_play que paso?
Resulta que arranca el nivel... arranca la pista de audio con dc_cddaplay y en cuanto se ejecuta el primer ogg_play, EXPLOTAAAA.. jajaja, bueno.. no tanto... pero lo que sucede es que se detiene la pista de audio y solo se escuchan los .opus.
Es como si el audio de "dc_cddaplay" y "ogg_play" colisionaran.
Pensaba que quizás usan el mismo canal. En el play_wav, como 3er parámetro existe la posibilidad de seleccionar por que canal disparar el audio... no se si con el ogg_play existe algo similar, aparentemente no, porque intenté agregarle otro parámetro y me dió error.

Una cosa mas que intenté fue crear un pequeño archivo .mod. Si.... me hice un tracker que simula un disparo de mi nave.... este .mod lo ejecuto con "load_song" y luego "play_song". (Por el nombre de la función imagino que está pensando también para musica de fondo y no para efectos FX) y sucede lo mismo que con el opus.
En cuanto ejecuto un .mod me explota la pista que vengo ejecutando con "dc_cddaplay".

Pero bueno...... no son todas malas, hay 1 muy buena, el ogg_play con los opus me sirvió igual para la intro del juego.
En la intro tengo que ir cargando varios archivos fpgs de imágenes mientras suena música de fondo. Usando "dc_cddaplay" ocupás el lector y no podes cargar y descargar nada. en cambio con el ogg_play podes hacerlo sin drama y eso me resolvió una parte. que era molesta. Al inciar el juego ya se escuchaba por 1 parlante y era muy notorio el error.

Ahora durante el juego, mientras estoy con el dc_cddaplay no puedo ejecutar un ogg_play porque me detiene la pista. Finalmente en esa instancia volví al play_wav. No me molesta TAAAANTO porque como está sonando la pista de audio, los fx se escuchan por 1 solo lado y bueno... no queda taaan mal.

Indiket, te quería consultar si haz visto esta parte en la documentación de mikmod

http://web.mit.edu/outland/src/libmikmod-3.1.9/docs/mikmod.html
Hay una función que se llama Voice_SetPanning
y Dice así:
And to demonstrate the Voice_SetPanning function, we change the panning of the second sample at each iteration from the left to the right. The argument can be one of the standard panning PAN_LEFT, PAN_RIGHT, PAN_CENTER and PAN_SURROUND1, or a numeric value between 0 (PAN_LEFT) and 255 (PAN_RIGHT).

Puede llegar a ser que al compilar el valor está en "0" y por eso queda en PAN_LEFT. ?? Me muero si es eso.....
Es muy curioso lo que sucede, si cargamos un wav con mucho volumen nos damos cuenta que en realidad suena por ambos parlantes en dreamcast... pero casi casi paneado 100%... me hace pensar que puede ser algo de configuración....

Un abrazo a grande!! y como siempre contestas cuando puedas!!
Creo que todo lo que va surgiendo acá puede también servirle a otros chicos que quieran ir desarrollando algo en bennu así que no creo que esto sea en vano :)
Gaby
Editado por gabysantof en 29-08-2022 00:18, 2 year hace
Publicado 1 year hace
Cómo decimos en Argentina. No dejemos morir está Joya jeje. Abrazos!!
puede ver todos los hilos de discusión en este foro.
puede iniciar un nuevo hilo de discusión en este foro.
no puede responder en este hilo de discusión.
no puede empezar en una encuesta en este foro.
puede cargar archivos adjuntos en este foro.
no puede descargar archivos adjuntos en este foro.
Afiliados
SEGA Saturno - Saturn, SEGA y Videojuegos