新增无界语音直播SDK

This commit is contained in:
huangjian
2021-04-15 18:45:27 +08:00
committed by zu
parent 182ae72d64
commit cc54f69852
31 changed files with 1702 additions and 194 deletions

View File

@@ -155,7 +155,7 @@ import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMBroadcastManager;
import com.yizhuan.xchat_android_core.manager.IMMessageManager;
import com.yizhuan.xchat_android_core.manager.RoomEvent;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel;
import com.yizhuan.xchat_android_core.market_verify.event.MarketVerifyUpdateEvent;
import com.yizhuan.xchat_android_core.miniworld.bean.OpenAudioPartyAttachment;
@@ -835,9 +835,9 @@ public class MainActivity extends BaseMvpActivity<IMainView, MainPresenter>
public void exitRoom(RoomInfo roomInfo) {
closeOpenRoomAnimation();
//ktv退出的时候需要用到
if (RtcEngineManager.get().isOpenKtv() && roomInfo != null) {
if (AudioEngineManager.get().isOpenKtv() && roomInfo != null) {
KtvMusicManager.INSTANCE.deleteUserAllChooseMusic(roomInfo.getUid()).subscribe();
RtcEngineManager.get().closeKtvModel();
AudioEngineManager.get().closeKtvModel();
}
DaemonService.stop(MainActivity.this);
}

View File

@@ -83,6 +83,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.RoomInviteFansInfo;
import com.yizhuan.xchat_android_core.initial.InitialModel;
import com.yizhuan.xchat_android_core.interceptor.NoParamsInterceptor;
import com.yizhuan.xchat_android_core.interceptor.ParamsInterceptor;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.manager.IMMessageManager;
import com.yizhuan.xchat_android_core.manager.IMSystemMsgManager;
import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel;

View File

@@ -97,7 +97,7 @@ public class MyVoiceActivity extends BaseMvpActivity<IMyVoiceView, MyVoicePresen
}
private void playVoice(String voice) {
// RtcEngineManager.get().setOpenVoiceMatchActivity(true);
// AudioEngineManager.get().setOpenVoiceMatchActivity(true);
// PlayerModel.get().pause();
AudioPlayerHelper.get().playInThread(voice, new com.yizhuan.erban.audio.helper.OnPlayListener() {
@Override
@@ -121,7 +121,7 @@ public class MyVoiceActivity extends BaseMvpActivity<IMyVoiceView, MyVoicePresen
@Override
public void onCompletion() {
// RtcEngineManager.get().setOpenVoiceMatchActivity(false);
// AudioEngineManager.get().setOpenVoiceMatchActivity(false);
// PlayerModel.get().play(null);
if (adapter != null) {
adapter.changePlayState(false);// 播放完成
@@ -131,7 +131,7 @@ public class MyVoiceActivity extends BaseMvpActivity<IMyVoiceView, MyVoicePresen
}
private void stopVoice() {
// RtcEngineManager.get().setOpenVoiceMatchActivity(false);
// AudioEngineManager.get().setOpenVoiceMatchActivity(false);
// PlayerModel.get().play(null);
AudioPlayerHelper.get().endPlay();
adapter.changePlayState(false);// 点击停止播放
@@ -191,7 +191,7 @@ public class MyVoiceActivity extends BaseMvpActivity<IMyVoiceView, MyVoicePresen
// if (isPlaying) {
// PlayerModel.get().play(null);
// }
// RtcEngineManager.get().setOpenVoiceMatchActivity(false);
// AudioEngineManager.get().setOpenVoiceMatchActivity(false);
AudioPlayerHelper.get().onDestroy();
adapter.changePlayState(false);// onDestroy() 停止播放
}

View File

@@ -3,7 +3,6 @@ package com.yizhuan.erban.audio;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import androidx.constraintlayout.widget.Group;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -15,6 +14,8 @@ import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.constraintlayout.widget.Group;
import com.opensource.svgaplayer.SVGACallback;
import com.opensource.svgaplayer.SVGAImageView;
import com.trello.rxlifecycle3.android.ActivityEvent;
@@ -39,7 +40,6 @@ import com.yizhuan.xchat_android_core.audio.AudioModel;
import com.yizhuan.xchat_android_core.audio.bean.HistoryVoiceInfo;
import com.yizhuan.xchat_android_core.audio.bean.VoiceMatchInfo;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.music.model.PlayerModel;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
@@ -635,7 +635,6 @@ public class VoiceMatchActivity extends BaseActivity implements View.OnClickList
@Override
protected void onResume() {
super.onResume();
RtcEngineManager.get().setOpenVoiceMatchActivity(true);
PlayerModel.get().pause();
VmSoundManager.get().onResume(status -> {
if (status == VmSoundManager.ConstantStatus.playing ||
@@ -648,7 +647,6 @@ public class VoiceMatchActivity extends BaseActivity implements View.OnClickList
@Override
protected void onPause() {
super.onPause();
RtcEngineManager.get().setOpenVoiceMatchActivity(false);
PlayerModel.get().play(null);
VmSoundManager.get().onPause(status -> {
if (status == VmSoundManager.ConstantStatus.playing ||

View File

@@ -80,7 +80,6 @@ import com.yizhuan.xchat_android_core.im.game.ImGameMode;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterHuntingResult;
import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterInfo;
import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterProtocol;
@@ -336,7 +335,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
viewpager = findViewById(R.id.viewpager);
shade = findViewById(R.id.view);
RtcEngineManager.get().setOpenAVRoomActivity(true);
IMNetEaseManager.get().getChatRoomEventObservable()
.compose(bindToLifecycle())
@@ -981,8 +979,6 @@ public class AVRoomActivity extends BaseMvpActivity<IAvRoomView, AvRoomPresenter
svgaRoomBg.clearAnimation();
}
EventBus.getDefault().unregister(this);
RtcEngineManager.get().setOpenAVRoomActivity(false);
if (giftDialog != null && giftDialog.isShowing()) {
giftDialog.setOnDismissListener(null);
giftDialog.dismiss();

View File

@@ -136,7 +136,7 @@ import com.yizhuan.xchat_android_core.magic.bean.MagicInfo;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.market_verify.MarketVerifyModel;
import com.yizhuan.xchat_android_core.mentoring_relationship.event.MentoringCountingEvent;
import com.yizhuan.xchat_android_core.mentoring_relationship.event.MentoringCountingFinishEvent;
@@ -1217,7 +1217,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
bottomView.showInputOrIcon(isOnMic);
bottomView.showGameBottom();
// 更新听筒消息
bottomView.setRemoteMuteOpen(!RtcEngineManager.get().isRemoteMute);
bottomView.setRemoteMuteOpen(!AudioEngineManager.get().isRemoteMute());
}
private void checkMiniWorld() {
@@ -1248,7 +1248,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
private void updateMicBtn() {
RoomInfo currentRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (currentRoomInfo != null) {
if (RtcEngineManager.get().isAudienceRole) {
if (AudioEngineManager.get().isAudienceRole()) {
bottomView.setMicBtnEnable(false);
bottomView.setMicBtnOpen(false);
} else {
@@ -1264,13 +1264,13 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
bottomView.setMicBtnOpen(false);
} else {
bottomView.setMicBtnEnable(true);
if (RtcEngineManager.get().isMute) {
if (AudioEngineManager.get().isMute()) {
bottomView.setMicBtnOpen(false);
} else {
//获取当前是否有麦克风权限
boolean isPermission = isHavingMicPermissions();
if (!isPermission) {
RtcEngineManager.get().setMute(true);
AudioEngineManager.get().setMute(true);
}
bottomView.setMicBtnOpen(isPermission);
@@ -1339,7 +1339,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
private void updateRemoteMuteBtn() {
if (AvRoomDataManager.get().mCurrentRoomInfo != null) {
bottomView.setRemoteMuteOpen(!RtcEngineManager.get().isRemoteMute);
bottomView.setRemoteMuteOpen(!AudioEngineManager.get().isRemoteMute());
}
}
@@ -2020,15 +2020,15 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
String.valueOf(AuthModel.get().getCurrentUid()));
if (roomQueueInfo == null || roomQueueInfo.mRoomMicInfo == null) return;
//先判断麦上是否是开麦的
if (!roomQueueInfo.mRoomMicInfo.isMicMute() && !RtcEngineManager.get().isAudienceRole) {
if (!roomQueueInfo.mRoomMicInfo.isMicMute() && !AudioEngineManager.get().isAudienceRole()) {
if (!isHavingMicPermissions()) {
RxPermissions rxPermissions = new RxPermissions(HomePartyRoomFragment.this);
rxPermissions.request(Manifest.permission.RECORD_AUDIO).subscribe(aBoolean -> {
if (aBoolean) {
AvRoomDataManager.get().mIsNeedOpenMic = false;
RtcEngineManager.get().setMute(!RtcEngineManager.get().isMute);
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
AudioEngineManager.get().setMute(!AudioEngineManager.get().isMute());
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
updateMicBtn();
} else {
toast("开启权限后才能开麦");
@@ -2038,8 +2038,8 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
}
AvRoomDataManager avRoomDataManager = AvRoomDataManager.get();
boolean tmp = avRoomDataManager.mIsNeedOpenMic;
RtcEngineManager.get().setMute(!RtcEngineManager.get().isMute);
AvRoomDataManager.get().mIsNeedOpenMic = RtcEngineManager.get().isMute;
AudioEngineManager.get().setMute(!AudioEngineManager.get().isMute());
AvRoomDataManager.get().mIsNeedOpenMic = AudioEngineManager.get().isMute();
boolean tmp1 = avRoomDataManager.mIsNeedOpenMic;
updateMicBtn();
@@ -2052,7 +2052,7 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
}
//判断是否在麦上,如果在麦上设置为主播角色
else if (AvRoomDataManager.get().isOnMic(myUid)) {
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
}
}
@@ -2133,14 +2133,14 @@ public class HomePartyRoomFragment extends BaseMvpFragment<IHomePartyView, HomeP
@Override
public void onRemoteMuteBtnClick() {
boolean isRemoteMute = !RtcEngineManager.get().isRemoteMute;
boolean isRemoteMute = !AudioEngineManager.get().isRemoteMute();
if (isRemoteMute) {
if (AvRoomDataManager.get().isCpRoom()) {
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_CP_ROOM_CLOSE_SOUND_CLICK, "关闭声音");
} else
StatisticManager.Instance().onEvent(StatisticsProtocol.Event.EVENT_MP_ROOM_CLOSE_SOUND_CLICK, "关闭声音");
}
RtcEngineManager.get().setRemoteMute(isRemoteMute);
AudioEngineManager.get().setRemoteMute(isRemoteMute);
updateRemoteMuteBtn();
}

View File

@@ -45,7 +45,7 @@ import com.yizhuan.xchat_android_core.im.game.ImGameMode;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.game.AiPlayEndEvent;
import com.yizhuan.xchat_android_core.room.game.GameModel;
@@ -196,12 +196,12 @@ public class PlayGameActivity extends BaseBindingActivity<ActivityPlayGameBindin
}
});
RtcEngineManager.get().joinChannel(channelId, AuthModel.get().getCurrentUid());
AudioEngineManager.get().joinChannel(channelId, AuthModel.get().getCurrentUid());
if (!isWatch) {
viewModel.isOnMic.set(true);
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
} else {
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}
}
@@ -391,7 +391,7 @@ public class PlayGameActivity extends BaseBindingActivity<ActivityPlayGameBindin
RxBus.get().post(new AiPlayEndEvent(aiUid));
}
if (isIm && !AvRoomDataManager.get().roomNoDestory) {
RtcEngineManager.get().leaveChannel();
AudioEngineManager.get().leaveChannel();
}
if (mBinding.webview != null) {
ViewParent parent = mBinding.webview.getParent();

View File

@@ -19,7 +19,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.CustomAttachment;
import com.yizhuan.xchat_android_core.im.custom.bean.GameAttachment;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.praise.PraiseModel;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.game.GameAttachInfo;
@@ -55,20 +55,20 @@ public class PlayGameVm extends BaseViewModel {
public ObservableArrayList<String> faceList = new ObservableArrayList<>();
public View.OnClickListener micClick = v -> {
RtcEngineManager.get().setMute(!RtcEngineManager.get().isMute);
isMute.set(RtcEngineManager.get().isMute);
AudioEngineManager.get().setMute(!AudioEngineManager.get().isMute());
isMute.set(AudioEngineManager.get().isMute());
};
public View.OnClickListener voiceClick = v -> {
RtcEngineManager.get().setRemoteMute(!RtcEngineManager.get().isRemoteMute);
isRemoteMute.set(RtcEngineManager.get().isRemoteMute);
AudioEngineManager.get().setRemoteMute(!AudioEngineManager.get().isRemoteMute());
isRemoteMute.set(AudioEngineManager.get().isRemoteMute());
};
public PlayGameVm() {
selfUserInfo.set(UserModel.get().getCacheLoginUserInfo());
isOnMic.set(AvRoomDataManager.get().isOwnerOnMic());
isMute.set(RtcEngineManager.get().isMute);
isRemoteMute.set(RtcEngineManager.get().isRemoteMute);
isMute.set(AudioEngineManager.get().isMute());
isRemoteMute.set(AudioEngineManager.get().isRemoteMute());
GameModel.get().getGameFace()
.subscribe(strings -> {
faceList.addAll(strings);

View File

@@ -8,7 +8,7 @@ import com.yizhuan.erban.utils.UserUtils;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.room.ktv.KtvModel;
import com.yizhuan.xchat_android_core.room.ktv.bean.MusicInfo;
import com.yizhuan.xchat_android_core.room.ktv.bean.RoomMusicInfo;
@@ -83,7 +83,7 @@ public enum KtvMusicManager {
case KtvEvent.SWITCH_MUSIC:
if (currMusic != null) mData.remove(currMusic);
currMusic = musicInfo;
RtcEngineManager.get().stopPush();
AudioEngineManager.get().stopPush();
startMv(musicInfo);
break;
case KtvEvent.ADD_MUSIC:
@@ -98,8 +98,8 @@ public enum KtvMusicManager {
break;
case KtvEvent.NO_MUSIC:
case KtvEvent.CLOSE_KTV_MODEL:
RtcEngineManager.get().stopPush();
RtcEngineManager.get().setLive(false);
AudioEngineManager.get().stopPush();
AudioEngineManager.get().setLive(false);
mData.clear();
currMusic = null;
break;
@@ -119,7 +119,7 @@ public enum KtvMusicManager {
break;
case KtvEvent.MUSIC_COMPLETE:
LogUtils.d("MUSIC_COMPLETE");
// if (RtcEngineManager.get().isPush()) switchSong(false);
// if (AudioEngineManager.get().isPush()) switchSong(false);
break;
default:
break;
@@ -135,13 +135,13 @@ public enum KtvMusicManager {
.subscribeOn(Schedulers.io())
.delay(2, TimeUnit.SECONDS)
.takeUntil(integer -> !KtvView.isShowPrepare || UserUtils.getUserUid() != getCurrMusic().getUid())//准备中下麦处理
.doOnNext(integer -> RtcEngineManager.get().startMv(musicInfo.getMusicUrl()))
.doOnNext(integer -> AudioEngineManager.get().startMv(musicInfo.getMusicUrl()))
.flatMap(integer -> Observable.interval(0, 1, TimeUnit.SECONDS))
.observeOn(AndroidSchedulers.mainThread())
.takeUntil(aLong -> !RtcEngineManager.get().isPush())
.filter(aLong -> (RtcEngineManager.get().getPlayPos() > 0.99d ||
(RtcEngineManager.get().getPlayPos() > 0.94d && RtcEngineManager.get().isPlaying() &&
currPlayPos == (currPlayPos = RtcEngineManager.get().getPlayPos()))))
.takeUntil(aLong -> !AudioEngineManager.get().isPush())
.filter(aLong -> (AudioEngineManager.get().getPlayPos() > 0.99d ||
(AudioEngineManager.get().getPlayPos() > 0.94d && AudioEngineManager.get().isPlaying() &&
currPlayPos == (currPlayPos = AudioEngineManager.get().getPlayPos()))))
.take(1)
.subscribe(aLong -> switchSong(false));

View File

@@ -13,7 +13,7 @@ import com.yizhuan.erban.databinding.DialogKtvSelectSongBinding;
import com.yizhuan.erban.utils.UserUtils;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.room.ktv.bean.MusicInfo;
import com.yizhuan.xchat_android_core.room.ktv.event.KtvEvent;
import com.yizhuan.xchat_android_core.utils.net.BeanObserver;
@@ -55,7 +55,7 @@ public class KtvSelectSongDialog extends BaseBindingDialog<DialogKtvSelectSongBi
closeDialog();
break;
case R.id.tv_sure:
if (!RtcEngineManager.get().isOpenKtv()){
if (!AudioEngineManager.get().isOpenKtv()){
SingleToastUtil.showToast("管理已经已经关闭KTV模式哦~~");
return;
}

View File

@@ -27,7 +27,7 @@ import com.yizhuan.erban.utils.UserUtils;
import com.yizhuan.xchat_android_core.bean.RoomQueueInfo;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.IMNetEaseManager;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.room.ktv.bean.MusicInfo;
import com.yizhuan.xchat_android_core.room.ktv.event.KtvEvent;
import com.yizhuan.xchat_android_core.room.ktv.event.RemoteVideoEvent;
@@ -92,11 +92,11 @@ public class KtvView extends CardView {
this.setOnClickListener(listener);
playContainer.setOnClickListener(listener);
statusContainer.setOnClickListener(listener);
showXPlay(RtcEngineManager.get().isPush());
if (!RtcEngineManager.get().isLive() || KtvMusicManager.INSTANCE.getMusicList().size() == 0) {
showXPlay(AudioEngineManager.get().isPush());
if (!AudioEngineManager.get().isLive() || KtvMusicManager.INSTANCE.getMusicList().size() == 0) {
statusView = showNoSong();
} else if (!RtcEngineManager.get().isPush()) {
setupRemoteVideo(RtcEngineManager.get().getRemoteUid());
} else if (!AudioEngineManager.get().isPush()) {
setupRemoteVideo(AudioEngineManager.get().getRemoteUid());
}
subscribeEvent();
}
@@ -134,13 +134,13 @@ public class KtvView extends CardView {
}
break;
case KtvEvent.STOP:
if (RtcEngineManager.get().isPush() && RtcEngineManager.get().isPlaying()) {
RtcEngineManager.get().playOrPause();
if (AudioEngineManager.get().isPush() && AudioEngineManager.get().isPlaying()) {
AudioEngineManager.get().playOrPause();
}
break;
case KtvEvent.CONTINUE:
if (RtcEngineManager.get().isPush() && !RtcEngineManager.get().isPlaying()) {
RtcEngineManager.get().playOrPause();
if (AudioEngineManager.get().isPush() && !AudioEngineManager.get().isPlaying()) {
AudioEngineManager.get().playOrPause();
}
break;
case KtvEvent.NO_MUSIC:
@@ -166,12 +166,12 @@ public class KtvView extends CardView {
public synchronized void setupRemoteVideo(int uid) {
if (UserUtils.getUserUid() == uid || RtcEngineManager.get().isPush()) return;
if (UserUtils.getUserUid() == uid || AudioEngineManager.get().isPush()) return;
if (!isShowPrepare) resetStatusView();
playContainer.removeAllViews();
SurfaceView surfaceView = RtcEngine.CreateRendererView(context.getApplicationContext());
playContainer.addView(surfaceView);
RtcEngineManager.get().setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_ADAPTIVE, uid), uid);
AudioEngineManager.get().setupRemoteVideo(new VideoCanvas(surfaceView, VideoCanvas.RENDER_MODE_ADAPTIVE, uid), uid);
}
@@ -273,19 +273,19 @@ public class KtvView extends CardView {
initCloseBtn(holder.ibClose);
initChangeAudioBtn(holder.tvChangeAudio);
holder.tvChangeAudio.setOnClickListener(v -> {
RtcEngineManager.get().changeAudioStream();
AudioEngineManager.get().changeAudioStream();
initChangeAudioBtn(holder.tvChangeAudio);
resetStatusView();
});
holder.tvCommitErr.setOnClickListener(v ->
KtvCommitErrorDialog.newInstance(context, KtvMusicManager.INSTANCE.getCurrMusic().getMusicId()).show());
holder.ivPlayOrPause.setOnClickListener(v -> {
if (RtcEngineManager.get().isPush()) {
RtcEngineManager.get().playOrPause();
if (AudioEngineManager.get().isPush()) {
AudioEngineManager.get().playOrPause();
}
/* else { //暂时不需要
KtvHelper.sendChatRoomMusicMessage(
RtcEngineManager.get().isPlaying() ? CUSTOM_MSG_SUB_KTV_STOP : CUSTOM_MSG_SUB_KTV_CONTINUE,
AudioEngineManager.get().isPlaying() ? CUSTOM_MSG_SUB_KTV_STOP : CUSTOM_MSG_SUB_KTV_CONTINUE,
null)
.subscribe();
}*/
@@ -296,14 +296,14 @@ public class KtvView extends CardView {
KtvMusicManager.INSTANCE.switchSong(true);
resetStatusView();
});
holder.sbAccompanyVoice.setProgress((int) (RtcEngineManager.get().getAccompanyVoice()*100));
holder.sbAccompanyVoice.setProgress((int) (AudioEngineManager.get().getAccompanyVoice()*100));
holder.sbAccompanyVoice.setOnSeekBarChangeListener(
(LambdaOnSeekBarChangeListener) (seekBar, progress, fromUser) ->
RtcEngineManager.get().setAccompanyVoice(progress/100d));
holder.sbPersonVoice.setProgress((int) (RtcEngineManager.get().getPersonVoice()*100));
AudioEngineManager.get().setAccompanyVoice(progress/100d));
holder.sbPersonVoice.setProgress((int) (AudioEngineManager.get().getPersonVoice()*100));
holder.sbPersonVoice.setOnSeekBarChangeListener(
(LambdaOnSeekBarChangeListener) (seekBar, progress, fromUser) ->
RtcEngineManager.get().setPersonVoice(progress/100d));
AudioEngineManager.get().setPersonVoice(progress/100d));
releaseCommandDisposable();
commandDisposable = Observable.interval(0, 1, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.subscribe(aLong -> setSeekDuration(holder));
@@ -320,7 +320,7 @@ public class KtvView extends CardView {
@SuppressLint("ClickableViewAccessibility")
private void setSeekDuration(CommandViewHolder holder) {
double pos = RtcEngineManager.get().getPlayPos();
double pos = AudioEngineManager.get().getPlayPos();
holder.sbSongCurrentPosition.setProgress((int) (100 * pos));
//禁止点击
holder.sbSongCurrentPosition.setClickable(false);
@@ -330,7 +330,7 @@ public class KtvView extends CardView {
return true;
}
});
int duration = RtcEngineManager.get().getPlayDuration() / 1000;//单位秒
int duration = AudioEngineManager.get().getPlayDuration() / 1000;//单位秒
duration = (int) (duration - duration * pos);//剩余的时间
if (duration < 0) {
duration = 0;
@@ -345,7 +345,7 @@ public class KtvView extends CardView {
}
private void initPlayBtn(CommandViewHolder holder) {
if (RtcEngineManager.get().isPlaying()) {
if (AudioEngineManager.get().isPlaying()) {
holder.ivPlayOrPause.setImageResource(R.drawable.icon_ktv_pause);
} else {
holder.ivPlayOrPause.setImageResource(R.drawable.icon_ktv_play);
@@ -353,7 +353,7 @@ public class KtvView extends CardView {
}
private void initChangeAudioBtn(SuperTextView textView) {
if (!RtcEngineManager.get().isAccompany()) {
if (!AudioEngineManager.get().isAccompany()) {
textView.setTextColor(getResources().getColor(R.color.color_CCFF5B69));
textView.setText("原唱");
} else {
@@ -524,9 +524,9 @@ public class KtvView extends CardView {
}
private void showXPlay(boolean isShow) {
if (isShow && RtcEngineManager.get().getKtvKit()!=null) {
if (isShow && AudioEngineManager.get().getKtvKit()!=null) {
playContainer.removeAllViews();
xPlay = new VideoPlayerView(context, RtcEngineManager.get().getKtvKit());
xPlay = new VideoPlayerView(context, AudioEngineManager.get().getKtvKit());
xPlay.setZOrderMediaOverlay(true);
playContainer.addView(xPlay);
}

View File

@@ -2,29 +2,20 @@ package com.yizhuan.erban.avroom.presenter;
import android.annotation.SuppressLint;
import android.os.Bundle;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import android.util.SparseArray;
import com.coorchice.library.utils.LogUtils;
import androidx.annotation.Nullable;
import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.netease.nimlib.sdk.NIMClient;
import com.netease.nimlib.sdk.RequestCallbackWrapper;
import com.netease.nimlib.sdk.ResponseCode;
import com.netease.nimlib.sdk.chatroom.ChatRoomService;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomInfo;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMessage;
import com.netease.nimlib.sdk.chatroom.model.EnterChatRoomResultData;
import com.netease.nimlib.sdk.msg.constant.MsgTypeEnum;
import com.netease.nimlib.sdk.msg.model.QueryDirectionEnum;
import com.netease.nimlib.sdk.util.Entry;
import com.orhanobut.logger.Logger;
import com.yizhuan.erban.avroom.view.IAvRoomView;
@@ -35,10 +26,10 @@ import com.yizhuan.xchat_android_core.bean.RoomMicInfo;
import com.yizhuan.xchat_android_core.bean.RoomQueueInfo;
import com.yizhuan.xchat_android_core.bean.response.ServiceResult;
import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.monsterhunting.bean.MonsterInfo;
import com.yizhuan.xchat_android_core.monsterhunting.model.MonsterHuntingModel;
import com.yizhuan.xchat_android_core.patriarch.exception.PmRoomLimitException;
@@ -54,24 +45,18 @@ import com.yizhuan.xchat_android_core.statistic.LogFactory;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
import com.yizhuan.xchat_android_core.statistic.protocol.LogProtocol;
import com.yizhuan.xchat_android_core.statistic.protocol.StatisticsProtocol;
import com.yizhuan.xchat_android_core.super_admin.SuperAdminDataMrg;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_core.user.bean.UserInfo;
import com.yizhuan.xchat_android_core.utils.net.RxHelper;
import com.yizhuan.xchat_android_core.super_admin.SuperAdminDataMrg;
import com.yizhuan.xchat_android_library.base.PresenterEvent;
import com.yizhuan.xchat_android_library.net.rxnet.callback.CallBack;
import com.yizhuan.xchat_android_library.rxbus.RxBus;
import com.yizhuan.xchat_android_library.threadmgr.ThreadPoolManager;
import com.yizhuan.xchat_android_library.utils.ListUtils;
import com.yizhuan.xchat_android_library.utils.LogUtil;
import org.greenrobot.eventbus.EventBus;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -154,7 +139,7 @@ public class AvRoomPresenter extends BaseMvpPresenter<IAvRoomView> {
.observeOn(AndroidSchedulers.mainThread())
.subscribe(roomQueueInfoSparseArray -> {
long uid = AuthModel.get().getCurrentUid();
RtcEngineManager.get().startRtcEngine(uid);
AudioEngineManager.get().startRtcEngine(uid);
//成功进入房间发送log 到阿里
StatisticManager.Instance().sendAliyunLog(LogFactory.create(
LogProtocol.LogLevel.LEVEL_VERBOSE,

View File

@@ -34,7 +34,7 @@ import com.yizhuan.xchat_android_core.im.custom.bean.FaceAttachment;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.noble.NobleResourceType;
import com.yizhuan.xchat_android_core.noble.NobleUtil;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
@@ -383,8 +383,8 @@ public class MicroView extends RelativeLayout implements View.OnLayoutChangeList
} else {
resetPoint();
}
if (!RtcEngineManager.get().isOpenKtv()) {
RtcEngineManager.get().openKtvModel();
if (!AudioEngineManager.get().isOpenKtv()) {
AudioEngineManager.get().openKtvModel();
}
}
@@ -416,7 +416,7 @@ public class MicroView extends RelativeLayout implements View.OnLayoutChangeList
} else {
bindAdapter(new MicroViewAdapter(mContext));
}
RtcEngineManager.get().closeKtvModel();
AudioEngineManager.get().closeKtvModel();
}
public void switchToDatingMode() {

View File

@@ -43,8 +43,8 @@ import com.yizhuan.xchat_android_core.home.bean.BannerInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeConcernsInfo;
import com.yizhuan.xchat_android_core.home.bean.HomeTagInfo;
import com.yizhuan.xchat_android_core.home.bean.TagListInfo;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.room.model.AvRoomModel;
import com.yizhuan.xchat_android_core.statistic.StatisticManager;
@@ -175,9 +175,10 @@ public class HomeMoreRoomActivity extends BaseMvpActivity<IMainFragmentView, Mai
@Override
public void exitRoom(RoomInfo roomInfo) {
if (RtcEngineManager.get().isOpenKtv() && roomInfo != null) {
//ktv退出的时候需要用到
if (AudioEngineManager.get().isOpenKtv() && roomInfo != null) {
KtvMusicManager.INSTANCE.deleteUserAllChooseMusic(roomInfo.getUid()).subscribe();
RtcEngineManager.get().closeKtvModel();
AudioEngineManager.get().closeKtvModel();
}
DaemonService.stop(HomeMoreRoomActivity.this);
}

View File

@@ -26,7 +26,7 @@ import com.yizhuan.tutu.music.adapter.LocalMusicListAdapter;
import com.yizhuan.tutu.music.presenter.LocalMusicListPresenter;
import com.yizhuan.tutu.music.widget.VoiceSeekDialog;
import com.yizhuan.xchat_android_core.Constants;
import com.yizhuan.xchat_android_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.music.db.bean.LocalMusicBean;
import com.yizhuan.xchat_android_core.music.event.CurrentMusicUpdateEvent;
import com.yizhuan.xchat_android_core.music.event.MusicPauseEvent;
@@ -254,8 +254,8 @@ public class LocalMusicListFragment extends BaseMvpFragment<ILocalMusicListView,
mDisposable = Observable.interval(0, 1, TimeUnit.SECONDS).subscribeOn(Schedulers.single())
.observeOn(AndroidSchedulers.mainThread()).subscribe(aLong -> {
int duration = RtcEngineManager.get().getAudioMixingDuration();
int position = RtcEngineManager.get().getAudioMixingCurrentPosition();
int duration = AudioEngineManager.get().getAudioMixingDuration();
int position = AudioEngineManager.get().getAudioMixingCurrentPosition();
setAudioCurrentPosition(position, duration);
});
}

View File

@@ -41,6 +41,13 @@ allprojects {
maven { url 'https://repo1.maven.org/maven2/' }
maven { url 'https://dl.bintray.com/linkedme2016/lkme-deeplinks' }
maven { url 'http://developer.huawei.com/repo/' }
maven(){
url 'http://sdk-repository.wujiehh.com:8081/repository/WJHD/'
credentials {
username = 'wjhd'
password = 'WV9#i%C3e@p$jtPyU*ds^VUp317koE1Y'
}
}
}
//网络慢的话就去 https://maven.aliyun.com/mvn/view 里面找个代理的仓库。
}

View File

@@ -90,6 +90,9 @@ dependencies {
// 声网
api 'io.agora.rtc:full-sdk:3.0.1'
//无界
api 'com.wjhd.wy:WYMediaEngine:1.7.5-20210414.032717-1'
// 易盾
api 'com.netease.mobsec:netmobsecLib:4.2.4.1@aar'

View File

@@ -0,0 +1,339 @@
package com.yizhuan.xchat_android_core.manager;
import androidx.annotation.Nullable;
import com.netease.nim.uikit.common.util.log.LogUtil;
import com.yizhuan.xchat_android_core.manager.agora.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.wj.WJAudioConstant;
import com.yizhuan.xchat_android_core.manager.wj.WJAudioEngineManager;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_core.user.UserModel;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import io.agora.ktvkit.KTVKit;
import io.agora.rtc.Constants;
import io.agora.rtc.video.VideoCanvas;
public class AudioEngineManager {
private static final String TAG = "AudioEngineManager";
private IAudioEngine iAudioEngine;
private static final class Helper {
private static final AudioEngineManager INSTANCE = new AudioEngineManager();
}
private AudioEngineManager() {
initRtcEngine(EngineType.TYPE_AGORA);
}
public static AudioEngineManager get() {
return Helper.INSTANCE;
}
public void initRtcEngine(EngineType engineType) {
switch (engineType) {
case TYPE_WJ:
if (UserModel.get().getCacheLoginUserInfo() != null) {
WJAudioConstant.BUSINESS_UID = String.valueOf(UserModel.get().getCacheLoginUserInfo().getErbanNo());
}
this.iAudioEngine = new WJAudioEngineManager(BasicConfig.INSTANCE.getAppContext());
break;
case TYPE_AGORA:
default:
this.iAudioEngine = new RtcEngineManager(BasicConfig.INSTANCE.getAppContext());
}
}
public void startRtcEngine(long uid) {
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (curRoomInfo == null) return;
joinChannel(curRoomInfo.getRoomId(), uid);
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
//设置用户角色为主播,轰趴房不能默认设置房主为主播
setRole(Constants.CLIENT_ROLE_BROADCASTER);
} else {
setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}
public void joinChannel(long channelId, long uid) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.enterChannel(channelId, uid);
}
public void leaveChannel() {
if (this.iAudioEngine == null) return;
this.iAudioEngine.leaveChannel();
}
public void resetChannel() {
if (this.iAudioEngine == null) return;
this.iAudioEngine.resetChannel();
}
public void reEnterChannel(long channelId, long uid) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.reEnterChannel(channelId, uid);
}
//设置静音
public void setRemoteMute(boolean mute) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.setRemoteMute(mute);
}
public boolean isRemoteMute() {
if (this.iAudioEngine == null) {
LogUtil.e(TAG, "isRemoteMute called before Audio engine init!!!!");
return false;
}
return iAudioEngine.isRemoteMute();
}
/**
* 设置角色,上麦,下麦(调用)
*
* @param role CLIENT_ROLE_AUDIENCE: 听众 ROLE_BROADCASTER: 主播
*/
public boolean setRole(int role) {
return this.iAudioEngine != null && this.iAudioEngine.setRole(role);
}
public boolean isAudienceRole() {
if (this.iAudioEngine == null) {
LogUtil.e(TAG, "isAudienceRole called before Audio engine init!!!!");
return false;
}
return this.iAudioEngine.isAudienceRole();
}
/**
* 设置是否能说话,静音,人自己的行为
*
* @param mute true静音false不静音
*/
public void setMute(boolean mute) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.setMute(mute);
}
public boolean isMute() {
if (this.iAudioEngine == null) {
LogUtil.e(TAG, "isMute called before Audio engine init!!!!");
return false;
}
return this.iAudioEngine.isMute();
}
public void delayStartPlay(long pushUid) {
// 针对使用 无界聊天室 SDK + zego SDK 的情况下,
// zego 进房比无界聊天室快的时候,会导致无法播放麦上用户的流
// 所以,在 zego 引擎那边已经预先缓存了流的 ID这里重新播放已经缓存的流
// 就是为了解决两个 SDK 不一致导致的进房后听不到声音的问题
this.iAudioEngine.delayStartPlay(pushUid);
}
/**
* 切换耳返
*
* @param enable
*/
public void switchLoopBack(boolean enable) {
if (this.iAudioEngine == null) {
LogUtil.e(TAG, "switchLoopBack called before Audio engine init!!!!");
return;
}
this.iAudioEngine.switchLoopBack(enable);
}
public boolean isEnableLoopBack() {
return this.iAudioEngine != null && this.iAudioEngine.isEnableLoopBack();
}
//音乐播放相关---------------begin--------------------------
public void adjustAudioMixingVolume(int volume) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.adjustAudioMixingVolume(volume);
}
public void adjustRecordingSignalVolume(int volume) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.adjustRecordingSignalVolume(volume);
}
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.startAudioMixing(filePath, loopback, cycle);
}
public int stopAudioMixing() {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.stopAudioMixing();
}
public int resumeAudioMixing() {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.resumeAudioMixing();
}
public int pauseAudioMixing() {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.pauseAudioMixing();
}
public int getAudioMixingCurrentPosition() {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.getAudioMixingCurrentPosition();
}
public int getAudioMixingDuration() {
if (this.iAudioEngine == null) {
return 0;
}
return this.iAudioEngine.getAudioMixingDuration();
}
//音乐播放相关---------------end--------------------------
public void setRemoteMute(long uid, boolean mute) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.setRemoteMute(uid, mute);
}
public void setChatRoomOnlineStatus(boolean status) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.setChatRoomOnlineStatus(status);
}
//--------------------------asmr--------------------------
public void setASMRMode(boolean enable) {
if (this.iAudioEngine == null) return;
this.iAudioEngine.setASMRMode(enable);
}
//ktv相关---------------begin--------------------------
private boolean isPlaying;
private boolean isAccompany = true;
private boolean isPush;
private boolean isOpenKtv;
private boolean isLive;
private int remoteUid;
private double accompanyVoice = 0.5;
private double personVoice = 0.5;
@Nullable
private KTVKit ktvKit;
public synchronized void openKtvModel() {
}
public synchronized void closeKtvModel() {
}
public void stopPush() {
}
public synchronized void startMv(String url) {
}
public synchronized void setupRemoteVideo(VideoCanvas canvas, int remoteUid) {
}
public void playOrPause() {
if (ktvKit != null) ktvKit.pause();
isPlaying = !isPlaying;
}
public void changeAudioStream() {
if (ktvKit != null) ktvKit.switchAudioTrack();
isAccompany = !isAccompany;
}
public void setAccompanyVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
accompanyVoice = progress;
if (ktvKit != null) ktvKit.adjustAccompanyVolume(progress);
}
public void setPersonVoice(double progress) {
if (progress < 0 || progress > 1) {
return;
}
personVoice = progress;
if (ktvKit != null) ktvKit.adjustVoiceVolume(personVoice);
}
public boolean isPlaying() {
return isPlaying;
}
public boolean isPush() {
return isPush;
}
public boolean isAccompany() {
return isAccompany;
}
public boolean isOpenKtv() {
return isOpenKtv;
}
public boolean isLive() {
return isLive;
}
public void setLive(boolean live) {
isLive = live;
}
public int getRemoteUid() {
return remoteUid;
}
public double getAccompanyVoice() {
return accompanyVoice;
}
public double getPersonVoice() {
return personVoice;
}
@Nullable
public KTVKit getKtvKit() {
return ktvKit;
}
public double getPlayPos() {
return ktvKit == null ? 0 : ktvKit.getCurrentPosition();
}
public int getPlayDuration() {
return ktvKit == null ? 0 : ktvKit.getDuration();
}
//ktv相关---------------end--------------------------
}

View File

@@ -0,0 +1,77 @@
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;
/**
* 角色-主播
*/
public static final int ROLE_BROADCASTER = 1;
/**
* 角色-观众
*/
public static final int ROLE_AUDIENCE = 2;
/**
* 队列说话列表
*/
public List<Integer> speakQueueMembersPosition;
protected long channelId;
public long uid;
protected volatile boolean isAudienceRole;
/**
* 麦上是否闭麦true闭麦false开麦
*/
public volatile boolean isMute = false;
/**
* 听筒是否关闭
*/
public volatile boolean isRemoteMute;
public boolean needRecord;
//是否在房间,判断是切换品质还是第一次进
public volatile boolean inRoom;
/**
* 是否打开耳返true 表示打开false 表示关闭
* 默认不打开耳返
*/
protected volatile boolean enableLoopBack = false;
/**
* 音乐播放器是否正在播放歌曲
*/
public volatile boolean isMusicPlaying = false;
public BaseEngine(Context context) {
this.context = context;
this.speakQueueMembersPosition = new ArrayList<>();
}
@Override
public void switchLoopBack(boolean isNeedOpenLoopBack) {
this.enableLoopBack = isNeedOpenLoopBack;
}
@Override
public boolean isRemoteMute() {
return isRemoteMute;
}
@Override
public boolean isAudienceRole() {
return isAudienceRole;
}
@Override
public boolean isMute() {
return isMute;
}
}

View File

@@ -0,0 +1,6 @@
package com.yizhuan.xchat_android_core.manager;
public enum EngineType {
TYPE_AGORA,
TYPE_WJ,
}

View File

@@ -0,0 +1,72 @@
package com.yizhuan.xchat_android_core.manager;
public interface IAudioEngine {
void enterChannel(long channelId, long uid);
void leaveChannel();
void resetChannel();
void reEnterChannel(long channelId, long uid);
/**
* 设置角色,上麦,下麦(调用)
*
* @param role CLIENT_ROLE_AUDIENCE: 听众 CLIENT_ROLE_BROADCASTER: 主播
*/
boolean setRole(int role);
/**
* 设置是否能说话,静音,人自己的行为
*
* @param mute true静音false不静音
*/
void setMute(boolean mute);
/**
* 静音远端声音
*
* @param mute true静音false不静音
*/
void setRemoteMute(boolean mute);
boolean isEnableLoopBack();
//音乐播放相关---------------begin--------------------------
void adjustAudioMixingVolume(int volume);
void adjustRecordingSignalVolume(int volume);
int startAudioMixing(String filePath, boolean loopback, int cycle);
int stopAudioMixing();
int resumeAudioMixing();
int pauseAudioMixing();
int getAudioMixingCurrentPosition();
int getAudioMixingDuration();
//音乐播放相关---------------end--------------------------
void setRemoteMute(long uid, boolean mute);
boolean isRemoteMute();
boolean isAudienceRole();
boolean isMute();
void switchLoopBack(boolean enable);
void setChatRoomOnlineStatus(boolean status);
void setASMRMode(boolean enable);
default void delayStartPlay(long pushUid) {
}
}

View File

@@ -1575,7 +1575,7 @@ public final class IMNetEaseManager {
//处理声网声音相关的
if (roomQueueInfo.mChatRoomMember != null) {
if (AvRoomDataManager.get().isOwner(roomQueueInfo.mChatRoomMember.getAccount())) {
RtcEngineManager.get().setRole(
AudioEngineManager.get().setRole(
roomQueueInfo.mRoomMicInfo.isMicMute() ? Constants.CLIENT_ROLE_AUDIENCE : Constants.CLIENT_ROLE_BROADCASTER);
}
}
@@ -1928,7 +1928,7 @@ public final class IMNetEaseManager {
String account = roomQueueInfo.mChatRoomMember.getAccount();
if (AvRoomDataManager.get().isOwner(account)) {
// 更新声网闭麦 ,发送状态信息
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AvRoomDataManager.get().mIsNeedOpenMic = false;
}
roomQueueInfo.mChatRoomMember = null;
@@ -1974,7 +1974,9 @@ public final class IMNetEaseManager {
temp.mChatRoomMember = null;
}
// 允许接收所有人的声网音频流,不会影响本来麦上的静音状态,也不会影响自己操作过的静音按钮
RtcEngineManager.get().setRemoteMute(temp.mChatRoomMember, false);
if (temp.mChatRoomMember!=null){
AudioEngineManager.get().setRemoteMute(Long.parseLong(temp.mChatRoomMember.getAccount()), false);
}
}
}
RoomQueueInfo tempRoomQueueInfo = mMicQueueMemberMap.get(micPosition);
@@ -1993,32 +1995,32 @@ public final class IMNetEaseManager {
chatRoomMember.setExtension(extension);
roomQueueInfo.mChatRoomMember = chatRoomMember;
// 这个人上麦后,恢复之前他因为是黑麦被禁言
RtcEngineManager.get().setRemoteMute(chatRoomMember, false);
AudioEngineManager.get().setRemoteMute(Long.parseLong(chatRoomMember.getAccount()), false);
//重新更新队列,队列上是否还有自己
if (!AvRoomDataManager.get().isOwnerOnMic()) {
//处理可能自己被挤下还能说话的情况
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
if (AvRoomDataManager.get().isOwner(chatRoomMember.getAccount())) {
if (!roomQueueInfo.mRoomMicInfo.isMicMute()) {
//开麦
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_BROADCASTER);
//是否需要开麦
if (AvRoomDataManager.get().mIsNeedOpenMic) {
//闭麦
RtcEngineManager.get().setMute(true);
AudioEngineManager.get().setMute(true);
AvRoomDataManager.get().mIsNeedOpenMic = true;
}
} else {
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}
noticeUpMic(Integer.parseInt(key), chatRoomMember.getAccount());
}
} else {
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
}
}

View File

@@ -4,11 +4,11 @@ import android.annotation.SuppressLint;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.util.Log;
import com.netease.nimlib.sdk.chatroom.model.ChatRoomMember;
import androidx.annotation.Nullable;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.room.bean.RoomInfo;
@@ -26,7 +26,6 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import io.agora.ktvkit.IKTVKitEventHandler;
import io.agora.ktvkit.KTVKit;
@@ -35,7 +34,6 @@ import io.agora.rtc.IRtcEngineEventHandler;
import io.agora.rtc.RtcEngine;
import io.agora.rtc.video.VideoCanvas;
import static io.agora.rtc.Constants.AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO;
import static io.agora.rtc.Constants.AUDIO_PROFILE_MUSIC_STANDARD;
import static io.agora.rtc.Constants.AUDIO_RECORDING_QUALITY_LOW;
import static io.agora.rtc.Constants.AUDIO_SCENARIO_GAME_STREAMING;
@@ -47,15 +45,10 @@ import static io.agora.rtc.Constants.AUDIO_SCENARIO_GAME_STREAMING;
* @date 2017/12/12
*/
public final class RtcEngineManager {
private static volatile RtcEngineManager sEngineManager;
private static final Object SYNC_OBJECT = new Object();
@Nullable
private RtcEngine mRtcEngine;
private Map<String, Integer> speakers;
/**
* 说话列表
*/
private List<Integer> speakMembersPosition;
/**
* 队列说话列表
*/
@@ -83,7 +76,6 @@ public final class RtcEngineManager {
private RtcEngineManager() {
System.out.println("hehehehe" + RtcEngine.getSdkVersion());
speakMembersPosition = new ArrayList<>();
speakQueueMembersPosition = new ArrayList<>();
}
@@ -93,11 +85,7 @@ public final class RtcEngineManager {
public void startRtcEngine(long uid) {
RoomInfo curRoomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
// if (curRoomInfo.getAudioQuality() == RoomInfo.ROOMTYPE_LIGHT_CHAT) {
// joinHighQualityChannel(curRoomInfo.getRoomId(), uid,true);
// } else {
joinChannel(curRoomInfo.getRoomId(), uid);
// }
if (curRoomInfo.getUid() == uid && curRoomInfo.getType() != RoomInfo.ROOMTYPE_HOME_PARTY) {
//设置用户角色为主播,轰趴房不能默认设置房主为主播
setRole(Constants.CLIENT_ROLE_BROADCASTER);
@@ -110,24 +98,6 @@ public final class RtcEngineManager {
initRtcEngine(channelId, uid, AUDIO_PROFILE_MUSIC_STANDARD, AUDIO_SCENARIO_GAME_STREAMING);
}
public void joinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
initRtcEngine(channelId, uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
}
public void reJoinChannel(long channelId, long uid) {
enterChannel(channelId, (int) uid, AUDIO_PROFILE_MUSIC_STANDARD, AUDIO_SCENARIO_GAME_STREAMING);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
public void reJoinHighQualityChannel(long channelId, long uid, boolean record) {
this.needRecord = record;
enterChannel(channelId, (int) uid, AUDIO_PROFILE_MUSIC_HIGH_QUALITY_STEREO, AUDIO_SCENARIO_GAME_STREAMING);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
private void initRtcEngine(long channelId, long uid, int quality, int audioShowRoom) {
this.uid = uid + "";
this.isMute = false;
@@ -173,16 +143,6 @@ public final class RtcEngineManager {
return -1;
}
public void resetChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
}
public void leaveChannel() {
if (mRtcEngine != null) {
stopAudioMixing();
@@ -191,31 +151,12 @@ public final class RtcEngineManager {
}
if (handler != null)
handler.removeCallbacksAndMessages(null);
// isAudienceRole = true;
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
}
public boolean isSpeaking(int position) {
if (speakMembersPosition != null) {
if (speakMembersPosition.contains(position)) {
return true;
}
}
return false;
}
public boolean isQueueSpeaking(int position) {
if (speakQueueMembersPosition != null) {
if (speakQueueMembersPosition.contains(position)) {
return true;
}
}
return false;
}
public void setOpenAVRoomActivity(boolean openAVRoomActivity) {
isOpenAVRoomActivity = openAVRoomActivity;
setRemoteMute(isRemoteMute);
@@ -249,7 +190,7 @@ public final class RtcEngineManager {
String account = chatRoomMember.getAccount();
Integer uid = Integer.valueOf(account);
if (uid != 0)
RtcEngineManager.get().setRemoteMute(uid, false);
AudioEngineManager.get().setRemoteMute(uid, false);
}
}
@@ -328,11 +269,11 @@ public final class RtcEngineManager {
if (micPosition == Integer.MIN_VALUE &&
uid == AuthModel.get().getCurrentUid()) {
// 如果麦上没有自己,并且自己在说话,要把自己变成听众
RtcEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
} else if (micPosition == Integer.MIN_VALUE &&
uid != AuthModel.get().getCurrentUid()) {
// 如果麦上没有这个人,要把他静音
RtcEngineManager.get().setRemoteMute(uid, true);
AudioEngineManager.get().setRemoteMute(uid, true);
}
if (micPosition == Integer.MIN_VALUE) continue;
rtcEngineManager.speakQueueMembersPosition.add(micPosition);
@@ -597,7 +538,6 @@ public final class RtcEngineManager {
if (ktvKit == null || mRtcEngine == null || !isOpenKtv || !AvRoomDataManager.get().isOwnerOnMic())
return;
mRtcEngine.enableLocalVideo(true);
//mRtcEngine.enableInEarMonitoring(true);
mRtcEngine.muteLocalVideoStream(false);
ktvKit.openAndPlayVideoFile(url);
setAccompanyVoice(accompanyVoice);

View File

@@ -0,0 +1,42 @@
package com.yizhuan.xchat_android_core.manager;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import com.yizhuan.xchat_android_library.utils.pref.CommonPref;
/**
* Created by MadisonRong on 2019-12-26
*/
public class VolumeSetting {
/**
* 获取音乐播放器的音量
* @return
*/
public static int getMusicVolume() {
return CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("volume", 25);
}
/**
* 获取人声的音量
* @return
*/
public static int getVoiceVolume() {
return CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).getInt("recordingVolume", 100);
}
/**
* 设置音乐播放器的音量
* @param musicVolume
*/
public static void putMusicVolume(int musicVolume) {
CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("volume", musicVolume);
}
/**
* 设置人声的音量
* @param voiceVolume
*/
public static void putVoiceVolume(int voiceVolume) {
CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("recordingVolume", voiceVolume);
}
}

View File

@@ -0,0 +1,214 @@
package com.yizhuan.xchat_android_core.manager.agora;
import android.os.Environment;
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 com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.lang.ref.WeakReference;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import static io.agora.rtc.Constants.AUDIO_RECORDING_QUALITY_LOW;
/**
* @author by 梁馨 on 2020/9/14.
*/
public class EngineEventHandler extends IRtcEngineEventHandler {
public static String TAG = EngineEventHandler.class.getSimpleName();
private WeakReference<RtcEngineManager> mReference;
private volatile boolean isEnter;
EngineEventHandler(RtcEngineManager manager) {
mReference = new WeakReference<>(manager);
isEnter = true;
}
@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("发生未知错误,请退出房间重新进入");
break;
}
default: {
break;
}
}
}
@Override
public void onJoinChannelSuccess(String channel, int uid, int elapsed) {
super.onJoinChannelSuccess(channel, uid, elapsed);
Logger.t(TAG).d("onJoinChannelSuccess" + channel + "uid:" + uid);
//声网进入频道成功日志
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager != null && isEnter) {
isEnter = false;
if (!rtcEngineManager.inRoom) {
IMNetEaseManager.get().joinAvRoom();
}
if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) {
rtcEngineManager.mRtcEngine.startAudioRecording(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName()
+ "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW);
}
rtcEngineManager.inRoom = true;
rtcEngineManager.uid = uid;
}
}
@Override
public void onRejoinChannelSuccess(String channel, int uid, int elapsed) {
super.onRejoinChannelSuccess(channel, uid, elapsed);
}
@Override
public void onLeaveChannel(RtcStats stats) {
super.onLeaveChannel(stats);
Logger.t(TAG).d("onLeaveChannel");
}
@Override
public void onUserJoined(int uid, int elapsed) {
super.onUserJoined(uid, elapsed);
}
@Override
public void onActiveSpeaker(int uid) {
super.onActiveSpeaker(uid);
}
@Override
public void onLastmileQuality(int quality) {
super.onLastmileQuality(quality);
if (quality >= 3) {
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_BAD)
);
}
}
@Override
public void onConnectionInterrupted() {
super.onConnectionInterrupted();
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE));
}
@Override
public void onConnectionLost() {
super.onConnectionLost();
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE));
}
/**
* 用户音量提示回调。
*
* @param speakers
* @param totalVolume
*/
@Override
public void onAudioVolumeIndication(AudioVolumeInfo[] speakers, int totalVolume) {
super.onAudioVolumeIndication(speakers, totalVolume);
if (BuildConfig.DEBUG) {
if (speakers.length > 0) {
StringBuilder stringBuilder = new StringBuilder();
for (AudioVolumeInfo speaker : speakers) {
stringBuilder.append(speaker.uid);
stringBuilder.append(",");
}
if (stringBuilder.length() > 0) {
stringBuilder.deleteCharAt(stringBuilder.length() - 1);
}
}
}
RtcEngineManager manager = mReference.get();
if (manager != null) {
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);
}
}
}
@Override
public void onClientRoleChanged(int oldRole, int newRole) {
super.onClientRoleChanged(oldRole, newRole);
//角色切换 麦克风切换
if (newRole == Constants.CLIENT_ROLE_BROADCASTER) {
mReference.get().setMute(mReference.get().isMute);
}
}
@Override
public void onAudioMixingFinished() {//伴奏播放已结束回调
super.onAudioMixingFinished();
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED)
);
}
@Override
public void onFirstLocalAudioFrame(int i) {
super.onFirstLocalAudioFrame(i);
}
@Override
public void onRemoteAudioStateChanged(int i, int i1, int i2, int i3) {
super.onRemoteAudioStateChanged(i, i1, i2, i3);
}
@Override
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 + ""));
}
}

View File

@@ -0,0 +1,94 @@
package com.yizhuan.xchat_android_core.manager.agora;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import com.yizhuan.xchat_android_core.auth.AuthModel;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
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_core.room.bean.RoomInfo;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.lang.ref.WeakReference;
import io.agora.rtc.Constants;
import io.agora.rtc.IRtcEngineEventHandler;
import static io.agora.rtc.Constants.AUDIO_RECORDING_QUALITY_LOW;
/**
* @author by 梁馨 on 2020/9/14.
*/
public class RtcEngineHandler extends Handler {
public static int notifyJoinAvRoom = 0;
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) {
super.handleMessage(msg);
RtcEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) return;
if (msg.what == notifyJoinAvRoom) {
if (!rtcEngineManager.inRoom) {
IMNetEaseManager.get().joinAvRoom();
}
rtcEngineManager.inRoom = true;
if (rtcEngineManager.needRecord && rtcEngineManager.mRtcEngine != null) {
rtcEngineManager.mRtcEngine.startAudioRecording(Environment.getExternalStorageDirectory()
+ File.separator + BasicConfig.INSTANCE.getAppContext().getPackageName()
+ "/audio/" + System.currentTimeMillis() + ".aac", AUDIO_RECORDING_QUALITY_LOW);
}
} else if (msg.what == 1) {//onAudioVolumeIndication 说话声音音量提示回调
IRtcEngineEventHandler.AudioVolumeInfo[] speakers = (IRtcEngineEventHandler.AudioVolumeInfo[]) msg.obj;
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) return;
if (rtcEngineManager.speakQueueMembersPosition.size() > 0) {
rtcEngineManager.speakQueueMembersPosition.clear();
}
if (speakers == null || speakers.length == 0) return;
for (IRtcEngineEventHandler.AudioVolumeInfo speaker : speakers) {
// 0 代表的是房主,其他代表的是uid
long uid = speaker.uid == 0 ? rtcEngineManager.uid : speaker.uid;
int micPosition = AvRoomDataManager.get().getMicPosition(uid);
// 如果是房主的话,并且房主的mic位置没有的啊,则把房主的位置设置为-1(兼容ios轻聊房光晕)
if (uid == AvRoomDataManager.get().mCurrentRoomInfo.getUid() &&
AvRoomDataManager.get().mCurrentRoomInfo.getType() == RoomInfo.ROOMTYPE_LIGHT_CHAT
&& micPosition == Integer.MIN_VALUE) {
micPosition = -1;
}
if (micPosition == Integer.MIN_VALUE &&
uid == AuthModel.get().getCurrentUid()) {
// 如果麦上没有自己,并且自己在说话,要把自己变成听众
AudioEngineManager.get().setRole(Constants.CLIENT_ROLE_AUDIENCE);
} else if (micPosition == Integer.MIN_VALUE &&
uid != AuthModel.get().getCurrentUid()) {
// 如果麦上没有这个人,要把他静音
AudioEngineManager.get().setRemoteMute(uid, true);
}
if (micPosition == Integer.MIN_VALUE) continue;
rtcEngineManager.speakQueueMembersPosition.add(micPosition);
}
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE)
.setMicPositionList(rtcEngineManager.speakQueueMembersPosition)
);
} else if (msg.what == 2) {//onUserMuteAudio 用户静音回调
Integer uid = (Integer) msg.obj;
}
}
}

View File

@@ -0,0 +1,294 @@
package com.yizhuan.xchat_android_core.manager.agora;
import android.content.Context;
import android.os.Environment;
import android.os.Handler;
import android.text.TextUtils;
import android.util.Log;
import com.orhanobut.logger.Logger;
import com.yizhuan.xchat_android_constants.XChatConstants;
import com.yizhuan.xchat_android_core.manager.BaseEngine;
import com.yizhuan.xchat_android_core.music.db.bean.LocalMusicBean;
import com.yizhuan.xchat_android_core.music.model.PlayerModel;
import com.yizhuan.xchat_android_library.utils.config.BasicConfig;
import java.io.File;
import java.util.Locale;
import io.agora.rtc.Constants;
import io.agora.rtc.RtcEngine;
/**
* @author by 梁馨 on 2020/9/14.
*/
public class RtcEngineManager extends BaseEngine {
public static String TAG = RtcEngineManager.class.getSimpleName();
public RtcEngine mRtcEngine;
public Handler mRtcEngineHandler = new RtcEngineHandler(this);
public EngineEventHandler mEngineEventHandler = new EngineEventHandler(this);
public RtcEngineManager(Context context) {
super(context);
isAudienceRole = true;
this.isMute = true;
this.isRemoteMute = false;
}
@Override
public void enterChannel(long channelId, long uid) {
Logger.t(TAG).d("enterChannel channelId:%d", channelId);
if (mRtcEngine == null) {
try {
mEngineEventHandler = new EngineEventHandler(this);
mRtcEngine = RtcEngine.create(BasicConfig.INSTANCE.getAppContext(), XChatConstants.AGORA_KEY, mEngineEventHandler);
} catch (Exception e) {
throw new RuntimeException(
"NEED TO check rtc sdk init fatal error\n" + Log.getStackTraceString(e));
}
if (mRtcEngineHandler == null) {
mRtcEngineHandler = new RtcEngineHandler(this);
}
//设置频道模式为直播
mRtcEngine.setChannelProfile(Constants.CHANNEL_PROFILE_LIVE_BROADCASTING);
mRtcEngine.setAudioProfile(Constants.AUDIO_PROFILE_MUSIC_STANDARD,
Constants.AUDIO_SCENARIO_GAME_STREAMING);
mRtcEngine.enableAudioVolumeIndication(600, 3, false);
mRtcEngine.setDefaultAudioRoutetoSpeakerphone(true);
mRtcEngine.setExternalVideoSource(true, false, true);
mRtcEngine.setRecordingAudioFrameParameters(48000, 2, 2, 960);
mRtcEngine.setVideoProfile(Constants.VIDEO_PROFILE_360P, false);
mRtcEngine.enableDualStreamMode(true);
mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.headset.monitoring,true\"}"));
mRtcEngine.setParameters(String.format(Locale.US, "{\"che.audio.enable.androidlowlatencymode,true\"}"));
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);
}
@Override
public int stopAudioMixing() {
Logger.t(TAG).d("stopAudioMixing ");
if (mRtcEngine != null) {
int result = mRtcEngine.stopAudioMixing();
isMusicPlaying = false;
return result;
}
return -1;
}
@Override
public void resetChannel() {
Logger.t(TAG).d("resetChannel ");
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
mRtcEngine = null;
}
if (mRtcEngineHandler != null) {
mRtcEngineHandler.removeCallbacksAndMessages(null);
}
}
@Override
public void reEnterChannel(long channelId, long uid) {
enterChannel(channelId,uid);
setRemoteMute(isRemoteMute);
setMute(isMute);
}
@Override
public void leaveChannel() {
Logger.t(TAG).d("leaveChannel ");
if (mRtcEngine != null) {
stopAudioMixing();
mRtcEngine.leaveChannel();
RtcEngine.destroy();
mRtcEngine = null;
}
if (mRtcEngineHandler != null) {
mRtcEngineHandler.removeCallbacksAndMessages(null);
}
if (mEngineEventHandler != null) {
mEngineEventHandler = null;
}
isMute = true;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = true;
}
@Override
public void setRemoteMute(boolean mute) {
Logger.t(TAG).d("setRemoteMute mute=" + mute);
if (mRtcEngine != null) {
int result = mRtcEngine.muteAllRemoteAudioStreams(mute);
if (result == 0) {
isRemoteMute = mute;
}
}
}
@Override
public boolean isEnableLoopBack() {
return false;
}
@Override
public void setRemoteMute(long uid, boolean mute) {
Logger.t(TAG).d("setRemoteMute uid:%s mute:%s", uid, mute);
if (uid == 0) {
return;
}
if (mRtcEngine != null) {
//当蒙圈显示的时候房间需要静音,但是在房间的话还是不静音好点吧
mRtcEngine.muteRemoteAudioStream((int) uid, mute);
// if (result == 0) {
// isRemoteMute = mute;
// }
}
}
@Override
public boolean setRole(int role) {
Logger.t(TAG).d("setRole role=" + role + ",isAudienceRole:" + isAudienceRole );
if (mRtcEngine != null) {
mRtcEngine.setClientRole(role);
isAudienceRole = role == Constants.CLIENT_ROLE_AUDIENCE;
}
return true;
}
@Override
public void setMute(boolean mute) {
Logger.t(TAG).d("setMute bool:" + mute);
if (mRtcEngine == null) {
return;
}
mRtcEngine.muteLocalAudioStream(mute);
isMute = mute;
}
@Override
public void adjustAudioMixingVolume(int volume) {
Logger.t(TAG).d("adjustAudioMixingVolume" + volume);
if (mRtcEngine != null) {
mRtcEngine.adjustAudioMixingVolume(volume);
}
}
@Override
public void adjustRecordingSignalVolume(int volume) {
Logger.t(TAG).d("adjustRecordingSignalVolume volume=" + volume);
if (mRtcEngine != null) {
mRtcEngine.adjustRecordingSignalVolume(volume);
}
}
@Override
public int resumeAudioMixing() {
Logger.t(TAG).d("resumeAudioMixing");
if (mRtcEngine == null) {
return -1;
}
int currentPosition = mRtcEngine.getAudioMixingCurrentPosition();
int result = 0;
if (currentPosition > 0) {
result = mRtcEngine.resumeAudioMixing();
} else {
LocalMusicBean current = PlayerModel.get().getCurrent();
startAudioMixing(current.getLocalUri(), false, 1);
}
isMusicPlaying = true;
return result;
}
@Override
public int pauseAudioMixing() {
Logger.t(TAG).d("pauseAudioMixing");
if (mRtcEngine == null) {
return -1;
}
int result = mRtcEngine.pauseAudioMixing();
isMusicPlaying = false;
return result;
}
@Override
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
Logger.t(TAG).d("startAudioMixing filePath=" + filePath + " loopback=" + loopback + " cycle=" + cycle);
if (mRtcEngine == null || TextUtils.isEmpty(filePath)) {
return -1;
}
mRtcEngine.stopAudioMixing();
int result = 0;
try {
result = mRtcEngine.startAudioMixing(filePath, loopback, false, cycle);
} catch (Exception e) {
return -1;
}
isMusicPlaying = true;
return result;
}
//新方法还没有翻译 还没有验证
@Override
public int getAudioMixingCurrentPosition() {
if (mRtcEngine != null) {
return -1;
}
int currentPosition = mRtcEngine.getAudioMixingCurrentPosition();
Logger.t(TAG).d("getAudioMixingCurrentPosition() returned: " + currentPosition);
return currentPosition;
}
@Override
public int getAudioMixingDuration() {
if (mRtcEngine == null) {
return -1;
}
int audioMixingDuration = mRtcEngine.getAudioMixingDuration();
return audioMixingDuration;
}
@Override
public void setChatRoomOnlineStatus(boolean status) {
}
@Override
public void setASMRMode(boolean enable) {
}
}

View File

@@ -0,0 +1,14 @@
package com.yizhuan.xchat_android_core.manager.wj;
import com.yizhuan.xchat_android_core.BuildConfig;
public class WJAudioConstant {
public static volatile String LOG_DIR = "";
public static final String APPID = BuildConfig.DEBUG ? "6tKpYf2csykNjoHYsi7xlfVhCYDbq4xw":"";
public final static int MESSAGE_ENTER_CHANNEL_SUCCESS = 0;
public final static int MESSAGE_ENTER_CHANNEL_FAIL = 1;
public final static int MESSAGE_AUDIO_VOLUME_INDICATION = 2;
public static volatile String BUSINESS_UID = "";
}

View File

@@ -0,0 +1,423 @@
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 com.netease.nim.uikit.common.util.log.LogUtil;
import com.wjhd.wy.WJMediaEngine;
import com.wjhd.wy.audio.AudioEngine;
import com.wjhd.wy.audio.AudioEngineHandler;
import com.wjhd.wy.audio.constant.AudioRole;
import com.wjhd.wy.audio.constant.ErrorCode;
import com.wjhd.wy.audio.entity.AudioVolumeInfo;
import com.yizhuan.xchat_android_core.BuildConfig;
import com.yizhuan.xchat_android_core.manager.AvRoomDataManager;
import com.yizhuan.xchat_android_core.manager.BaseEngine;
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 org.jetbrains.annotations.NotNull;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicInteger;
public class WJAudioEngineManager extends BaseEngine {
public static final String TAG = "WJAudioEngineManager";
private String logfileDir;
private AudioEngine mAudioEngine;
private AudioEngineHandler audioEngineHandler;
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 void initRtcEngine() {
WJAudioConstant.LOG_DIR = logfileDir = Environment.getExternalStorageDirectory().getPath() + File.separator + context.getPackageName() + File.separator + "log";
if (audioEngineHandler == null) {
audioEngineHandler = new AudioHandler(this);
}
if (mAudioEngine == null) {
try {
AudioEngine.setRecordingAudioFrameParameters(44100, 2);
AudioEngine.setLogFileDir(logfileDir);
AudioEngine.setDebugMode(BuildConfig.DEBUG);//设置是否调试模式底层默认是false
mAudioEngine = WJMediaEngine.createAudioEngine(context, WJAudioConstant.APPID, audioEngineHandler);
} catch (Exception e) {
throw new RuntimeException("NEED TO check sdk init fatal error" + Log.getStackTraceString(e));
}
mAudioEngine.setDefaultAudioRoutetoSpeakerphone(true);
// 回调谁在说话
mAudioEngine.enableAudioVolumeIndication(400, 0);
mAudioEngine.setAudioMixingVAD(true);
mAudioEngine.setEnergyVadFlag(true);
}
}
private final Handler handler = new RtcEngineHandler(this);
private static class RtcEngineHandler extends Handler {
private final WeakReference<WJAudioEngineManager> mReference;
RtcEngineHandler(WJAudioEngineManager manager) {
mReference = new WeakReference<>(manager);
}
@Override
public void handleMessage(@NotNull Message msg) {
super.handleMessage(msg);
WJAudioEngineManager rtcEngineManager = mReference.get();
if (rtcEngineManager == null) return;
if (msg.what == WJAudioConstant.MESSAGE_ENTER_CHANNEL_SUCCESS) {
if (!rtcEngineManager.inRoom) {
//改成无界加入聊天室
IMNetEaseManager.get().joinAvRoom();
rtcEngineManager.inRoom = true;
}
} else if (msg.what == WJAudioConstant.MESSAGE_ENTER_CHANNEL_FAIL) {
int code = (int) msg.obj;
// 登录失败
LogUtil.e(TAG, "WJAudio onLoginCompletion: code: " + code);
SingleToastUtil.showToast("进房失败 code + " + code + ",请退出房间重新进入");
} else if (msg.what == WJAudioConstant.MESSAGE_AUDIO_VOLUME_INDICATION) {
//onAudioVolumeIndication 说话声音音量提示回调
AudioVolumeInfo[] speakers = (AudioVolumeInfo[]) msg.obj;
RoomInfo roomInfo = AvRoomDataManager.get().mCurrentRoomInfo;
if (roomInfo == null) return;
if (rtcEngineManager.speakQueueMembersPosition.size() > 0) {
rtcEngineManager.speakQueueMembersPosition.clear();
}
if (speakers == null || speakers.length == 0) return;
for (AudioVolumeInfo speaker : speakers) {
int micPosition = AvRoomDataManager.get().getMicPosition(speaker.uid);
if (micPosition == Integer.MIN_VALUE) continue;
rtcEngineManager.speakQueueMembersPosition.add(micPosition);
}
IMNetEaseManager.get().getChatRoomEventObservable().onNext(
new RoomEvent().setEvent(RoomEvent.SPEAK_STATE_CHANGE)
.setMicPositionList(rtcEngineManager.speakQueueMembersPosition)
);
}
}
}
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();
Message message = manager.handler.obtainMessage();
message.what = WJAudioConstant.MESSAGE_ENTER_CHANNEL_FAIL;
message.obj = err;
}
SingleToastUtil.showToast("RTC error! code: " + err);
}
@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;
}
}
@Override
public void onLastmileQuality(int quality) {
super.onLastmileQuality(quality);
if (100 > quality && quality > 50) {
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_BAD));
}
}
@Override
public void onConnectionLost() {
super.onConnectionLost();
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.RTC_ENGINE_NETWORK_CLOSE));
}
@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);
}
}
@Override
public void onAudioMixingFinished() {
super.onAudioMixingFinished();
IMNetEaseManager.postRoomEvent(new RoomEvent().setEvent(RoomEvent.METHOD_ON_AUDIO_MIXING_FINISHED));
}
@Override
public void onClientRoleChanged(AudioRole oldRole, AudioRole newRole) {
super.onClientRoleChanged(oldRole, newRole);
WJAudioEngineManager manager = mReference.get();
if (manager == null) {
return;
}
manager.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;
}
synchronized (manager.lock) {
manager.isServerKicked = true;
}
if (manager.isChaRoomInChannel) {
if (manager.mAudioEngine == null) return;
manager.mAudioEngine.joinChannel(manager.channelId, uid, WJAudioConstant.BUSINESS_UID);
manager.mAudioEngine.setRole(manager.curRole);
}
}
@Override
public void OnMicUniqueIDUpdate(String micUniqueID) {
super.OnMicUniqueIDUpdate(micUniqueID);
Log.e(TAG, "OnMicUniqueIDUpdate~~~" );
}
}
@Override
public void resetChannel() {
if (mAudioEngine != null) {
stopAudioMixing();
mAudioEngine.leaveChannel();
AudioEngine.destroy();
mAudioEngine = null;
}
if (audioEngineHandler != null) {
audioEngineHandler = null;
}
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = true;
curRole = AudioRole.NO_ROLE;
}
@Override
public void reEnterChannel(long channelId, long uid) {
resetChannel();
enterChannel(channelId, uid);
}
@Override
public void enterChannel(long channelId, long uid) {
initRtcEngine();
if (mAudioEngine == null) return;
mAudioEngine.joinChannel(channelId, uid, WJAudioConstant.BUSINESS_UID);
}
@Override
public void leaveChannel() {
Log.e(TAG, "leaveChannel~~~");
stopAudioMixing();
if (mAudioEngine != null) {
mAudioEngine.leaveChannel();
}
WJMediaEngine.destroyAudioEngine();
mAudioEngine = null;
if (audioEngineHandler != null) {
audioEngineHandler = null;
}
isMute = false;
isRemoteMute = false;
needRecord = false;
inRoom = false;
isAudienceRole = true;
curRole = AudioRole.NO_ROLE;
}
@Override
public boolean isEnableLoopBack() {
return false;
}
@Override
public boolean setRole(int role) {
if (role == ROLE_BROADCASTER) {
if (mAudioEngine != null) {
mAudioEngine.setRole(AudioRole.CLIENT_ROLE_BROADCASTER);
}
} else if (role == ROLE_AUDIENCE) {
if (mAudioEngine != null) {
mAudioEngine.setRole(AudioRole.CLIENT_ROLE_AUDIENCE);
}
}
//isAudienceRole 外表用于判断麦显示状态的
isAudienceRole = role == ROLE_AUDIENCE;
return true;
}
@Override
public void setRemoteMute(boolean mute) {
if (mAudioEngine == null) return;
mAudioEngine.muteAllRemoteAudioStreams(mute);
isRemoteMute = mute;
}
@Override
public void setMute(boolean mute) {
if (mAudioEngine == null) return;
isMute = mute;
mAudioEngine.muteLocalAudioStream(mute);
}
@Override
public void adjustAudioMixingVolume(int volume) {
if (mAudioEngine == null) return;
mAudioEngine.adjustAudioMixingVolume(volume);
}
@Override
public void adjustRecordingSignalVolume(int volume) {
if (mAudioEngine == null) return;
mAudioEngine.adjustRecordingSignalVolume(volume);
}
@Override
public int resumeAudioMixing() {
int res = -1;
if (mAudioEngine != null) {
res = mAudioEngine.resumeAudioMixing();
}
if (res == 0) {
isMusicPlaying = true;
}
return res;
}
@Override
public int pauseAudioMixing() {
int res = -1;
if (mAudioEngine != null) {
res = mAudioEngine.pauseAudioMixing();
}
if (res == 0) {
isMusicPlaying = false;
}
return res;
}
@Override
public int startAudioMixing(String filePath, boolean loopback, int cycle) {
int res = -1;
if (mAudioEngine != null) {
res = mAudioEngine.startAudioMixing(filePath);
}
if (res == 0) {
isMusicPlaying = true;
}
return res;
}
@Override
public int stopAudioMixing() {
int res = -1;
if (mAudioEngine != null) {
res = mAudioEngine.stopAudioMixing();
}
if (res == 0) {
isMusicPlaying = false;
}
return res;
}
@Override
public int getAudioMixingCurrentPosition() {
if (mAudioEngine == null) {
return 0;
}
return (int) mAudioEngine.getAudioMixingCurrentPosition();
}
@Override
public int getAudioMixingDuration() {
if (mAudioEngine == null) {
return 0;
}
return (int) mAudioEngine.getAudioMixingDuration();
}
@Override
public void setRemoteMute(long uid, boolean mute) {
}
@Override
public void setChatRoomOnlineStatus(boolean status) {
if (status && isServerKicked) {
if (mAudioEngine == null) return;
mAudioEngine.joinChannel(channelId, uid, WJAudioConstant.BUSINESS_UID);
mAudioEngine.setRole(curRole);
synchronized (lock) {
isServerKicked = false;
}
}
synchronized (lock) {
isChaRoomInChannel = status;
}
}
@Override
public void setASMRMode(boolean enable) {
if (mAudioEngine == null) {
return;
}
mAudioEngine.setDenioseLevel(enable ? 0 : 75);
mAudioEngine.setAudioEncodeBitRate(enable ? 192000 : 128000);
}
}

View File

@@ -191,7 +191,7 @@ public final class AvRoomDataManager {
public void release() {
IMNetEaseManager.get().release();
GameModel.get().clear();
RtcEngineManager.get().leaveChannel();
AudioEngineManager.get().leaveChannel();
clear();
chatRoomDataRelease();
//清空缓存

View File

@@ -8,7 +8,7 @@ import com.yizhuan.xchat_android_core.base.BaseModel;
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_core.manager.RtcEngineManager;
import com.yizhuan.xchat_android_core.manager.AudioEngineManager;
import com.yizhuan.xchat_android_core.music.bean.LocalMusicInfo;
import com.yizhuan.xchat_android_core.music.db.bean.LocalMusicBean;
import com.yizhuan.xchat_android_core.music.db.model.LocalMusicDbModel;
@@ -220,7 +220,7 @@ public class PlayerModel extends BaseModel implements IPlayerModel {
}
if (current != null && state == STATE_PAUSE && current.getLocalUri().equals(localMusicBean.getLocalUri())) {
state = STATE_PLAY;
RtcEngineManager.get().resumeAudioMixing();
AudioEngineManager.get().resumeAudioMixing();
EventBus.getDefault().post(new MusicPlayingEvent());
return 0;
}
@@ -241,9 +241,9 @@ public class PlayerModel extends BaseModel implements IPlayerModel {
return -1;
}
}
RtcEngineManager.get().adjustAudioMixingVolume(volume);
RtcEngineManager.get().adjustRecordingSignalVolume(recordingVolume);
int result = RtcEngineManager.get().startAudioMixing(localUri, false, 1);
AudioEngineManager.get().adjustAudioMixingVolume(volume);
AudioEngineManager.get().adjustRecordingSignalVolume(recordingVolume);
int result = AudioEngineManager.get().startAudioMixing(localUri, false, 1);
if (result == -1) {
return -1;
}
@@ -257,7 +257,7 @@ public class PlayerModel extends BaseModel implements IPlayerModel {
@Override
public synchronized void pause() {
if (state == STATE_PLAY) {
RtcEngineManager.get().pauseAudioMixing();
AudioEngineManager.get().pauseAudioMixing();
state = STATE_PAUSE;
EventBus.getDefault().post(new MusicPauseEvent());
}
@@ -266,7 +266,7 @@ public class PlayerModel extends BaseModel implements IPlayerModel {
@Override
public synchronized void stop() {
if (state != STATE_STOP) {
RtcEngineManager.get().stopAudioMixing();
AudioEngineManager.get().stopAudioMixing();
state = STATE_STOP;
current = null;
currentLocalId = 0;
@@ -303,14 +303,14 @@ public class PlayerModel extends BaseModel implements IPlayerModel {
public void seekVolume(int volume) {
this.volume = volume;
CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("volume", volume);
RtcEngineManager.get().adjustAudioMixingVolume(volume);
AudioEngineManager.get().adjustAudioMixingVolume(volume);
}
@Override
public void seekRecordingVolume(int volume) {
this.recordingVolume = volume;
CommonPref.instance(BasicConfig.INSTANCE.getAppContext()).putInt("recordingVolume", volume);
RtcEngineManager.get().adjustRecordingSignalVolume(volume);
AudioEngineManager.get().adjustRecordingSignalVolume(volume);
}
@Override