SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件。
创建SoundPool的示例代码如下:
.............
public BeatBox(Context context) {
mAssetManager = context.getAssets();
if (Build.VERSION.SDK_INT >= 21) {
//SDK_INT >= 21时,才能使用SoundPool.Builder创建SoundPool
SoundPool.Builder builder = new SoundPool.Builder();
//可同时播放的音频流
builder.setMaxStreams(MAX_SOUNDS);
//音频属性的Builder
AudioAttributes.Builder attrBuild = new AudioAttributes.Builder();
//音频类型
attrBuild.setLegacyStreamType(AudioManager.STREAM_MUSIC);
builder.setAudioAttributes(attrBuild.build());
mSoundPool = builder.build();
} else {
//低版本的构造方法,已经deprecated了
mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
}
loadSounds();
}
.............
SoundPool播放音频前,需要先加载对应的音频文件,示例代码如下:
public void soundPoolPreload() throws IOException {
for (Sound sound : mSounds) {
//sound中含有Assets中的音频文件地址
//利用AssetManager的接口得到音频文件的afd
AssetFileDescriptor afd = mAssetManager.openFd(sound.getAssetPath());
//SoundPool加载音频文件后,将返回一个int类型的id
//该id与对应音频文件一一对应
//load接口的后一个参数表示优先级
int soundId = mSoundPool.load(afd, 1);
sound.setSoundId(soundId);
sound.setBeLoaded(true);
}
}
加载完音频后,就可以进行播放,示例代码如下:
public void play(Sound sound) {
//得到音频文件对应的id
Integer soundId = sound.getSoundId();
if (soundId == null) {
return;
}
//参数为:音频ID、左声道音量、右声道音量、优先级、是否循环及播放速率
mSoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
}
最后,释放音频的示例代码如下:
public void release() {
mSoundPool.release();
}