El tutorial se basa en reproducir CDDA o mas comunmente las pistas de audio de Saturn.
He hecho las implementaciones de CD (para abrirlo y explorar los datos) y una implementación de sonido CDDA.
Esta última esta basada en el sound player de Rockinb ya que no le encontre sentido alguno en modificarla, la verdad esta muy bien hecha y de esta forma prefiero que se concentren en el desarrollo del juego.
Los tracks deben estar en .wav con 16bits stereo a 44100khz de muestreo.
Ambas implementaciones están incluidas al final en un .zip
Como ya es un clásico, si no sabes cómo empezar, mira este link primero. Como simpre usaremos el ejemplo S_2_2.
La implementación tiene las siguientes funciones:
- CDDA_init()
- CDDA_stop()
- CDDA_pause()
- CDDA_Play(track Uint8)
- CDDA_getStatusName()
CDDA_init()
dentro de esta funcion encontramos otra, la más importante
slCDDAOn(127, 127, 0, 0) los primeros dos parámetros son para el volúmen izquierdo y derecho respectivamente. Le podemos setear valores desde 0 a 127.
Los otros dos son para el LPan y RPan, sinceramente no he notado el cambio. Algún músico que me de una mano con esta explicación :mrgreen:
CDDA_stop()
Obviamente, esta función detiene el reproductor y setea la posición en el track 1.
CDDA_Play(track Uint8)
El parámetro que recive es el track mismo, si le pasamos un 2(dos) leerá el segundo track. El 3(tres) será el tercero y asi sucesivamente.
CDDA_pause()
Pausa el track pero queda posicionado ahi.
CDDA_getStatusName()
Esta funcion devuelve un puntero char, para que podamos imprimir el estado del reproductor.
Bien para comenzar, debemos incluir ambas implementaciones dentro de nuestro main.c
Luego, debemos en este orden:
- Iniciar el CD :: init_CD();
- Activar el sonido :: init_SFX();
- Activar el CDDA :: CDDA_init();
por último despues de hacer el loading de los escenarios, sprites, modelos 3d, texturas, sonidos sfx, etc. Debemos hacer un CDDA_Stop().
- //Iniciamos el CD
- init_CD();
- //Iniciamos el sonido
- init_SFX();
- //Activamos el CDDA, seteamos el sonido y ademas tomamos la cantidad de tracks
- CDDA_init();
- CDDA_stop();
Por ultimo y gracias a Saturn_worship me ha dicho que la consola solo reproduce la música si la ponemos dentro del while; si lo hacemos fuera en ssf funcionará, pero claro esto ya es un bug encontrado en el emulador.
Supongo que la consola no lo reproduce porque necesita la sincronizacion slSynch(), que esta dentro del while.
PD: les dejo las implementaciones y el main.c :D