SoundPool循环播放
今天做项目让写一个循环播放音频文件功能,看了下网上的例子,也试了试他们的代码,总结来说有以下二个特点:
1.能放不能关的
2. 关掉后不能放的
然后自己看了看文档,自己写了一个小东西,供大家参考,如有错误,请指出来本人虚心改正。接下来请看
/**
* 音频播放管理器
*
* @author 79442
* @date 2018/2/2
*/
public class SoundPoolMgr {
@SuppressLint("StaticFieldLeak")
private static SoundPoolMgr INSTANCE;
private Context mContext;
private SoundPool mSoundPool;
//创建一个HashMap对象,使用HashMap管理各种音频
private HashMap<Integer, Integer> soundmap = new HashMap<Integer, Integer>();
private int streamID = -1;
//是否开始播放
private boolean disPlayer = false;
/**
*单例模式
*/
public static SoundPoolMgr getInstance(Context context) {
if (INSTANCE == null) {
INSTANCE = new SoundPoolMgr(context);
}
return INSTANCE;
}
private SoundPoolMgr(Context mContext) {
this.mContext = mContext;
// 第一个参数为同时播放数据流的最大个数,第二数据流类型,第三为声音质量;
mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
}
/**
*加载音频文件存储在map中
*/
public void load() {
// 把你的声音素材放到res/raw里,第2个参数即为资源文件,第3个为音乐的优先级;
soundmap.put(1, mSoundPool.load(mContext, R.raw.alert, 1));
}
/**
* Play a sound from a sound ID.
*
* @param soundID 通过load方法返回的音频
* @param leftVolume 左声道的音量
* @param rightVolume 右声道的音量
* @param priority 优先级,值越大,优先级越高
* @param loop 循环的次数:0为不循环,-1为循环
* @param rate 指定速率,正常位1,为地位0.5,最高位2
* @return non-zero streamID if successful, zero if failed
*/
public void player(int soundId) {
if (streamID != -1) {
autoResume();
}
if (!disPlayer) {
streamID = mSoundPool.play(soundmap.get(soundId), 1, 1, 1, -1, 1);
disPlayer = true;
}
}
/**
* 暂停
*@param streamID 为play后获得的音频流ID
*@param disPlayer 这个Boolean值是为了不让同时播放多个音频文件,如果有需求可以去掉
*/
public void pause() {
if (streamID != 0) {
if (disPlayer) {
mSoundPool.pause(streamID);
disPlayer = false;
}
}
}
/**
* 暂停正在播放的所有数据流
*/
public void autoPause() {
if (soundmap != null) {
mSoundPool.autoPause();
}
}
/**
* 自动恢复之前调用autoPause()时暂停的所有流
*/
private void autoResume() {
mSoundPool.autoResume();
}
}
好吧,我想说代码其实挺简单的,注释也基本都全了,收拾东西下班。