Android编程权威指南(第二版)第十九章-使用SoundPool播放音频

private static final int MAX_SOUNDS = 5;

private SoundPool mSoundPool; 

mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
//第一个参数指定同时播放多少个音频,当多余这个数时,会自动暂停原来的音频

//第二个参数确定音频流类型,Android有很多不同的音频流,它们都有各自独立的音量控制选项。

//最后一个参数指定采样率转换品质。参考文档说这个参数不起作用,所以这里传入0值。

 

private void load(Sound sound) throws IOException {
  AssetFileDescriptor afd = mAssets.openFd(sound.getAssetPath());
  int soundId = mSoundPool.load(afd, 1);
  sound.setSoundId(soundId);//类种的设置一个id属性,为Integer
}

调用mSoundPool.load(AssetFileDescriptor, int)方法可以把文件载入SoundPool待播。为方便管理、重播或卸载音频文件,mSoundPool.load(...)方法会返回一个int型ID。这实际就是存储在mSoundId中的ID。调用openFd(String)方法有可能抛出IOException,load(Sound)方法也是如此。

然后,对每个sound对象调用load(sound);//加载到SoundPool 。

public void play(Sound sound) {
  Integer soundId = sound.getSoundId(); //Integer是一个类,可以为NULL int不能为NULL
  if (soundId == null) {
    return;
   }
  mSoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
}

播放前要检查并确保soundId不是null值。Sound加载失败会导致soundId出现null值。检查通过以后,就可以调用SoundPool.play(int, float, float, int, int, float)方法播放音频了。这些参数依次是:音频ID、左音量、右音量、优先级(无效)、是否循环以及播放速率。我们需要最大音量和常速播放,所以传入值1.0。是否循环参数传入0值,代表不循环。(如果想无限循环,可以传入-1。我们觉得这会非常令人讨厌。)

 

音频播放完毕,应调用SoundPool.release()方法释放SoundPool

posted @ 2017-04-16 00:30  HeLing_CC  阅读(108)  评论(0)    收藏  举报