Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Duda con openAL (iphone)

Iniciado por zunou, 19 de Junio de 2010, 03:24:00 AM

« anterior - próximo »

zunou

Hola, pues en realidad creo que es algo muy tonto, pero no consigo que funcione  :D, lo que quiero hacer es ir subiendo y bajando el volumen de un sonido en loop cada cierto tiempo, pero no se como actualizarlo una vez que he cargado el buffer, y por lo tanto el sonido no cambia... :(

es decir, para reproducir un sonido hago lo siguiente:

ALuint sid;
   
   if(play==false){
      alSourcei(&sid, AL_BUFFER, ID);         // ID= id del sonido a reproducir
      alSourcei(sid, AL_LOOPING, AL_TRUE);
      play=true;
   }
   
   
   alSourcef(sid, AL_GAIN, volumen);
   
   alSourcePlay(sid);

al ponerlo así el volumen no cambia, se queda con el valor inicial ¿alguien sabe como puedo hacer que actualice el valor del volumen?

saludos  ;)

H-K

#1
Hola zunou. El volumen de reproducción no tiene que ver con el buffer, sino con el source object: lo controlas modificando la propiedad AL_GAIN durante la reproducción, es decir, en algún momento del código de actualización debes volver a hacer alSourcef( sid, AL_GAIN,  nuevoVolumen).  Para comprobar si está funcionando, prueba a recoger el valor de AL_GAIN con alGetSourcef, a ver si está cambiando realmente.

Pruébalo y me cuentas :)
"It's not who I am underneath, but what I do that defines me"

zunou

#2
Hola H-K, si, si yo estoy utilizando alSourcef( sid, AL_GAIN,  nuevoVolumen), aunque no sé si correctamente, en el código de arriba esta puesto, creo que lo que no se hacer es actualizar el código  para que me pille el nuevo valor de AL_GAIN, es decir si yo pongo

if(play==false){
     alSourcei(&sid, AL_BUFFER, ID);         // ID= id del sonido a reproducir
     alSourcei(sid, AL_LOOPING, AL_TRUE);
     play=true;
  }

una vez que play=true  esa parte ya no se actualiza y aunque ponga alSourcef( sid, AL_GAIN,  nuevoVolumen) no hace nada  ???

pero si pongo

alSourcei(&sid, AL_BUFFER, ID);         // ID= id del sonido a reproducir
alSourcei(sid, AL_LOOPING, AL_TRUE);

alSourcef(sid, AL_GAIN, volumen);
alSourcePlay(sid);

el volumen si se actualiza pero el sonido se inicia una y otra vez, reproduce un sonido nuevo por cada ciclo, y claro se satura :D.

ah, no se si lo he puesto antes, pero el sonido está en loop se repite cuando llega al final, por eso alSourcei(&sid, AL_BUFFER, ID); lo tengo que iniciar solo una vez, porque si no no funciona.

H-K

#3
No sé si estoy entendiendo bien lo que estás haciendo. No hace falta que vuelvas a llamar a alSourcePlay cada vez que actualices el volumen del source. ¿Cómo estás estructurando todo esto?

Por cierto: alSourcei(&sid, AL_BUFFER, ID) <- aquí no deberías pasar la dirección de sid, sino su valor.
"It's not who I am underneath, but what I do that defines me"

zunou

#4
  :-[ Perdón si me explico mal, no domino mucho el openal :D, efectivamente con ejecutar una sola vez funciona XD.
Poniendolo todo como en el codigo de arriba el sonido se escucha bien, lo único es que aunque cambie el valor del volumen, no causa ningún efecto, se queda con el valor inicial, si hago esto,

if(play==false){
     alSourcei(&sid, AL_BUFFER, ID);         // ID= id del sonido a reproducir
     alSourcei(sid, AL_LOOPING, AL_TRUE);
     alSourcePlay(sid);
     play=true;
  }
alSourcef(sid, AL_GAIN, volumen);

volumen no tiene ningún efecto sonar suena supongo que es por que se queda con el volumen por defecto 1.0, pero alSourcef(sid, AL_GAIN, volumen); no tiene ningún efecto.

si lo pongo así,

if(play==false){
     alSourcei(&sid, AL_BUFFER, ID);         // ID= id del sonido a reproducir
     alSourcei(sid, AL_LOOPING, AL_TRUE);
     alSourcef(sid, AL_GAIN, 0.5); por ejemplo volumen a 0.5
     alSourcePlay(sid);
     play=true;
  }
el sonido suena al volumen que le he indicado, en este caso 0.5, y ya no puedo cambiarlo, pero yo lo que quiero hacer es cambiarlo en tiempo real, es decir mientras está sonando ir subiendo y bajando el volumen, pero no hay manera.

Eso es lo único que intento hacer :D


H-K

Vale, no me has dicho cómo lo has estructurado, si este código se llama una sola vez o es parte de un bucle. De todas maneras, una buena prueba sería hacer algo como esto despues de empezar a reproducir:

Código (c) [Seleccionar]

float fCounter = 0;
while(fCounter<4)
{
       float fGainIn = 0.5f + 0.5f *cos(fCounter);

       alSourcef(sid, AL_GAIN, fGainIn);
 
       float fGainOut;
       alGetSourcef(sid, AL_GAIN, &fGainOut);

       printf("Valor de ganancia introducido: %f vs. valor de ganancia efectivo:%f \n", fGainIn, fGainOut);

       fCounter += 0.1f;
}


Si los valores que escupa la consola (si es que en el iPhone puedes ver una consola, que no lo sé) son distintos, entonces prueba a hacer llamadas a alGetError despues de cambiar el volumen, que a lo mejor hay algo que se me está pasando.
"It's not who I am underneath, but what I do that defines me"

zunou

Pues el código lo llamo una sola vez, cuando play=true, ya no se ejecuta mas, permanece sonado porque le indico que se repita con alSourcei(sid, AL_LOOPING, AL_TRUE).

He probado lo que has dicho y los valores son los mismos, así que AL_GAIN si se está actualizando  ???  pero no hace efecto.
seguro que la estoy liando en alguna tonteria :D

H-K

Comprueba que 'sid' es en efecto el id del source que está reproduciendo, prueba haciendo otras modificaciones, como AL_PITCH o así a ver si tiran. No sé, si fuese un bug, es lo suficientemente gordísimo como para que lo hubiesen arreglado ya.


Por cierto, ¿dónde y cómo exactamente estás haciendo las modificaciones?
"It's not who I am underneath, but what I do that defines me"

zunou

#8
 :D Ya he encontrado el error,  ^_^' y aunque me dé corte admitirlo era muy tonto :-[ tan tonto como que estaba definiendo  'sid' dentro de la función, y claro, así como que no va  :-[.

Pues nada H-K, gracias por tu ayuda, y perdón por hacerte perder el tiempo :D, mira que no darme cuenta....

PD: suerte con Amnesia, gran juego :)

H-K

Ya te vale xDDDD Nada, nada, en realidad los fallos tontos son los peores, porque tendemos a asumir que no los cometemos :P. Me alegro de que lo solucionases al final. Si tienes cualquier otra duda sobre OpenAL, pues ya sabes :)

PD: gracias, pero debes esperar a jugarlo antes de decir nada :P Ya queda poquito poquito...
"It's not who I am underneath, but what I do that defines me"

zunou

 :D ya solo con el video se ve que es un buen juego, realmente acojona :D






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.