Iniciar sesión

Ver la versión completa : Problemas en sonido con la minilib



JoJo_ReloadeD
25/10/2009, 11:16
Helo aqui. El primer problema que tengo es con este codigo que sirve para modificar el sonido, no hay huevos a hacer que el volumen sea mas alto:


gp2x_dev[2] = open("/dev/mixer", O_WRONLY);
if(gp2x_dev[2] < 0) {
printf("Could not open /dev/mixer\n");
return -1;
}


Primero abro el mixer y guardo el handle en este array...


if (gp2x_dev[2])
{
direction = ((volume << 8) | volume);

// ioctl(gp2x_dev[2], SOUND_MIXER_WRITE_VOLUME, &vol);
ioctl(gp2x_dev[2], SOUND_MIXER_WRITE_PCM, &direction);
// ioctl(gp2x_dev[2], SOUND_MIXER_WRITE_OGAIN, &volume);
}


... y luego en la funcion de modificar el sonido veo si el handle sigue ahi, guardo volume (que va de 0 a 100) en forma de entero de 16 bits (poniendo en la parte alta uno de los canales y en la parte baja el otro, solo que aqui los 2 canales tienen el mismo volumen), y se lo paso mediante ioctl al mixer...

Como veis, he probado esas 3 formas para que el mixer responda, que son las que OSS indica. (No hagais caso del cambio de nombre de la variable). Ningun resultado.

El volumen viene a esta a un 30 - 40 % del maximo, aun siendo volume = 100.

He probado obviamente a que volume sea 0xFF, con lo que el parametro que le pasaria al mixer fuera 0xFFFF, pero que si quieres arroz catalina.

Tambien he probado a abrir el mixer con O_WRONLY|O_NONBLOCK, y con O_RDONLY. That if you want rice, Catherine.

El mixer no se usa en el programa fuera de estas lineas.

¿Alguna idea?

juanvvc
25/10/2009, 11:37
¿Sí que puedes hacer el sonido más bajo? Creo que ya has subido con el mixer general todo lo que puedas, y es SDL la que está limitándote el sonido con algún control software. En su día no encontré ninguna función en SDL para modificar el volumen del sonido si lo utilizabas sintéticamente, como haces en lemonboy.

Así que lo que puedes hacer es multiplicar tú los canales de sonido por una constante. En sound.c, función mix_sound() o algo similar, al final de la función verás que las variables l y r tienen el canal izquierdo y derecho del sonido. Pues multiplícalas por dos a ver si funciona :)



l <<= 1;
r <<= 1;

JoJo_ReloadeD
25/10/2009, 16:05
Efectivamente este es el tema.. no me preguntes por que.. pero ahi se dividia l y r por 8 antes de volcarlos en el buffer de sonido... Quitando esa linea ya se oye a buen volumen.

Ahora el tema es hacer que suene bien :) No tengo ni idea de por que suena tan mal.. pq he comparado las funciones de sound.c con las del gnuboy original y es identico.. debe de ser algo a la hora de reproducir los buffers...

juanvvc
25/10/2009, 17:20
El problema es de SDL, también te pasará si compilas el gnuboy original o el Quake II en un ordenador actual :) En algún momento de la historia los chicos de SDL cambiaron algo que provocó incompatibilidad con programas anteriores. ¿Qué? A saber. Una posibilidad es que haya que cambiar las tablas de sintetización de sonidos por unas nuevas.

Por eso creo que es más fácil arreglar el acceso directo al mixer que seguir el camino SDL. Pero es mi opinión, claro :) Si quieres puedes intentar compilar el sonido con acceso al mixer del gnuboy original en lemonboy, a ver si así funciona.

JoJo_ReloadeD
25/10/2009, 17:47
El problema es de SDL, también te pasará si compilas el gnuboy original o el Quake II en un ordenador actual :) En algún momento de la historia los chicos de SDL cambiaron algo que provocó incompatibilidad con programas anteriores. ¿Qué? A saber. Una posibilidad es que haya que cambiar las tablas de sintetización de sonidos por unas nuevas.

Por eso creo que es más fácil arreglar el acceso directo al mixer que seguir el camino SDL. Pero es mi opinión, claro :) Si quieres puedes intentar compilar el sonido con acceso al mixer del gnuboy original en lemonboy, a ver si así funciona.

Todo el codigo de sonido sigue usando acceso directo al hard, tal como lo hacia la minilib.