Recientemente adquirí una actualización de Samsung Galaxy S, Android 2.1 y después de ejecutar mi aplicación encontré que algunos de los efectos de sonido se reproducen dos veces al mismo tiempo. Esto es extraño porque los efectos de sonido que exhiben este comportamiento parecen aleatorios: en algunos casos, algunos tocarán dos veces en otros y tocarán una vez como se esperaba. Este error no se ha informado en ninguna otra plataforma de hardware para mi aplicación. Solo he visto un incidente informado de esto en este sitio y la persona cambió a usar MediaPlayer, pero realmente quiero obtener un remedio para esto.Problema con Soundpool y Samsung Galaxy S
Cuando la aplicación se ejecuta inicia la Soundpool de la siguiente manera,
fxpublic static final int SOUND_EXPLOSION = 1;
public static final int SOUND_CLEAR = 2;
public static final int SOUND_CLICK = 3;
public static final int SOUND_MAGIC = 4;
public static final int SOUND_ROCKET = 5;
public static final int SOUND_MELT = 6;
private SoundPool soundPool;
private AudioManager mgr;
private HashMap<Integer, Integer> soundPoolMap;
private void initSounds()
{
soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
soundPoolMap = new HashMap<Integer, Integer>();
soundPoolMap.put(SOUND_EXPLOSION, soundPool.load(getContext(), R.raw.explosion3, 1));
soundPoolMap.put(SOUND_CLEAR, soundPool.load(getContext(), R.raw.pop, 1));
soundPoolMap.put(SOUND_CLICK, soundPool.load(getContext(), R.raw.click, 1));
soundPoolMap.put(SOUND_MAGIC, soundPool.load(getContext(), R.raw.swoosh, 1));
soundPoolMap.put(SOUND_ROCKET, soundPool.load(getContext(), R.raw.rocket, 1));
soundPoolMap.put(SOUND_MELT, soundPool.load(getContext(), R.raw.melt3, 1));
mgr = (AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE);
}
sonido son entonces jugó llamando a los siguientes sub, (PlaySound es un mundial conmutado por las opciones de usuario)
public void playSound(int sound)
{
if (PlaySound == true)
{
Log.w("playSound","Playing Sound" + sound);
float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = streamVolumeCurrent/streamVolumeMax;
soundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);
}
}
Como puede ver, hay una llamada de registro que solía ver cuántas veces se había llamado al submarinista, aunque esto reveló que cuando se produce el error, la rutina solo se invoca una vez cuando el sonido se escucha dos veces desde el dispositivo.
También tengo un último sub que se llama cuando se destruye la vista de superficie para poner en orden.
public void ReleaseSounds()
{
if (soundPool != null)
{
soundPool.release();
soundPool = null;
}
}
¿Alguien más ha tenido este problema, de ser así cómo lo resolvió? Cualquier ayuda en esto sería muy apreciada,
Muchas gracias de antemano
Ok, es temprano pero el problema parece haberse ido. Los archivos de sonido en la carpeta raw eran una mezcla de wav y mp3 (los formatos originales), desde entonces los he convertido al formato OGG y desde las pruebas iniciales parece más estable. – Steven