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