SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等)
下面介绍SoundPool的创建过程:
初始化一个实例:
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
创建了一个最多支持5个流同时播放的,类型标记为音乐的SoundPool。
这里需要注意的是,
1.play()函数传递的是一个load()返回的soundID——指向一个被记载的音频资源 ,如果播放成功则返回一个非0的streamID——指向一个成功播放的流 ;同一个soundID 可以通过多次调用play()而获得多个不同的streamID (只要不超出同时播放的最大数量);
2.pause()、resume()和stop()是针对播放流操作的,传递的是play()返回的streamID ;
3.play()中的priority参数,只在同时播放的流的数量超过了预先设定的最大数量是起作用,管理器将自动终止优先级低的播放流。如果存在多个同样优先级的流,再进一步根据其创建事件来处理,新创建的流的年龄是最小的,将被终止;
4.无论如何,程序退出时,手动终止播放并释放资源是必要的。
下面对以上进行总结:
一个SoundPool可以:
1.管理多个音频资源,通过load()函数,成功则返回非0的soundID;
2.同时播放多个音频,通过play()函数,成功则返回非0的streamID;
3.pause()、resume()和stop()等操作是针对streamID(播放流)的;
4.当设置为无限循环时,需要手动调用stop()来终止播放;
5.播放流的优先级(play()中的priority参数),只在同时播放数超过设定的最大数时起作用;
6.程序中不用考虑(play触发的)播放流的生命周期,无效的soundID/streamID不会导致程序错误。
下面是一个具体的实现实例,用到的音频文件都是Windows自带的音频文件,源代码如下:
public class MainActivity extends Activity { private Button button1; private Button button2; private Button button3; private Button button4; private Button button5; private SoundPool soundPool; private Map<Integer, Integer> soundMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1=(Button)findViewById(R.id.button1); button2=(Button)findViewById(R.id.button2); button3=(Button)findViewById(R.id.button3); button4=(Button)findViewById(R.id.button4); button5=(Button)findViewById(R.id.button5); //创建一个SoundPool对象,该对象可以容纳5个音频流 soundPool=new SoundPool(5,AudioManager.STREAM_MUSIC,0); soundMap=new HashMap<Integer, Integer>(); soundMap.put(1, soundPool.load(MainActivity.this, R.raw.ir_begin, 1)); soundMap.put(2, soundPool.load(MainActivity.this, R.raw.ir_end, 1)); soundMap.put(3, soundPool.load(MainActivity.this, R.raw.ir_inter, 1)); soundMap.put(4, soundPool.load(MainActivity.this, R.raw.tada, 1)); soundMap.put(5, soundPool.load(MainActivity.this, R.raw.zhong, 1)); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(1), 1, 1, 0, 0, 1); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(2), 1, 1, 0, 0, 1); } }); button3.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(3), 1, 1, 0, 0, 1); } }); button4.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(4), 1, 1, 0, 0, 1); } }); button5.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(5), 1, 1, 0, 0, 1); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub soundPool.play(soundMap.get(5), 1, 1, 0, 0, 1); return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }