package com.netease.nim.demo.avchat;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.SoundPool;
import com.netease.nim.demo.DemoCache;
import com.netease.nim.demo.R;
import com.netease.nim.uikit.common.util.log.LogUtil;
/**
* SoundPool 铃声尽量不要超过1M
* 在不同的系统下 SoundPool 表现可能存在不一致
*/
public class AVChatSoundPlayer {
private static final String TAG = "AVChatSoundPlayer";
public enum RingerTypeEnum {
CONNECTING,
NO_RESPONSE,
PEER_BUSY,
PEER_REJECT,
RING,
;
}
private Context context;
private SoundPool soundPool;
private AudioManager audioManager;
private int streamId;
private int soundId;
private boolean loop;
private RingerTypeEnum ringerTypeEnum;
private boolean isRingModeRegister = false;
private int ringMode = -1;
private static AVChatSoundPlayer instance = null;
private RingModeChangeReceiver ringModeChangeReceiver;
public static AVChatSoundPlayer instance() {
if(instance == null) {
synchronized (AVChatSoundPlayer.class) {
if(instance == null) {
instance = new AVChatSoundPlayer();
}
}
}
return instance;
}
public AVChatSoundPlayer() {
this.context = DemoCache.getContext();
}
public synchronized void play(RingerTypeEnum type) {
LogUtil.d(TAG, "play type->" + type.name());
this.ringerTypeEnum = type;
int ringId = 0;
switch (type) {
case NO_RESPONSE:
ringId = R.raw.avchat_no_response;
loop = false;
break;
case PEER_BUSY:
ringId = R.raw.avchat_peer_busy;
loop = false;
break;
case PEER_REJECT:
ringId = R.raw.avchat_peer_reject;
loop = false;
break;
case CONNECTING:
ringId = R.raw.avchat_connecting;
loop = true;
break;
case RING:
ringId = R.raw.avchat_ring;
loop = true;
break;
}
if(ringId != 0) {
play(ringId);
}
}
public void stop() {
LogUtil.d(TAG, "stop");
if (soundPool != null) {
if (streamId != 0) {
soundPool.stop(streamId);
streamId = 0;
}
if (soundId != 0) {
soundPool.unload(soundId);
soundId = 0;
}
}
if (isRingModeRegister) {
registerVolumeReceiver(false);
}
}
private void play(int ringId) {
initSoundPool();
if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {
soundId = soundPool.load(context, ringId, 1);
}
}
private void initSoundPool() {
stop();
if (soundPool == null) {
soundPool = new SoundPool(1, AudioManager.STREAM_RING, 0);
soundPool.setOnLoadCompleteListener(onLoadCompleteListener);
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
ringMode = audioManager.getRingerMode();
}
registerVolumeReceiver(true);
}
SoundPool.OnLoadCompleteListener onLoadCompleteListener = new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
if (soundId != 0 && status == 0) {
if (audioManager.getRingerMode() == AudioManager.RINGER_MODE_NORMAL) {
int curVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING);
streamId = soundPool.play(soundId, curVolume, curVolume, 1, loop ? -1 : 0, 1f);
}
}
}
};
private void registerVolumeReceiver(boolean register){
if (ringModeChangeReceiver == null) {
ringModeChangeReceiver = new RingModeChangeReceiver() ;
}
if (register) {
isRingModeRegister = true;
IntentFilter filter = new IntentFilter() ;
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION) ;
context.registerReceiver(ringModeChangeReceiver, filter) ;
} else {
context.unregisterReceiver(ringModeChangeReceiver);
isRingModeRegister = false;
}
}
private class RingModeChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (ringMode != -1 && ringMode != audioManager.getRingerMode()
&& intent.getAction().equals(AudioManager.RINGER_MODE_CHANGED_ACTION)) {
ringMode = audioManager.getRingerMode();
play(ringerTypeEnum);
}
}
}
}