From cc54f69852e1689185a0be17e3dbf24cbc9a02d0 Mon Sep 17 00:00:00 2001 From: huangjian Date: Thu, 15 Apr 2021 18:45:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=97=A0=E7=95=8C=E8=AF=AD?= =?UTF-8?q?=E9=9F=B3=E7=9B=B4=E6=92=ADSDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/yizhuan/erban/MainActivity.java | 6 +- .../erban/application/XChatApplication.java | 1 + .../yizhuan/erban/audio/MyVoiceActivity.java | 8 +- .../erban/audio/VoiceMatchActivity.java | 6 +- .../erban/avroom/activity/AVRoomActivity.java | 4 - .../fragment/HomePartyRoomFragment.java | 28 +- .../erban/avroom/game/PlayGameActivity.java | 10 +- .../yizhuan/erban/avroom/game/PlayGameVm.java | 14 +- .../erban/avroom/ktv/KtvMusicManager.java | 20 +- .../erban/avroom/ktv/KtvSelectSongDialog.java | 4 +- .../com/yizhuan/erban/avroom/ktv/KtvView.java | 50 +-- .../avroom/presenter/AvRoomPresenter.java | 25 +- .../erban/avroom/widget/MicroView.java | 8 +- .../home/activity/HomeMoreRoomActivity.java | 7 +- .../fragment/LocalMusicListFragment.java | 6 +- build.gradle | 7 + core/build.gradle | 3 + .../manager/AudioEngineManager.java | 339 ++++++++++++++ .../manager/BaseEngine.java | 77 ++++ .../manager/EngineType.java | 6 + .../manager/IAudioEngine.java | 72 +++ .../manager/IMNetEaseManager.java | 20 +- .../manager/RtcEngineManager.java | 74 +-- .../manager/VolumeSetting.java | 42 ++ .../manager/agora/EngineEventHandler.java | 214 +++++++++ .../manager/agora/RtcEngineHandler.java | 94 ++++ .../manager/agora/RtcEngineManager.java | 294 ++++++++++++ .../manager/wj/WJAudioConstant.java | 14 + .../manager/wj/WJAudioEngineManager.java | 423 ++++++++++++++++++ .../manager/AvRoomDataManager.java | 2 +- .../music/model/PlayerModel.java | 18 +- 31 files changed, 1702 insertions(+), 194 deletions(-) create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/AudioEngineManager.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/BaseEngine.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/EngineType.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IAudioEngine.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/VolumeSetting.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/EngineEventHandler.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineHandler.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineManager.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioConstant.java create mode 100644 core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioEngineManager.java diff --git a/app/src/main/java/com/yizhuan/erban/MainActivity.java b/app/src/main/java/com/yizhuan/erban/MainActivity.java index 417941ddb..a808e56f0 100644 --- a/app/src/main/java/com/yizhuan/erban/MainActivity.java +++ b/app/src/main/java/com/yizhuan/erban/MainActivity.java @@ -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 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); } diff --git a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java index a932c1f4f..1b7109bcd 100644 --- a/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java +++ b/app/src/main/java/com/yizhuan/erban/application/XChatApplication.java @@ -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; diff --git a/app/src/main/java/com/yizhuan/erban/audio/MyVoiceActivity.java b/app/src/main/java/com/yizhuan/erban/audio/MyVoiceActivity.java index c5b19be81..e744d3581 100644 --- a/app/src/main/java/com/yizhuan/erban/audio/MyVoiceActivity.java +++ b/app/src/main/java/com/yizhuan/erban/audio/MyVoiceActivity.java @@ -97,7 +97,7 @@ public class MyVoiceActivity extends BaseMvpActivity { 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 || diff --git a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java index adec1fbd2..7c350cfbf 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/activity/AVRoomActivity.java @@ -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 { 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 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); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvMusicManager.java b/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvMusicManager.java index 6922bd1fd..a4c740b6b 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvMusicManager.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvMusicManager.java @@ -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)); diff --git a/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvSelectSongDialog.java b/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvSelectSongDialog.java index da7443e2a..af296398a 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvSelectSongDialog.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/ktv/KtvSelectSongDialog.java @@ -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 { - 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); } diff --git a/app/src/main/java/com/yizhuan/erban/avroom/presenter/AvRoomPresenter.java b/app/src/main/java/com/yizhuan/erban/avroom/presenter/AvRoomPresenter.java index 482f7b14e..cf532a720 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/presenter/AvRoomPresenter.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/presenter/AvRoomPresenter.java @@ -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 { .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, diff --git a/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java b/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java index e213eefed..c0244f94e 100644 --- a/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java +++ b/app/src/main/java/com/yizhuan/erban/avroom/widget/MicroView.java @@ -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() { diff --git a/app/src/main/java/com/yizhuan/erban/home/activity/HomeMoreRoomActivity.java b/app/src/main/java/com/yizhuan/erban/home/activity/HomeMoreRoomActivity.java index 7beeee13b..177e84f69 100644 --- a/app/src/main/java/com/yizhuan/erban/home/activity/HomeMoreRoomActivity.java +++ b/app/src/main/java/com/yizhuan/erban/home/activity/HomeMoreRoomActivity.java @@ -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 { - int duration = RtcEngineManager.get().getAudioMixingDuration(); - int position = RtcEngineManager.get().getAudioMixingCurrentPosition(); + int duration = AudioEngineManager.get().getAudioMixingDuration(); + int position = AudioEngineManager.get().getAudioMixingCurrentPosition(); setAudioCurrentPosition(position, duration); }); } diff --git a/build.gradle b/build.gradle index fac749db6..bb02adc0f 100644 --- a/build.gradle +++ b/build.gradle @@ -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 里面找个代理的仓库。 } diff --git a/core/build.gradle b/core/build.gradle index 8b9253599..6c0dbd29e 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -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' diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/AudioEngineManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/AudioEngineManager.java new file mode 100644 index 000000000..7961e55a2 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/AudioEngineManager.java @@ -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-------------------------- + + +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/BaseEngine.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/BaseEngine.java new file mode 100644 index 000000000..342f7fd04 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/BaseEngine.java @@ -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 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; + } + +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/EngineType.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/EngineType.java new file mode 100644 index 000000000..37c0a30ba --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/EngineType.java @@ -0,0 +1,6 @@ +package com.yizhuan.xchat_android_core.manager; + +public enum EngineType { + TYPE_AGORA, + TYPE_WJ, +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IAudioEngine.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IAudioEngine.java new file mode 100644 index 000000000..4c43c418c --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IAudioEngine.java @@ -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) { + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java index 332289322..567a3c274 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/IMNetEaseManager.java @@ -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); } } diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java index 6c3274767..928f8c872 100644 --- a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/RtcEngineManager.java @@ -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 speakers; - /** - * 说话列表 - */ - private List 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); diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/VolumeSetting.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/VolumeSetting.java new file mode 100644 index 000000000..a0c328e92 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/VolumeSetting.java @@ -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); + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/EngineEventHandler.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/EngineEventHandler.java new file mode 100644 index 000000000..a5077a3df --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/EngineEventHandler.java @@ -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 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 + "")); + + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineHandler.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineHandler.java new file mode 100644 index 000000000..116b0ca33 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineHandler.java @@ -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 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; + } + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineManager.java new file mode 100644 index 000000000..c750581e5 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/agora/RtcEngineManager.java @@ -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) { + + } +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioConstant.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioConstant.java new file mode 100644 index 000000000..d0a90e848 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioConstant.java @@ -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 = ""; +} diff --git a/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioEngineManager.java b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioEngineManager.java new file mode 100644 index 000000000..36434f156 --- /dev/null +++ b/core/src/diff_src_erban/java/com/yizhuan/xchat_android_core/manager/wj/WJAudioEngineManager.java @@ -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 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 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); + } + + +} diff --git a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java index 5c22a1801..05a30e91d 100644 --- a/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java +++ b/core/src/main/java/com/yizhuan/xchat_android_core/manager/AvRoomDataManager.java @@ -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(); //清空缓存 diff --git a/core/src/model_music/java/com/yizhuan/xchat_android_core/music/model/PlayerModel.java b/core/src/model_music/java/com/yizhuan/xchat_android_core/music/model/PlayerModel.java index 6f9cc6e3a..87ffce97e 100644 --- a/core/src/model_music/java/com/yizhuan/xchat_android_core/music/model/PlayerModel.java +++ b/core/src/model_music/java/com/yizhuan/xchat_android_core/music/model/PlayerModel.java @@ -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