La scorsa notte, mentre lavoravo al mio progetto, ho dovuto implementare delle funzioni per la riproduzione di piccoli effetti sonori. In Android, la classe più adatta alla riprodurre effetti sonori brevi si chiama SoundPool. Attraverso questa classe è possibile caricare in memoria dei files audio dalle risorse all’interno dell’apk o dal filesystem in modo che questi siano subito disponibili per essere riprodotti. Il risultato sarà un effetto sonoro eseguito con bassa latenza (quindi verrà riprodotto all’istante) e senza rallentamenti di sistema.
Per maggiori informazioni potete dare un’occhiata a questa pagina.
Per riprodurre un paio di effetti sonori all’interno della mia app, ho implementato una classe con membri static chiamata SoundPlayer.
Per prima cosa dobbiamo caricare due suoni, che io ho chiamato sound1.wav e sound2.wav, all’interno di una cartella chiamata raw, posizionata all’interno della cartella delle risorse. I files saranno automaticamente richiamabili in questo modo: R.raw.nomefile (senza estensione).
Il primo dei due metodi della classe si chiama initSound; come spiega il nome, questo metodo inizializza la classe caricando in memoria i suoni in modo che essi siano subito disponibili.
Per rendere la scelta del suono da riprodurre più semplice, ho usato una HashMap in modo che questi siano richiamabili attraverso una chiave.
In fine, per riprodurre il suono, basta passare l’identificativo di quest’ultimo (1 o 2) all’interno della funzione playSound.
Per utilizzare la classe, dato che i metodi sono dichiarati static, non dobbiamo creare un’istanza dell’oggetto, ma basta semplicemente richiamare i suoi metodi. Per prima cosa dobbiamo inizializzare la classe in questo modo:
SoundPlayer.initSounds(this);
e per riprodurre il suono:
SoundPlayer.playSound(this, soundID);
dove soundID è l’identificativo del suono che in questo caso può essere 1 o 2.
Ecco la classe:
import java.util.HashMap; import android.content.Context; import android.media.AudioManager; import android.media.SoundPool; public class SoundPlayer { static private SoundPool soundPool; static private HashMap soundsMap; static private int SOUND1 = 1; static private int SOUND2 = 2; static public void initSounds(Context context) { soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100); soundsMap = new HashMap(); soundsMap.put(SOUND1, soundPool.load(context, R.raw.sound1, 1)); soundsMap.put(SOUND2, soundPool.load(context, R.raw.sound2, 1)); } static public void playSound(Context context, int soundID) { AudioManager mgr = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); float streamVolumeCurrent = mgr.getStreamVolume(AudioManager.STREAM_MUSIC); float streamVolumeMax = mgr.getStreamMaxVolume(AudioManager.STREAM_MUSIC); float volume = streamVolumeCurrent / streamVolumeMax; soundPool.play(soundsMap.get(soundID), volume, volume, 1, 0, 1f); } }