语音SDK进房动态选择逻辑优化

This commit is contained in:
huangjian
2021-04-19 14:32:24 +08:00
committed by zu
parent b93de9e8d2
commit 42a5b91739
6 changed files with 74 additions and 141 deletions

View File

@@ -10,7 +10,6 @@ import com.yizhuan.xchat_android_core.room.bean.RoomAudioSdkType;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.utils.LogUtils;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import io.agora.ktvkit.KTVKit;
import io.agora.rtc.Constants;
@@ -36,11 +35,10 @@ public class AudioEngineManager {
public void initRtcEngine(EngineType engineType) {
switch (engineType) {
case TYPE_WJ:
// if (iAudioEngine instanceof WJAudioEngineManager) return;
if (UserModel.get().getCacheLoginUserInfo() != null) {
WJAudioConstant.BUSINESS_UID = String.valueOf(UserModel.get().getCacheLoginUserInfo().getErbanNo());
}
this.iAudioEngine = new WJAudioEngineManager(BasicConfig.INSTANCE.getAppContext());
this.iAudioEngine = WJAudioEngineManager.get();
break;
case TYPE_AGORA:
default:
@@ -50,9 +48,10 @@ public class AudioEngineManager {
}
public void startRtcEngine(long uid, String audioSdkType) {
LogUtils.d("audioSdkType= "+audioSdkType);
LogUtils.d("audioSdkType= " + audioSdkType);
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (curRoomInfo == null) return;
if (iAudioEngine != null) iAudioEngine.leaveChannel();
if (RoomAudioSdkType.WUJIE.equals(audioSdkType)) {
AudioEngineManager.get().initRtcEngine(EngineType.TYPE_WJ);
} else {

View File

@@ -1,12 +1,9 @@
package com.yizhuan.xchat_android_core.manager;
import android.content.Context;
import java.util.ArrayList;
import java.util.List;
public abstract class BaseEngine implements IAudioEngine {
protected Context context;
/**
* 角色-主播
*/
@@ -49,8 +46,7 @@ public abstract class BaseEngine implements IAudioEngine {
*/
public volatile boolean isMusicPlaying = false;
public BaseEngine(Context context) {
this.context = context;
public BaseEngine() {
this.speakQueueMembersPosition = new ArrayList<>();
}

View File

@@ -3,14 +3,11 @@ package com.yizhuan.xchat_android_core.manager.agora;
import android.os.Message;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_core.BuildConfig;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import java.lang.ref.WeakReference;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
@@ -21,21 +18,10 @@ public class EngineEventHandler extends IRtcEngineEventHandler {
public static String TAG = EngineEventHandler.class.getSimpleName();
private WeakReference<RtcEngineManager> mReference;
EngineEventHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
}
@Override
public void onError(int err) {
super.onError(err);
Logger.t(TAG).d("onError" + err);
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) {
return;
}
switch (err) {
case 1107: {
SingleToastUtil.showToast("发生未知错误,请退出房间重新进入");
@@ -53,7 +39,7 @@ public class EngineEventHandler extends IRtcEngineEventHandler {
super.onJoinChannelSuccess(channel, uid, elapsed);
Logger.t(TAG).d("onJoinChannelSuccess" + channel + "uid:" + uid);
//声网进入频道成功日志
RtcEngineManager manager = mReference.get();
RtcEngineManager manager = RtcEngineManager.get();
if (manager != null) {
Message message = manager.mRtcEngineHandler.obtainMessage();
message.what = RtcEngineHandler.notifyJoinAvRoom;
@@ -115,26 +101,22 @@ public class EngineEventHandler extends IRtcEngineEventHandler {
@Override
public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) {
super.onAudioVolumeIndication(speakers, totalVolume);
RtcEngineManager manager = mReference.get();
if (manager != null) {
Message message = manager.mRtcEngineHandler.obtainMessage();
message.what = RtcEngineHandler.onAudioVolumeIndication;
message.obj = speakers;
manager.mRtcEngineHandler.sendMessage(message);
}
RtcEngineManager manager = RtcEngineManager.get();
Message message = manager.mRtcEngineHandler.obtainMessage();
message.what = RtcEngineHandler.onAudioVolumeIndication;
message.obj = speakers;
manager.mRtcEngineHandler.sendMessage(message);
}
@Override
public void onUserMuteAudio(int uid, boolean muted) {
super.onUserMuteAudio(uid, muted);
RtcEngineManager manager = mReference.get();
if (manager != null) {
if (muted) {
Message message = manager.mRtcEngineHandler.obtainMessage();
message.what = RtcEngineHandler.onUserMuteAudio;
message.obj = uid;
manager.mRtcEngineHandler.sendMessage(message);
}
RtcEngineManager manager = RtcEngineManager.get();
if (muted) {
Message message = manager.mRtcEngineHandler.obtainMessage();
message.what = RtcEngineHandler.onUserMuteAudio;
message.obj = uid;
manager.mRtcEngineHandler.sendMessage(message);
}
}
@@ -143,7 +125,7 @@ public class EngineEventHandler extends IRtcEngineEventHandler {
super.onClientRoleChanged(oldRole, newRole);
//角色切换 麦克风切换
if (newRole == Constants.CLIENT_ROLE_BROADCASTER) {
mReference.get().setMute(mReference.get().isMute);
RtcEngineManager.get().setMute(RtcEngineManager.get().isMute);
}
}
@@ -169,15 +151,9 @@ public class EngineEventHandler extends IRtcEngineEventHandler {
public void onRemoteAudioStats(RemoteAudioStats remoteAudioStats) {
super.onRemoteAudioStats(remoteAudioStats);
Logger.t(TAG).d("onRemoteAudioStats uid%d", remoteAudioStats.uid);
long uid = (long) remoteAudioStats.uid;
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) {
return;
}
// 如果麦上没有这个人,不接收这个人的声音
rtcEngineManager.setRemoteMute(uid, !AvRoomDataManager.get().checkIsOnMicByAccount(uid + ""));
RtcEngineManager.get().setRemoteMute(uid, !AvRoomDataManager.get().checkIsOnMicByAccount(uid + ""));
}
}

View File

@@ -12,8 +12,9 @@ import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.lang.ref.WeakReference;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
@@ -31,16 +32,10 @@ public class RtcEngineHandler extends Handler {
public static int onAudioVolumeIndication = 1;
public static int onUserMuteAudio = 2;
private WeakReference<RtcEngineManager> mReference;
RtcEngineHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
}
@Override
public void handleMessage(Message msg) {
public void handleMessage(@NotNull Message msg) {
super.handleMessage(msg);
RtcEngineManager rtcEngineManager = mReference.get();
RtcEngineManager rtcEngineManager = RtcEngineManager.get();
if (rtcEngineManager == null) return;
if (msg.what == notifyJoinAvRoom) {
if (!rtcEngineManager.inRoom) {

View File

@@ -5,6 +5,9 @@ import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.manager.BaseEngine;
@@ -27,17 +30,19 @@ import static io.agora.rtc.Constants.AUDIO_SCENARIO_GAME_STREAMING;
*/
public class RtcEngineManager extends BaseEngine {
public static String TAG = RtcEngineManager.class.getSimpleName();
@Nullable
public RtcEngine mRtcEngine;
public Handler mRtcEngineHandler = new RtcEngineHandler(this);
public EngineEventHandler mEngineEventHandler = new EngineEventHandler(this);
@NonNull
public final Handler mRtcEngineHandler = new RtcEngineHandler();
@NonNull
public final EngineEventHandler mEngineEventHandler = new EngineEventHandler();
private static final class Helper {
private static final RtcEngineManager INSTANCE = new RtcEngineManager();
}
private RtcEngineManager( ) {
super(BasicConfig.INSTANCE.getAppContext());
private RtcEngineManager() {
super();
}
public static RtcEngineManager get() {
@@ -46,11 +51,6 @@ public class RtcEngineManager extends BaseEngine {
@Override
public void enterChannel(long channelId, long uid) {
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = false;
Logger.t(TAG).d("enterChannel channelId:%d", channelId);
if (mRtcEngine == null) {
try {
@@ -73,13 +73,7 @@ public class RtcEngineManager extends BaseEngine {
mRtcEngine.setLogFile(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName()
+ "/log/agora-rtc.log");
}
//先清除频道信息
//stopAudioMixing();
//mRtcEngine.leaveChannel();
mRtcEngine.joinChannel(null, String.valueOf(channelId), null, (int) uid);
}
@@ -103,9 +97,7 @@ public class RtcEngineManager extends BaseEngine {
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (mRtcEngineHandler != null) {
mRtcEngineHandler.removeCallbacksAndMessages(null);
}
mRtcEngineHandler.removeCallbacksAndMessages(null);
}
@Override
@@ -125,18 +117,12 @@ public class RtcEngineManager extends BaseEngine {
RtcEngine.destroy();
mRtcEngine = null;
}
if (mRtcEngineHandler != null) {
mRtcEngineHandler.removeCallbacksAndMessages(null);
}
if (mEngineEventHandler != null) {
mEngineEventHandler = null;
}
isMute = true;
mRtcEngineHandler.removeCallbacksAndMessages(null);
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = true;
isAudienceRole = false;
}
@Override
@@ -242,7 +228,7 @@ public class RtcEngineManager extends BaseEngine {
return -1;
}
mRtcEngine.stopAudioMixing();
int result = 0;
int result;
try {
result = mRtcEngine.startAudioMixing(filePath, loopback, false, cycle);
} catch (Exception e) {
@@ -271,8 +257,7 @@ public class RtcEngineManager extends BaseEngine {
if (mRtcEngine == null) {
return -1;
}
int audioMixingDuration = mRtcEngine.getAudioMixingDuration();
return audioMixingDuration;
return mRtcEngine.getAudioMixingDuration();
}

View File

@@ -1,11 +1,13 @@
package com.yizhuan.xchat_android_core.manager.wj;
import android.content.Context;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.wjhd.wy.WJMediaEngine;
import com.wjhd.wy.audio.AudioEngine;
@@ -20,6 +22,7 @@ import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_library.utils.SingleToastUtil;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import org.jetbrains.annotations.NotNull;
@@ -33,33 +36,37 @@ public class WJAudioEngineManager extends BaseEngine {
public static final String TAG = "WJAudioEngineManager";
private String logfileDir;
@Nullable
private AudioEngine mAudioEngine;
private AudioEngineHandler audioEngineHandler;
@NonNull
private final AudioEngineHandler audioEngineHandler = new AudioHandler();
private AudioRole curRole;
private boolean isServerKicked = false;
private boolean isChaRoomInChannel = false;
private final AtomicInteger lock = new AtomicInteger(0);
public WJAudioEngineManager(Context context) {
super(context);
Log.e(TAG, "WJAudioEngineManager: " + WJMediaEngine.getVersion());
isAudienceRole = true;
private static final class Helper {
private static final WJAudioEngineManager INSTANCE = new WJAudioEngineManager();
}
private WJAudioEngineManager() {
super();
}
public static WJAudioEngineManager get() {
return WJAudioEngineManager.Helper.INSTANCE;
}
private void initRtcEngine() {
WJAudioConstant.LOG_DIR = logfileDir = Environment.getExternalStorageDirectory().getPath() + File.separator + context.getPackageName() + File.separator + "log";
if (audioEngineHandler == null) {
audioEngineHandler = new AudioHandler(this);
}
WJAudioConstant.LOG_DIR = logfileDir = Environment.getExternalStorageDirectory().getPath() + File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName() + File.separator + "log";
if (mAudioEngine == null) {
try {
AudioEngine.setRecordingAudioFrameParameters(44100, 2);
AudioEngine.setLogFileDir(logfileDir);
AudioEngine.setDebugMode(BuildConfig.DEBUG);//设置是否调试模式底层默认是false
mAudioEngine = WJMediaEngine.createAudioEngine(context, WJAudioConstant.APPID, audioEngineHandler);
mAudioEngine = WJMediaEngine.createAudioEngine(BasicConfig.INSTANCE.getAppContext(), WJAudioConstant.APPID, audioEngineHandler);
} catch (Exception e) {
throw new RuntimeException("NEED TO check sdk init fatal error" + Log.getStackTraceString(e));
}
@@ -122,19 +129,11 @@ public class WJAudioEngineManager extends BaseEngine {
private static class AudioHandler extends AudioEngineHandler {
private WeakReference<WJAudioEngineManager> mReference;
private boolean isEnter;
AudioHandler(WJAudioEngineManager manager) {
mReference = new WeakReference<>(manager);
isEnter = false;
}
@Override
public void onError(int err) {
if (err == ErrorCode.LOGIN_JOIN_CHANNEL_ERROR) {
WJAudioEngineManager manager = mReference.get();
WJAudioEngineManager manager = WJAudioEngineManager.get();
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_ENTER_CHANNEL_FAIL;
message.obj = err;
@@ -146,15 +145,13 @@ public class WJAudioEngineManager extends BaseEngine {
@Override
public void onJoinChannelSuccess(long channel, long uid, int elapsed) {
super.onJoinChannelSuccess(channel, uid, elapsed);
WJAudioEngineManager manager = mReference.get();
if (manager != null) {
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_ENTER_CHANNEL_SUCCESS;
manager.handler.sendMessage(message);
manager.isServerKicked = false;
manager.channelId = channel;
manager.uid = uid;
}
WJAudioEngineManager manager = WJAudioEngineManager.get();
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_ENTER_CHANNEL_SUCCESS;
manager.handler.sendMessage(message);
manager.isServerKicked = false;
manager.channelId = channel;
manager.uid = uid;
}
@Override
@@ -174,13 +171,11 @@ public class WJAudioEngineManager extends BaseEngine {
@Override
public void onAudioVolumeIndication(AudioVolumeInfo[] speakers) {
super.onAudioVolumeIndication(speakers);
WJAudioEngineManager manager = mReference.get();
if (manager != null) {
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_AUDIO_VOLUME_INDICATION;
message.obj = speakers;
manager.handler.sendMessage(message);
}
WJAudioEngineManager manager = WJAudioEngineManager.get();
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_AUDIO_VOLUME_INDICATION;
message.obj = speakers;
manager.handler.sendMessage(message);
}
@Override
@@ -192,21 +187,14 @@ public class WJAudioEngineManager extends BaseEngine {
@Override
public void onClientRoleChanged(AudioRole oldRole, AudioRole newRole) {
super.onClientRoleChanged(oldRole, newRole);
WJAudioEngineManager manager = mReference.get();
if (manager == null) {
return;
}
manager.curRole = newRole;
WJAudioEngineManager.get().curRole = newRole;
}
@Override
public void onOfflineTimeOut(long channel, long uid) {
super.onOfflineTimeOut(channel, uid);
Log.e(TAG, "onOfflineTimeOut~~~");
WJAudioEngineManager manager = mReference.get();
if (manager == null) {
return;
}
WJAudioEngineManager manager = WJAudioEngineManager.get();
synchronized (manager.lock) {
manager.isServerKicked = true;
}
@@ -220,7 +208,7 @@ public class WJAudioEngineManager extends BaseEngine {
@Override
public void OnMicUniqueIDUpdate(String micUniqueID) {
super.OnMicUniqueIDUpdate(micUniqueID);
Log.e(TAG, "OnMicUniqueIDUpdate~~~" );
Log.e(TAG, "OnMicUniqueIDUpdate~~~");
}
}
@@ -232,9 +220,6 @@ public class WJAudioEngineManager extends BaseEngine {
AudioEngine.destroy();
mAudioEngine = null;
}
if (audioEngineHandler != null) {
audioEngineHandler = null;
}
isMute = false;
isRemoteMute = false;
needRecord = false;
@@ -266,14 +251,11 @@ public class WJAudioEngineManager extends BaseEngine {
}
WJMediaEngine.destroyAudioEngine();
mAudioEngine = null;
if (audioEngineHandler != null) {
audioEngineHandler = null;
}
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = true;
isAudienceRole = false;
curRole = AudioRole.NO_ROLE;
}