SoundPool简介


Android 中除了 MediaPlayer 播放音频之外还提供了 SoundPool 来播放音效, SoundPool 使用音效池的概念来管理多个短促的音效,例如它可以开始就加载 20 个音效,以后在程序中按音效的 ID 进行播放。
一、SoundPool的特点


SoundPool 主要用于播放一些较短的声音片段,与 MediaPlayer 相比, SoundPool 的优势在于 CPU 资源占用量低和反应延迟小。另外, SoundPool 还支持自行设置声音的品质、音量、 播放比率等参数。


SoundPool 提供了一个构造器, 该构造器可以指定它总共支持多少个声音(也就是池的大小)、声音的品质等。构造器如下 :


SoundPool(int maxStreams, int streamType, int srcQuality) :第一个参数指定支持多少个声音;第二个参数指定声音类型:第三个参数指定声音品质。


二、SoundPool的初始化
一旦得到了 SoundPool 对象之后,接下来就可调用 SoundPool 的多个重载的 load 方法来加载声音了 。


SoundPool 提供了如下 4 个 load 方法:


int load(Context context, int resld, int priority) :从 resld 所对应的资源加载声音。


int load(FileDescriptor fd, long offset, long length, int priority ) :加载 fd 所对应的文件的 offset 开始、长度为 length 的声音。


int load(AssetFileDescriptor afd, int priority) :从 afd 所对应的文件中加载声音。


int load(String path, int priority ) :从 path 对应的文件去加载声音。


上面 4 个方法中都有一个 priority 参数,该参数目前还没有任何作用, Android 建议将该 参数设为 1 ,保持和未来的兼容性。


上面 4 个方法加载声音之后,都会返回该声音的的 ID ,以后程序就可以通过该声音的 ID 来播放指定声音。




三、SoundPool播放指定声音的方法:


int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) :该方法的第一个参数指定播放哪个声音; leftVolume 、 rightVolume 指定左、右的音量: priority 指定播放声音的优先级,数值越大,优先级越高; loop 指定是否循环, 0 为不循环, -1 为循环; rate 指定播放的比率,数值可从 0.5 到 2 , 1 为正常比率。


为了更好地管理 SoundPool 所加载的每个声音的 1D ,程序一般会使用一个 HashMap<Integer , Integer> 对象来管理声音。


归纳起来,使用 SoundPool 播放声音的步骤如下:


1、调用 SoundPool 的构造器创建 SoundPool 的对象。


2、调用 SoundPool 对象的 load() 方法从指定资源、文件中加载声音。最好使用 HashMap< Integer, Integer> 来管理所加载的声音。


3、调用 SoundPool 的 play 方法播放声音。


下面的程序示范了如何使用 SoundPool 来播放音效。

程序代码如下:

//声明变量
    	 SoundPool mSoundPool;
    	 //播放动作声音id
         int mPlaySound;
         //停止动作播放声音id
         int mPauseSound;
         //实例化SoundPool
    	 mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);
    	 //初始化播放动作音频
         mPlaySound = mSoundPool.load("/system/media/audio/ui/SoundRecorderPlay.ogg", 1);
         //初始化停止播放动作音频
         mPauseSound = mSoundPool.load("/system/media/audio/ui/SoundRecorderPause.ogg", 1);
         
         //播放 播放动作音频
         mSoundPool.play(mPlaySound, 1.0f, 1.0f, 0, 0, 1);
         //播放 停止播放动作音频
         mSoundPool.play(mPauseSound, 1.0f, 1.0f, 0, 0, 1);