Sonido en Android: SoundPool y MediaPlayer

Cuando dentro de una aplicación Android, se desea incorporar efectos sonoros (sfx) o una música, hay dos clases que podemos usar. ¿Cuál es coger en cada caso?

SoundPool: Esta diseñado para efectos sonoros cortos, que pueden ser mantenidos en memoria para accesos rápidos. Este es el mejor método para efectos de juegos o aplicaciones. Usar este método con música de fondo o sonidos de medio tamaño es un gran error, ya que es muy probable que excedas el limite de memoria fijado por android para las aplicaciones (16Mb) y consigas un OutOfMemoryException

Ejemplo de uso de SoundPool:

public static final int SOUND_EXPLOSION = 1;

private SoundPool soundPool;
private HashMap soundPoolMap;

private void initSounds() {
     soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
     soundPoolMap = new HashMap();
     soundPoolMap.put(SOUND_EXPLOSION, soundPool.load(getContext(), R.raw.explosion, 1));
}

public void playSound(int sound) {
    /* Updated: The next 4 lines calculate the current volume in a scale of 0.0 to 1.0 */
    AudioManager mgr = (AudioManager)getContext().getSystemService(Context.AUDIO_SERVICE);
    float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC);
    float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    float volume = streamVolumeCurrent / streamVolumeMax;

    /* Play the sound with the correct volume */
    soundPool.play(soundPoolMap.get(sound), volume, volume, 1, 0, 1f);
}

public void explode() {
    playSound(SOUND_EXPLOSION);
}

MediaPlayer: Está diseñado para música o sonidos de medio tamaño. Estos sonidos son cargados en disco y llamados cada vez que se necesitan pero sin consumir memoria de manera continuada. Cada vez que son llamados estos sonidos, se crea un pequeño delay o retardo que hay que tener en cuenta en las musicas de fondos (estoy investigando una posible solucion para el looping de un media player, ya que parece ser que Android tiene un bug en este parte, mas info http://code.google.com/p/android/issues/detail?id=18756).

Ejemplo de uso de un MediaPlayer:

//creaccion del MediaPlayer
MediaPlayer mp = MediaPlayer.create(ClassName.this, R.raw.sound);
//Arrancar MediaPlayer
mp.start();  

//ejemplo de pausa y continuacion del audio desde el lugar que se quedo
mp.pause();
mp.start();   

//parar la musica y comenzar de nuevo desde el inicio
mp.stop();
mp.start();   

//Muy importante liberar la memoria cuando se finalice su uso
mp.release();

En la siguiente imagen podemos ver la maquina de estados del MediaPlayer

maquina de estados MediaPlayer

This entry was posted in Android. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *