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:
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.
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.