123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497 |
- //
- // TXClassroomViewController.m
- // KulexiuForStudent
- //
- // Created by 王智 on 2023/8/16.
- //
- #import "TXClassroomViewController.h"
- #import "TXClassTitleView.h"
- #import "TXClassroomMainContainer.h"
- #import "TXClassroomVideoListView.h"
- #import "TXClassRoomAlertView.h"
- // 聊天列表
- #import "LoginHelper.h"
- #import "TXChatAreaView.h"
- #import "TXRTCService.h"
- #import "Classroom.h"
- #import "ClassroomService.h"
- #import <MBProgressHUD/MBProgressHUD.h>
- #import "AppDelegate.h"
- #import "KSWhiteboardControl.h"
- #import "UIDevice+TFDevice.h"
- #import "KSRemoteUserManager.h"
- #import "LocalRenderManager.h"
- #import "NSDate+Transform.h"
- #import "UIViewController+zhStatusBarStyle.h"
- #import "KSTipsView.h"
- #import "ClassroomTimerManager.h"
- #import "VideoMaskView.h"
- #import "TXDanMuView.h"
- #import "TXTimeView.h"
- #define TitleViewHeight (66)
- #define KSExamSongFileKey (@"KSAccompanyDownload")
- #define KSSongFolderName (@"KSClassroomSongFile")
- #define TTimeLableWidth (180)
- #define TTimeLableHeight (20)
- @interface TXClassroomViewController ()<TXClassTitleViewDelegate, ClassroomDelegate, TXClassroomMainContainerDelegate, UIGestureRecognizerDelegate, KSWhiteboardControlDelegate, TXClassVideoListViewDelegate, ClassroomTimerManagerDelegate,TXRTCServiceDelegate>
- @property (nonatomic, strong) TXClassTitleView *titleView;
- @property (nonatomic, strong) TXClassroomMainContainer *containerView;
- @property (nonatomic, strong) TXClassroomVideoListView *videoListView;
- @property (nonatomic, strong) TXChatAreaView *chatAreaView;
- @property (nonatomic, strong) KSWhiteboardControl *wBoardCtrl;
- @property (nonatomic, strong) MBProgressHUD *hud;
- @property (nonatomic, strong) UILabel *networkLabel;
- @property (nonatomic, assign) BOOL cancleAlert;
- @property (nonatomic, assign) BOOL isQuitRoom; // 是否正在退出房间
- @property (nonatomic, assign) BOOL hasShowAlert;
- @property (nonatomic, assign) BOOL isChat;
- /** 定时器 */
- @property (nonatomic, strong) NSTimer *timer;
- /** 定时器多少秒循环一次 */
- @property (nonatomic, assign) float timerLength;
- /** 当前是否播放状态 */
- @property (nonatomic, assign) BOOL isPlay;
- /** 当前发出的声次数(用来判断播放"嘀"还是"咚"声音) */
- @property (nonatomic, assign) int currentTotalNo;
- /** 节拍类型 */
- @property (nonatomic, assign) TXKSMetronomeType metronomeStat;
- /** 播放速率,范围40~240 */
- @property (nonatomic, assign) int rate;
- // 播放节拍器音量
- @property (nonatomic, assign) NSInteger volume;
- /** 记录上一次的频率 */
- @property (nonatomic, assign) int lastRate;
- @property (nonatomic, strong) NSString *pathDing;
- @property (nonatomic, strong) NSString *pathDong;
- @property (nonatomic, strong) KSTipsView *tipsView;
- @property (nonatomic, strong) ClassroomTimerManager *timeManager;
- @property (nonatomic, strong) UILabel *timeLabel;
- @property (nonatomic, strong) TXClassRoomAlertView *alertView;
- @property (nonatomic, strong) VideoMaskView *maskView;
- @property (nonatomic, assign) BOOL squareOn; // 是否开大屏
- // 是否隐藏了列表
- @property (nonatomic, assign) BOOL videoListHidden;
- @property (nonatomic, strong) UIButton *showButton;
- @property (nonatomic, strong) TXDanMuView *danView;
- @property (nonatomic, strong) TXTimeView *timeView;
- // 群属性
- @property (nonatomic, assign) BOOL cancelMuteFlag;
- @property (nonatomic, assign) BOOL isMuteAll;
- @end
- @implementation TXClassroomViewController
- - (void)changeOrientation:(BOOL)isLandScape {
- if (isLandScape) {
- // 切换到横屏
- if (IS_IPAD) {
- self.zh_statusBarHidden = YES;
- }
- AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
- delegate.allowAutoRotate = YES;
- [UIDevice switchNewOrientation:UIInterfaceOrientationLandscapeRight inController:self];
- }
- else {
- // 切换到横屏
- AppDelegate* delegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
- delegate.allowAutoRotate = NO;
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- if (IS_IPAD) {
- self.zh_statusBarHidden = NO;
- }
- [UIDevice switchNewOrientation:UIInterfaceOrientationPortrait inController:self];
- }); }
- }
- #pragma mark - Life cycle
- - (void)viewWillAppear:(BOOL)animated {
- [super viewWillAppear:animated];
- [[UIApplication sharedApplication] setIdleTimerDisabled:YES];
- [IQKeyboardManager sharedManager].enableAutoToolbar = NO;
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- if (_isPlay) {
- [self pause];
- [self removeAll];
- }
- // 竖屏
- [[UIApplication sharedApplication] setIdleTimerDisabled:NO];
- [IQKeyboardManager sharedManager].enableAutoToolbar = YES;
- [self hideAlertView];
- [self judgeShowAlert];
- }
- - (void)hideAlertView {
- if (self.alertView && self.alertView.isShow) {
- [self.alertView dismissAlertView];
- }
- }
- - (void)judgeShowAlert {
- if (self.cancleAlert || self.hasShowAlert) {
- return;
- }
- if (![NSString isEmptyString:self.classEndTime]) {
- NSDateFormatter *dateFormatter = [NSObject getDateformatter];
- [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
- NSDate *endDate = [dateFormatter dateFromString:self.classEndTime];
- NSDate *currentDate = [NSDate date];
- NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:endDate];
- if (timeInterval >= 0) { // 课程结束弹出评价
- self.hasShowAlert = YES;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"showEvaluateAlert" object:self.courseId];
- }
- }
- }
- - (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
- // 切换到横屏
- [self changeOrientation:YES];
- [self getRoomGroupConfig];
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- // Do any additional setup after loading the view.
-
- self.ks_prefersNavigationBarHidden = YES;
-
- self.view.backgroundColor = HexRGB(0xffffff);
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(leaveRoomAction) name:@"classroomLogout" object:nil];
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(quitRoomAction) name:@"classroomQuit" object:nil];
-
- [self addSubviews];
- [self bindDelegates];
- [self publishStream];
- [self renderMainContainerView];
- self.timeManager.isDisplay = YES;
- [TRTC_MANAGER useSpeaker:YES];
- UITapGestureRecognizer *tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
- [self.view addGestureRecognizer:tapGes];
- tapGes.delegate = self;
- [self showRoleHud];
- self.isQuitRoom = NO;
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(backgroundQuitRoomAction) name:@"backgroundQuit" object:nil];
- [self preloadNodeMusic];
- }
- - (void)backgroundQuitRoomAction {
- self.isQuitRoom = YES;
- [[LoginHelper sharedInstance] logout];
-
- self.cancleAlert = YES;
- }
- #pragma mark ----- 账号异地登陆
- - (void)leaveRoomAction {
- [self showMessage:@"该账号在其他设备上登录"];
- self.isQuitRoom = YES;
- [[LoginHelper sharedInstance] logout];
- self.cancleAlert = YES;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"backLoginView" object:nil];
- }
- - (void)quitRoomAction {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- self.isQuitRoom = YES;
- [[LoginHelper sharedInstance] logout];
- self.cancleAlert = YES;
- [[NSNotificationCenter defaultCenter] postNotificationName:@"showOtherLoginAlert" object:nil];
- });
- }
- // 提示信息
- - (void)showMessage:(NSString *)message {
- MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
- [self.view bringSubviewToFront:hud];
- hud.removeFromSuperViewOnHide =YES;
- hud.mode = MBProgressHUDModeText;
- hud.label.text = message;
- hud.minSize = CGSizeMake(132.f, 60.0f);
- hud.label.textColor = [UIColor whiteColor];
- hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
- hud.bezelView.backgroundColor = [UIColor colorWithHexString:@"#000000" alpha:0.8];
- [hud hideAnimated:YES afterDelay:2];
- }
- - (void)tapGesture: (UITapGestureRecognizer *)tapGesture {
- if (self.titleView.isDisplay) {
- self.titleView.isDisplay = NO;
- self.timeManager.isDisplay = NO;
- }
- else {
- self.titleView.isDisplay = YES;
- self.timeManager.isDisplay = YES;
- }
- [self hideChatAreaView];
- [self.danView resetInputStatus];
- }
- -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
- if ([touch.view isDescendantOfView:self.chatAreaView] || [touch.view isDescendantOfView:self.videoListView] || [touch.view isDescendantOfView:self.maskView] || [touch.view isDescendantOfView:self.wBoardCtrl.customWebView.refreshButton] || [touch.view isDescendantOfView:self.danView] || [touch.view isDescendantOfView:self.titleView]) {
- return NO;
- }
- // if ([touch.view isDescendantOfView:self.wBoardCtrl.wbView] || [touch.view isDescendantOfView:self.wBoardCtrl.customWebView] || [touch.view isDescendantOfView:self.containerView]) {
- // [self tapGesture:(UITapGestureRecognizer *)gestureRecognizer];
- // }
- return YES;
- }
- - (void)showRoleHud {
- Role role = [ClassroomService sharedService].currentRoom.currentMember.role;
- if(role == RoleAudience) {
- [self.tipsView showTipsMessage:@"你当前身份是旁听人,其他人看/听不见你" inView:self.view];
-
- [self performSelector:@selector(showOnlyYouHUD) withObject:nil afterDelay:5.0f];
- }else{
- [self showOnlyYouHUD];
- }
- }
- - (void)showOnlyYouHUD {
- if ([ClassroomService sharedService].currentRoom.memberList.count == 1) {
- [self.tipsView showTipsMessage:@"当前课堂只有你一人,你可以等待或离开" inView:self.view];
- }
- }
- #pragma mark --- TXClassTitleViewDelegate
- - (void)classTitleView:(UIButton *)button didTapAtTag:(ClassTitleViewActionTag)tag {
- [self.chatAreaView resetInputStatus];
- [self.danView resetInputStatus];
- ClassRoomTitleButton *tagButton = [self.titleView viewWithTag:tag+1000];
- switch (tag) {
- case ClassTitleViewActionTagMicrophone:
- {
- if (tagButton.isSelected == NO) {
- [[ClassroomService sharedService] enableDevice:NO withType:DeviceTypeMicrophone];
- }
- else {
- if (self.isMuteAll && self.cancelMuteFlag == NO) {
- [self.tipsView showTipsMessage:@"老师不允许自行解除静音" inView:self.view];
- return;
- }
-
- [[ClassroomService sharedService] enableDevice:YES withType:DeviceTypeMicrophone];
- }
- }
- break;
- case ClassTitleViewActionTagCamera:
- {
- if (tagButton.isSelected == NO) {
-
- [[ClassroomService sharedService] enableDevice:NO withType:DeviceTypeCamera];
- }
- else {
- [[ClassroomService sharedService] enableDevice:YES withType:DeviceTypeCamera];
- }
- }
- break;
- case ClassTitleViewActionTagSwitchCamera:
- {
- [TRTC_MANAGER switchCamera];
- }
- break;
- case ClassTitleViewActionTagDan: // 弹幕开关
- {
- tagButton.isSelected = !tagButton.isSelected;
- if (tagButton.isSelected) { // 关闭弹幕
- [self hideDanChatView];
- }
- else { // 开启弹幕
- [self showDanChatView];
- }
- }
- break;
- case ClassTitleViewActionTagChat:
- {
- tagButton.isSelected = !tagButton.isSelected;
- tagButton.isSelected ? [self showChatAreaView] : [self hideChatAreaView];
- self.isChat = tagButton.isSelected;
- }
- break;
- case ClassTitleViewActionTagHangup:
- {
- MJWeakSelf;
- self.alertView = [TXClassRoomAlertView shareInstance];
- [self.alertView configWithTitle:@"提示" desc:@"确认退出课堂吗?" leftTitle:@"取消" rightTitle:@"确认" cancel:^{
-
- } confirm:^{
- weakSelf.isQuitRoom = YES;
- weakSelf.hud = [self createProgressHUD];
- [[LoginHelper sharedInstance] logout];
- }];
- }
- break;
- default:
- break;
- }
- }
- #pragma mark ---- ClassroomTimerManager delegate
- - (void)formatTime:(NSString *)timeString {
- self.timeView.timeLabel.text = timeString;
- }
- - (void)timeLabelAddAnimation:(CABasicAnimation *)animation {
- self.timeView.timeLabel.textColor = HexRGB(0x2DC7AA);
- [self.timeView.timeLabel.layer addAnimation:animation forKey:nil];
- }
- - (void)hiddenTitleView {
- self.titleView.isDisplay = NO;
- }
- - (void)quitClassroomNotifer {
- // 课程结束后15分钟自动退出房间 连堂课不退出(对内)
- if (self.isQuitRoom == NO) {
- self.isQuitRoom = YES;
- // 退出房间
- [self.tipsView showTipsMessage:@"课程已结束" inView:self.view];
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 课程结束退出房间
- SealClassLog(@"ClassEnd!");
- self.hud = [self createProgressHUD];
- [[LoginHelper sharedInstance] logout];
- });
- }
- }
- #pragma mark - ClassroomDelegate
- - (void)roomDidLeave {
- NSLog(@"roomDidLeave");
- // 关闭白板连接
- [self.wBoardCtrl.wbView.sdk setCommonCallbackDelegate:nil];
- [self.wBoardCtrl.wbView.room disconnect:^{
- }];
- [TRTC_MANAGER leaveRoom:^(NSInteger code) {
-
- }];
-
- [self dismissClassroom];
- }
- - (void)dismissClassroom {
- [self.hud hideAnimated:YES];
- [ClassroomService sharedService].currentRoom = nil;
- [self changeOrientation:NO];
- [self.timeManager stopDurationTimer];
- [self.timeLabel.layer removeAllAnimations];
- if(_isPlay) {
- [self pause];
- [self removeAll];
- }
-
- [self.navigationController popViewControllerAnimated:YES];
- }
- - (void)memberDidJoin:(RoomMember *)member {
- NSLog(@"memberDidJoin %@",member);
- if(member.role != RoleAudience) {
- [self.videoListView reloadVideoList];
- }
- if (member.role == RoleTeacher || member.role == RoleAssistant) {
- [self.tipsView showTipsMessage:[NSString stringWithFormat:@"老师%@已经进入教室", member.name] inView:self.view];
- if (_isPlay) {
- [self pause];
- [self removeAll];
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- if ([ClassroomService sharedService].currentRoom.isPlaySong) {
- [self stopMixUrl];
- [ClassroomService sharedService].currentRoom.isPlaySong = NO;
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- [self renderMainContainerView];
- }
- else if ((member.role == RoleStudent) && (_isPlay || [ClassroomService sharedService].currentRoom.isPlaySong)) {
- [TRTC_MANAGER unPlayRemoteStudentWithId:member.userId];
- }
- }
- - (void)memberDidLeave:(RoomMember *)member {
- NSLog(@"memberDidLeave %@",member);
- // 此处移除
- [[KSRemoteUserManager shareInstance] removeUser:member.userId];
-
- if(member.role != RoleAudience) {
- [self.videoListView reloadVideoList];
- }
- if (member.role == RoleTeacher || member.role == RoleAssistant) {
- // 老师退出房间后,学生如果在节拍器播放时停止节拍器
- if (_isPlay) {
- [self pause];
- [self removeAll];
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- if ([ClassroomService sharedService].currentRoom.isPlaySong) {
- [self stopMixUrl];
- [ClassroomService sharedService].currentRoom.isPlaySong = NO;
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- [[ClassroomService sharedService].currentRoom changeDisplayNone];
- [self noneDidDisplay];
- }
- }
- - (void)memberDidKick:(RoomMember *)member {
- NSLog(@"memberDidKick %@",member);
- [[KSRemoteUserManager shareInstance] removeUser:member.userId];
- if ([ClassroomService sharedService].currentRoom.currentMember.role == RoleTeacher) {
- [self.tipsView showTipsMessage:[NSString stringWithFormat:@"你已将%@移出课堂", member.name] inView:self.view];
- }
- [self.videoListView reloadVideoList];
- if (self.containerView.member.role == member.role) {
- [self.containerView cancelRenderView];
- }
- }
- - (void)errorDidOccur:(ErrorCode)code {
- NSLog(@"errorDidOccur %@",@(code));
- [self.hud hideAnimated:YES];
- if (code != ErrorCodeSuccess) {
- if (code == ErrorCodeOverMaxUserCount) {
- [self.tipsView showTipsMessage:@"超过人数限制" inView:self.view];
- }else {
- [self.tipsView showTipsMessage:@"操作失败,请稍后再试" inView:self.view];
- }
- }
- }
- - (void)deviceDidEnable:(BOOL)enable type:(DeviceType)type forUser:(RoomMember *)member operator:(nonnull NSString *)operatorId {
- NSLog(@"deviceDidEnable devicetype:%@ enable:%@ memeber:%@",@(type),@(enable),member);
- RoomMember *curMember = [ClassroomService sharedService].currentRoom.currentMember;
- NSString *hudMessage = @"";
- if ([curMember.userId isEqualToString:member.userId]) {
- if (type == DeviceTypeCamera) { // 摄像头
- // 非自己操作才需要做提示
- if(![curMember.userId isEqualToString:operatorId]){
- hudMessage = !enable ? @"老师已关闭你的摄像头" : NSLocalizedStringFromTable(@"CameraOpend", @"SealClass", nil);
- [self.tipsView showTipsMessage:hudMessage inView:self.view];
- }
- [self.titleView refreshTitleView];
- [TRTC_MANAGER setCameraDisable:!enable];
- [self refreshVideoView:member];
- } else if (type == DeviceTypeMicrophone) { // 麦克风
- // 非自己操作才需要做提示
- if(![curMember.userId isEqualToString:operatorId]){
- hudMessage = !enable ? @"老师已关闭你的麦克风" : NSLocalizedStringFromTable(@"MicorophoneOpend", @"SealClass", nil);
- [self.tipsView showTipsMessage:hudMessage inView:self.view];
- }
- [self.titleView refreshTitleView];
- [TRTC_MANAGER setMicrophoneDisable:!enable];
- }
- else if (type == DeviceTypeMusicMode) {
-
- }
- else if (type == DeviceTypeHandup) {
- [self.containerView refreshToolView];
- [self.videoListView updateUserVideo:member.userId];
- }
- else if (type == DeviceTypeExamSong) {
-
- }
- else if (type == DeviceTypeAccompany || type == DeviceTypeMusicScore) { // 原音或伴奏
- if (enable) {
- [self playSongAction];
- }
- else {
- [self playSongEnable:NO];
- }
- }
- }
- else {
- if (type == DeviceTypeHandup) { // 摄像头
- [self.videoListView updateUserVideo:member.userId];
- }
- // else if (type == DeviceTypeMicrophone) { // 麦克风
- //
- // }
- }
- }
- // 刷新单个视频显示
- - (void)refreshVideoView:(RoomMember *)member {
- NSString *currentUserID = [ClassroomService sharedService].currentRoom.currentMemberId;
- if (self.squareOn && [member.userId isEqualToString:currentUserID]) {
- if (member.cameraEnable) {
- self.maskView.closeCameraView.hidden = YES;
- }
- else {
- self.maskView.closeCameraView.hidden = NO;
- }
- }
- else {
- // 刷新单个数据
-
- RoomMember *curMember = [ClassroomService sharedService].currentRoom.currentMember;
- if ([member.userId isEqualToString:curMember.userId]) {
- if ([ClassroomService sharedService].currentRoom.currentDisplayType != DisplayWhiteboard && [[ClassroomService sharedService].currentRoom.currentDisplayURI isEqualToString:member.userId]) {
- [self.wBoardCtrl hideBoard];
- [self.containerView containerViewRenderView:member];
- }
- else {
- [self.videoListView updateUserVideo:member.userId];
- }
- [self.titleView refreshTitleView];
- }
- else {
- if ([ClassroomService sharedService].currentRoom.currentDisplayType != DisplayWhiteboard && [[ClassroomService sharedService].currentRoom.currentDisplayURI isEqualToString:member.userId]) {
- [self.wBoardCtrl hideBoard];
- [self.containerView containerViewRenderView:member];
- }
- else {
- [self.videoListView updateUserVideo:member.userId];
- }
- }
- }
- [self.containerView refreshToolView];
- }
- - (void)controlDeviceDidEnable:(BOOL)enable type:(DeviceType)type forUser:(RoomMember *)member {
- NSLog(@"controlDeviceDidEnable devicetype:%@ enable:%@ memeber:%@",@(type),@(enable),member);
- RoomMember *curMember = [ClassroomService sharedService].currentRoom.currentMember;
- NSString *hudMessage = @"";
-
- if ([curMember.userId isEqualToString:member.userId]) {
- if (type == DeviceTypeCamera) { // 摄像头
- hudMessage = !enable ? @"老师已关闭你的摄像头" : NSLocalizedStringFromTable(@"CameraOpend", @"SealClass", nil);
- [self.tipsView showTipsMessage:hudMessage inView:self.view];
-
- [[ClassroomService sharedService] enableDevice:enable withType:DeviceTypeCamera];
- } else if (type == DeviceTypeMicrophone) { // 麦克风
- hudMessage = !enable ? @"老师已关闭你的麦克风" : NSLocalizedStringFromTable(@"MicorophoneOpend", @"SealClass", nil);
- [self.tipsView showTipsMessage:hudMessage inView:self.view];
- [[ClassroomService sharedService] enableDevice:enable withType:DeviceTypeMicrophone];
- }
- else if (type == DeviceTypeAccompany || type == DeviceTypeMusicScore) {
- if (enable) {
- [self playSongAction];
- }
- else {
- [self playSongEnable:NO];
- }
- }
- }
- }
- //助教请求用户打开设备,助教关闭用户设备没有回调。
- - (void)deviceDidInviteEnable:(DeviceType)type ticket:(NSString *)ticket {
- NSLog(@"deviceDidInviteEnable devicetype:%@ ticket:%@ ",@(type),ticket);
-
- }
- #pragma mark - private method
- - (void)bindDelegates {
- self.titleView.delegate = self;
- [ClassroomService sharedService].classroomDelegate = self;
- TRTC_MANAGER.delegate = self;
- }
- - (void)addSubviews {
- [self.view addSubview:self.containerView];
- [self.view addSubview:self.timeView];
- [self.timeView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.right.mas_equalTo(self.containerView.emptyView.mas_right).offset(-20);
- make.top.mas_equalTo(self.view.mas_top);
- make.height.mas_equalTo(44);
- }];
- [self.view bringSubviewToFront:self.timeView];
- [self.view addSubview:self.titleView];
- [self showDanChatView];
- [self wBoardCtrl];
- [self chatAreaView];
- [self.view addSubview:self.videoListView];
- [self.view bringSubviewToFront:self.titleView];
- }
- - (void)showChatAreaView{
- [self.view addSubview:self.chatAreaView];
- [self.chatAreaView scrollToBottom];
- }
- - (void)hideChatAreaView{
- [UIView animateWithDuration:0.2 animations:^{
- self.titleView.chatBtn.isSelected = NO;
- [self.chatAreaView removeFromSuperview];
- }];
- }
- - (void)showDanChatView {
- // 视频页面添加弹幕
- [self.view addSubview:self.danView];
- [self.view bringSubviewToFront:self.danView];
- self.danView.isShow = YES;
- }
- - (void)hideDanChatView {
- //
- self.danView.isShow = NO;
- [self.danView removeFromSuperview];
- }
- - (CGRect)mainContainerViewFrame {
- CGFloat x = 0;
- CGFloat y = 0;
- CGFloat width = KLandscapeWidth - x;
- CGFloat height = KLandscapeHeight - y;
- return CGRectMake(x, y, width, height);
- }
- - (void)displayWhiteboard:(NSString *)boardId {
- CGRect frame = [self getWBoardFrame];
- [self.wBoardCtrl loadWBoardWithFrame:frame name:boardId];
- for (UIView * view in self.view.subviews) {
- if ([view isKindOfClass:[TXChatAreaView class]]) {
- [self.view bringSubviewToFront:view];
- }
- }
- if (self.videoListHidden) {
- [self.view bringSubviewToFront:self.showButton];
- }
- if (self.danView.isShow) {
- [self.view bringSubviewToFront:self.danView];
- }
- [self.view bringSubviewToFront:self.timeView];
- [self.view bringSubviewToFront:self.titleView];
- }
- - (void)refreshWhiteBoardFrame {
- [self.wBoardCtrl setWBoardFrame:[self getWBoardFrame]];
- }
- - (CGRect)getWBoardFrame {
-
- CGRect mainVideoFrame = CGRectZero;
- CGFloat width = 0;
- CGFloat height = 0;
- if (self.videoListHidden) {
- width = KLandscapeWidth;
- height = KLandscapeHeight;
-
- }
- else {
- width = KLandscapeWidth -(144 + 20 + 10);
- height = KLandscapeHeight;
- }
- mainVideoFrame.size.width = width;
- mainVideoFrame.size.height = height;
- mainVideoFrame.origin.x += 0;
- mainVideoFrame.origin.y = 0;
- return mainVideoFrame;
- }
- - (void)publishStream {
- if ([ClassroomService sharedService].currentRoom.currentMember.role != RoleAudience) {
- [TRTC_MANAGER publishStream];
-
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- // 同步状态
- [self checkNodePlayAndSongPlay];
- });
- }
- }
- - (void)checkNodePlayAndSongPlay {
- RoomMember *currentMember = [ClassroomService sharedService].currentRoom.currentMember;
- if (currentMember.enable) {
- // 延迟播放
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self playNode:currentMember.enable rate:currentMember.rate beatType:currentMember.customType volume:currentMember.volume];
- });
- }
- else {
- if (currentMember.musicScoreAccompanimentId != 0) { // 如果有记录当前播放曲目
- BOOL needPlay = currentMember.accompanimentPlayStatus || currentMember.playStatus;
- if (needPlay) {
- dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
- [self playSongAction];
- });
- }
- }
- }
- }
- - (void)renderMainContainerView {
-
- if ([ClassroomService sharedService].currentRoom.currentDisplayType == DisplayTypeStudent) {
- // 有打开的屏幕
- for (RoomMember *displayMember in [ClassroomService sharedService].currentRoom.memberList) {
- if ([displayMember.userId isEqualToString:[ClassroomService sharedService].currentRoom.currentDisplayURI]) {
- if ([displayMember.userId isEqualToString:[ClassroomService sharedService].currentRoom.currentMember.userId]) {
- }
- [self.wBoardCtrl hideBoard];
- [self.containerView containerViewRenderView:displayMember];
- [self.videoListView showTeacherPrompt:NO];
- break;
- }
- }
-
- }
- else {
-
- if ([ClassroomService sharedService].currentRoom.currentDisplayType == DisplayTeacher) {
- NSLog(@"%@",[ClassroomService sharedService].currentRoom.currentDisplayURI);
- [self.wBoardCtrl hideBoard];
- [self.containerView containerViewRenderView:[ClassroomService sharedService].currentRoom.teacher];
- [self.videoListView showTeacherPrompt:YES];
- } else if ([ClassroomService sharedService].currentRoom.currentDisplayType == DisplayWhiteboard) {
- [self.containerView cancelRenderView];
- [self displayWhiteboard:[ClassroomService sharedService].currentRoom.currentDisplayURI];
- [self.videoListView showTeacherPrompt:NO];
- } else if (([ClassroomService sharedService].currentRoom.currentDisplayType == DisplaySharedScreen)) {
- [self.wBoardCtrl hideBoard];
- [TRTC_MANAGER renderRemoteUser:[ClassroomService sharedService].currentRoom.currentDisplayURI inView:self.containerView.videoView];
- // 分享视频
- [self.videoListView showTeacherPrompt:NO];
- } else {
- [self.wBoardCtrl hideBoard];
- [self.containerView cancelRenderView];
- [self.videoListView showTeacherPrompt:NO];
- }
- }
- }
- - (void)whiteboardDidDisplay:(NSString *)boardId {
- NSLog(@"whiteboardDidDisplay %@ ",boardId);
- [self renderMainContainerView];
- }
- - (void)sharedScreenDidDisplay:(NSString *)userId {
- NSLog(@"sharedScreenDidDisplay %@ ",userId);
- [self renderMainContainerView];
- }
- - (void)studentDidDisplay:(NSString *)studentId {
- NSLog(@"studentDidDisplay %@", studentId);
- [self renderMainContainerView];
-
- }
- - (void)teacherDidDisplay {
- NSLog(@"teacherDidDisplay %@ ",[ClassroomService sharedService].currentRoom.teacher.userId);
- [self renderMainContainerView];
- }
- - (void)noneDidDisplay {
- NSLog(@"noneDidDisplay");
- [self renderMainContainerView];
- }
- // 播放节拍器的回调
- - (void)playNodeAction:(BOOL)enable userId:(NSString *)userId rate:(int)rate beatType:(BeatType)type volume:(NSInteger)volume {
- NSLog(@"playNodeAction userId:%@ enable:%@ beatType:%@ rate:%@ volume:%@",userId,@(enable),@(type), @(rate), @(volume));
- RoomMember *curMember = [ClassroomService sharedService].currentRoom.currentMember;
- if (curMember.role == RoleStudent) {
- if ([NSString isEmptyString:userId]) { // 操作全部
- [self playNode:enable rate:rate beatType:type volume:volume];
- }
- else {
- NSArray *userIdArray = [userId componentsSeparatedByString:@","];
- for (NSString *subUserId in userIdArray) {
- if ([curMember.userId isEqualToString:subUserId]) { // 操作个人
- [self playNode:enable rate:rate beatType:type volume:volume];
- break;
- }
- }
- }
- }
- }
- - (void)playNode:(BOOL)enable rate:(int)rate beatType:(BeatType)type volume:(NSInteger)volume {
- if (enable) {
- if ([ClassroomService sharedService].currentRoom.isPlaySong) { // 停止当前伴奏播放
- [ClassroomService sharedService].currentRoom.isPlaySong = NO;
- }
- [self setMetronomeStat:type];
- [self setRate:rate];
- self.volume = volume;
- [self.videoListView updateBeatNode:type beat:rate];
- [self play];
- [TRTC_MANAGER unPlayRemoteStudentAudioStream];
- }
- else {
- [self.videoListView hideBeatView];
- [self pause];
- [self removeAll];
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- }
- #pragma mark ----- ClassVideoListViewDelegate
- - (void)videoListView:(TXClassroomVideoListView *)view didTap:(RoomMember *)member {
- self.titleView.isDisplay = YES;
- self.timeManager.isDisplay = YES;
- NSString *currentUserID = [ClassroomService sharedService].currentRoom.currentMemberId;
- if ([member.userId isEqualToString:currentUserID]) { // 如果是当前用户
- if (member.cameraEnable) {
- self.maskView.closeCameraView.hidden = YES;
- }
- else {
- self.maskView.closeCameraView.hidden = NO;
- }
- [ClassroomService sharedService].currentRoom.currentMaskUserId = currentUserID;
- [TRTC_MANAGER renderLocalUserInView:self.maskView.maskVideoView isCameraEnable:member.cameraEnable];
- [self.view addSubview:self.maskView];
- self.squareOn = YES;
- }
- }
- - (void)videoListView:(TXClassroomVideoListView *)view didHideView:(BOOL)isHideView {
- if (isHideView) { // 隐藏video list
- [self hideVideoList];
- }
- else { // 显示
- [self showVideoList];
- }
- }
- - (void)hideVideoList {
- self.videoListHidden = YES;
- CGRect frame = self.videoListView.frame;
- self.videoListView.frame = CGRectMake(KLandscapeWidth, frame.origin.y, frame.size.width, frame.size.height);
- [self.containerView changeVideoFrameFull:YES];
- [self refreshWhiteBoardFrame];
- [self.view addSubview:self.showButton];
- }
- - (void)showVideoList {
- self.videoListHidden = NO;
- CGRect frame = self.videoListView.frame;
- self.videoListView.frame = CGRectMake(KLandscapeWidth - frame.size.width, frame.origin.y, frame.size.width, frame.size.height);
- [self.containerView changeVideoFrameFull:NO];
- [self refreshWhiteBoardFrame];
- [self.showButton removeFromSuperview];
- }
- #pragma mark ---- TXRTCServiceDelegate
- - (void)didReportNetworkQuality:(TRTCQuality)quality remoteQuality:(NSArray<TRTCQualityInfo *> *)remoteQuality {
- if (quality >= 5) { // 网络质量不佳
-
- dispatch_async(dispatch_get_main_queue(), ^{
- [self.view addSubview:self.networkLabel];
- [self.view bringSubviewToFront:self.networkLabel];
- self.networkLabel.hidden = NO;
- self.networkLabel.text = @"当前通话连接质量不佳";
- });
- }
- else { // 正常
- dispatch_async(dispatch_get_main_queue(), ^{
- self.networkLabel.hidden = YES;
- self.networkLabel.text = @"";
- [self.networkLabel removeFromSuperview];
- });
- }
- [self showNetworkingStatus:quality remoteQuality:remoteQuality];
- }
- - (void)showNetworkingStatus:(TRTCQuality)quality remoteQuality:(NSArray<TRTCQualityInfo *> *)remoteQuality {
- dispatch_async(dispatch_get_main_queue(), ^{
- // 显示本地
- NSString *currentUserID = [ClassroomService sharedService].currentRoom.currentMemberId;
- if ([ClassroomService sharedService].currentRoom.currentDisplayType == DisplayTypeStudent && [currentUserID isEqualToString:[ClassroomService sharedService].currentRoom.currentDisplayURI]) { // 如果主屏是学生自己
- [self.containerView.displayView updateUserQualityNetWorkingStatus:[self getNetStatusWithQuality:quality]];
- }
- else {
- [self.videoListView updateUserQuality:currentUserID netWorkingStatus:[self getNetStatusWithQuality:quality]];
- }
-
- // 远端
- for (TRTCQualityInfo *info in remoteQuality) {
- NSString *userId = info.userId;
- if ([info.userId isEqualToString:self.containerView.member.userId]) {
- [self.videoListView updateUserQuality:userId netWorkingStatus:[self getNetStatusWithQuality:quality]];
- }
- }
- });
- }
- - (TXNetWorkingStatus)getNetStatusWithQuality:(TRTCQuality)quality {
- TXNetWorkingStatus status = TXNetWorkingStatus_Full;
- if (quality == 1 || quality == 2) {
- status = TXNetWorkingStatus_Full;
- }
- else if (quality == 3) {
- status = TXNetWorkingStatus_Good;
- }
- else if (quality == 4) {
- status = TXNetWorkingStatus_Nomal;
- }
- else if (quality == 5) {
- status = TXNetWorkingStatus_Bad;
- }
- else { //
- status = TXNetWorkingStatus_Poor;
- }
- return status;
- }
- - (void)didReportUserVolume:(NSArray<TRTCVolumeInfo *> *)userVolumes {
- NSString *currentUserID = [ClassroomService sharedService].currentRoom.currentMemberId;
- for (TRTCVolumeInfo *info in userVolumes) {
- NSString *userId = info.userId;
- if ([NSString isEmptyString:userId]) {
- userId = currentUserID;
- }
- [self.videoListView updateMicStatus:userId volume:info.volume];
- // 更新title
- if ([currentUserID isEqualToString:userId]) {
- [self.titleView updateUserVolume:info.volume];
- }
- // 更新container
- if ([self.containerView.member.userId isEqualToString:userId]) {
- [self.containerView updateUserVolume:info.volume];
- }
- }
- }
- #pragma mark - Getters & setters
- - (VideoMaskView *)maskView {
- if (!_maskView) {
- CGFloat width = (KLandscapeWidth);
- CGRect frame = CGRectMake(0, 0, width, KLandscapeHeight);
- _maskView = [[VideoMaskView alloc] initWithFrame:frame];
- [_maskView addDismisTarget:self action:@selector(dismissMaskViewEvent)];
- }
- return _maskView;
- }
- - (void)dismissMaskViewEvent {
- self.squareOn = NO;
- [ClassroomService sharedService].currentRoom.currentMaskUserId = nil;
- // 切换成小流
- [self removeMaskViewIfNeed];
- [self renderMainContainerView];
- [self.videoListView reloadVideoList];
- }
- - (void)removeMaskViewIfNeed {
- [self.maskView removeFromSuperview];
- _maskView = nil;
- }
- - (ClassroomTimerManager *)timeManager {
- if (!_timeManager) {
- _timeManager = [[ClassroomTimerManager alloc] initWithDelegate:self];
- // NSString *userType = UserDefault(UserTypeKey);
- NSString *userType = @"1";
- if ([userType isEqualToString:@"1"]) {
- _timeManager.autoClose = [ClassroomService sharedService].currentRoom.autoCloseFlag;
- }
- else {
- _timeManager.autoClose = YES;
- }
- // 统一15分钟关闭
- _timeManager.autoCloseNetworkRoomTime = [ClassroomService sharedService].currentRoom.autoCloseNetworkRoomTime;
- }
- return _timeManager;
- }
- - (TXTimeView *)timeView {
- if (!_timeView) {
- _timeView = [TXTimeView shareInstance];
- }
- return _timeView;
- }
- - (KSTipsView *)tipsView {
- if (!_tipsView) {
- _tipsView = [[KSTipsView alloc] initWithFrame:CGRectZero];
- }
- return _tipsView;
- }
- - (TXClassTitleView *)titleView {
- if (!_titleView) {
- _titleView = [[TXClassTitleView alloc] initWithFrame:CGRectMake(0, 0, KLandscapeWidth, TitleViewHeight)];
- }
- return _titleView;
- }
- - (TXClassroomVideoListView *)videoListView {
- if(!_videoListView) {
-
- CGFloat width = VIDEO_WIDTH + 20 + 10;
-
- CGFloat height = KLandscapeHeight;
-
- _videoListView = [[TXClassroomVideoListView alloc] initWithFrame:CGRectMake(KLandscapeWidth - width, 0, width, height)];
- _videoListView.delegate = self;
- }
- return _videoListView;
- }
- - (UIButton *)showButton {
- if (!_showButton) {
- _showButton = [UIButton buttonWithType:UIButtonTypeCustom];
- _showButton.frame = CGRectMake(KLandscapeWidth-30, (KLandscapeHeight-30)/2.0, 30, 30);
- [_showButton setImage:[UIImage imageNamed:@"videoList_show"] forState:UIControlStateNormal];
- [_showButton addTarget:self action:@selector(showVideoList) forControlEvents:UIControlEventTouchUpInside];
- }
- return _showButton;
- }
- - (TXClassroomMainContainer *)containerView {
- if (!_containerView) {
- _containerView = [[TXClassroomMainContainer alloc] initWithFrame:[self mainContainerViewFrame]];
- _containerView.delegate = self;
- }
- return _containerView;
- }
- - (TXChatAreaView *)chatAreaView {
- if (!_chatAreaView) {
- _chatAreaView = [[TXChatAreaView alloc] initWithFrame:CGRectMake(KLandscapeWidth - 300,0, 300, KLandscapeHeight) chatGroupId:[ClassroomService sharedService].currentRoom.roomId];
- }
- return _chatAreaView;
- }
- - (KSWhiteboardControl *)wBoardCtrl {
- if (!_wBoardCtrl) {
- CGRect frame = [self getWBoardFrame];
- _wBoardCtrl = [[KSWhiteboardControl alloc] initWithDelegate:self viewFrame:frame];
- NSString *roomId = [ClassroomService sharedService].currentRoom.roomId;
- _wBoardCtrl.randomNumeric = [ClassroomService sharedService].currentRoom.randomNumeric;
-
- if ([roomId containsString:@"S"] || [roomId containsString:@"I"]) {
- roomId = [roomId substringFromIndex:1];
- }
- _wBoardCtrl.roomId = roomId;
- [_wBoardCtrl moveToSuperView:self.view];
- }
- return _wBoardCtrl;
- }
- - (void)dealloc {
- NSLog(@"--------");
- [[NSNotificationCenter defaultCenter] removeObserver:self];
- if (_timer) {
- [_timer invalidate];
- _timer = nil;
- }
- }
- - (void)stopBeatMix {
- TXAudioEffectManager *audioManager = [TRTCCloud sharedInstance].getAudioEffectManager;
- [audioManager stopPlayMusic:100];
- [audioManager stopPlayMusic:101];
- }
- - (void)preloadNodeMusic {
- TXAudioEffectManager *audioManager = [TRTCCloud sharedInstance].getAudioEffectManager;
- [audioManager preloadMusic:[self getTickAudioParms] onProgress:^(NSInteger progress) {
-
- } onError:^(NSInteger errorCode) {
-
- }];
-
- [audioManager preloadMusic:[self getTockAudioParms] onProgress:^(NSInteger progress) {
-
- } onError:^(NSInteger errorCode) {
-
- }];
- }
- - (TXAudioMusicParam *)getTickAudioParms {
- TXAudioMusicParam *parms = [[TXAudioMusicParam alloc] init];
- parms.ID = 100;
- parms.isShortFile = YES;
- parms.publish = YES;
- parms.loopCount = 0;
- parms.path = self.pathDing;
- return parms;
- }
- - (TXAudioMusicParam *)getTockAudioParms {
- TXAudioMusicParam *parms = [[TXAudioMusicParam alloc] init];
- parms.ID = 101;
- parms.isShortFile = YES;
- parms.publish = YES;
- parms.loopCount = 0;
- parms.path = self.pathDong;
- return parms;
- }
- - (void)setMetronomeStat:(TXKSMetronomeType)metronomeStat {
-
- _metronomeStat = metronomeStat;
-
- self.currentTotalNo = 0;
-
- if (_timer && _isPlay) {
-
- [self resetTimer];
- }
- }
- - (void)setRate:(int)rate{
-
- _rate = rate;
-
- CGFloat rateFloat = rate;
-
- self.timerLength = 1 /(rateFloat /60);
-
- if (self.lastRate == 0) {
-
- self.lastRate = _rate;
- }
-
- // 超过10间隔再重置定时器,设置最新间隔秒数
- if (abs(self.lastRate -_rate) >= 10 && _isPlay) {
-
- self.lastRate = _rate;
-
- [self resetTimer];
- }
-
- if (abs(self.lastRate -_rate) >= 10 && !_isPlay) {
-
- if (_timer) {
- [_timer invalidate];
- _timer = nil;
- }
- }
- }
- - (void)play{
-
- _isPlay = YES;
- [ClassroomService sharedService].currentRoom.isPlayBeat = YES;
- [self.timer setFireDate:[NSDate distantPast]];
- }
- - (void)pause{
- [self.timer setFireDate:[NSDate distantFuture]];//暂停计时器
- _isPlay = NO;
- [ClassroomService sharedService].currentRoom.isPlayBeat = NO;
- }
- - (NSTimer *)timer{
-
- if (!_timer) {
-
- _timer = [NSTimer scheduledTimerWithTimeInterval:self.timerLength target:self selector:@selector(timerAction) userInfo:nil repeats:YES];
- [[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSRunLoopCommonModes];
- }
- return _timer;
- }
- - (void)timerAction {
-
- if (_metronomeStat ==TXKSMetronomeType1V4) {
- [self playAction:YES];
- }
- else {
- if (_metronomeStat == TXKSMetronomeType2V4 && self.currentTotalNo %2 == 0) {
- [self playAction:YES];
- }else if (_metronomeStat == TXKSMetronomeType3V4 && self.currentTotalNo %3 == 0){
- [self playAction:YES];
- }else if (_metronomeStat == TXKSMetronomeType4V4 && self.currentTotalNo %4 == 0){
- [self playAction:YES];
- }else if (_metronomeStat == TXKSMetronomeType6V8 && self.currentTotalNo %6 == 0){
- [self playAction:YES];
- }else{
- [self playAction:NO];
- }
- }
- [self.videoListView showBeatNode:self.currentTotalNo];
- self.currentTotalNo ++;
- }
- - (void)playAction:(BOOL)isDing {
- dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
- [self stopBeatMix];
- @try {
- [self startMixBeat:isDing];
- } @catch (NSException *exception) {
- NSLog(@"%@", exception);
- } @finally {
- }
- });
- }
- - (void)startMixBeat:(BOOL)isDing {
- TXAudioEffectManager *audioManager = [TRTCCloud sharedInstance].getAudioEffectManager;
- TXAudioMusicParam *parms = isDing ? [self getTickAudioParms] : [self getTockAudioParms];
- [audioManager startPlayMusic:parms onStart:^(NSInteger errCode) {
- [audioManager setAllMusicVolume:self.volume];
- } onProgress:^(NSInteger progressMs, NSInteger durationMs) {
- } onComplete:^(NSInteger errCode) {
- }];
- }
- - (NSString *)pathDing {
- if (!_pathDing) {
- _pathDing = [[NSBundle mainBundle] pathForResource:@"tick" ofType:@"wav"];
- }
- return _pathDing;
- }
- - (NSString *)pathDong {
- if (!_pathDong) {
- _pathDong = [[NSBundle mainBundle] pathForResource:@"tock" ofType:@"wav"];
- }
- return _pathDong;
- }
- #pragma mark -- 重置定时器
- - (void)resetTimer {
-
- [_timer invalidate];
- _timer = nil;
- [self.timer setFireDate:[NSDate distantPast]];
- }
- - (void)removeAll {
-
- if (_timer) {
- [_timer invalidate];
- _timer = nil;
- }
- }
- #pragma mark --- KSWhiteboardControlDelegate
- - (void)didTurnPage:(NSInteger)pageNum {
-
- }
- - (void)whiteboardViewDidChangeZoomScale:(float)scale {
-
- }
- // 白板连接状态回调
- - (void)connectionWhiteboardStatus:(JOINROOMSTATUS)status {
- if (status == JOINROOMSTATUS_FAILED) {
- [self.tipsView showTipsMessage:@"白板连接失败,请检查您的网络" inView:self.view];
- }
- else if (status == JOINROOMSTATUS_PARAMERROR) {
- [self.tipsView showTipsMessage:@"获取白板参数错误" inView:self.view];
- }
- }
- #pragma mark -- mainContainer
- - (void)mainContainerOpertionMember:(RoomMember *)member tapButton:(UIButton *)button {
- // 🙋操作
- MainToolButton *toolButton = self.containerView.toolView.shareButton;
- if (toolButton.isSelected) { // 取消举手
- self.alertView = [TXClassRoomAlertView shareInstance];
- [self.alertView configWithTitle:@"提示?" desc:@"确认取消举手吗?" leftTitle:@"取消" rightTitle:@"确认" cancel:^{
-
- } confirm:^{
- [[ClassroomService sharedService] enableDevice:NO withType:DeviceTypeHandup];
-
- }];
- }
- else {
-
- self.alertView = [TXClassRoomAlertView shareInstance];
- MJWeakSelf;
- [self.alertView configWithTitle:@"确认要举手吗?" desc:@"举手后,有机会被老师选中上台演示哦!" leftTitle:@"取消" rightTitle:@"确认" cancel:^{
-
- } confirm:^{
- [weakSelf.tipsView showTipsMessage:@"您已成功举手" inView:weakSelf.view];
- [[ClassroomService sharedService] enableDevice:YES withType:DeviceTypeHandup];
- }];
- }
- }
- #pragma mark ------ 创建MBProgress
- - (MBProgressHUD *)createProgressHUD {
- [MBProgressHUD hideHUD];
- MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
- hud.mode = MBProgressHUDModeIndeterminate;
- hud.contentColor = [UIColor whiteColor];
- hud.bezelView.style = MBProgressHUDBackgroundStyleSolidColor;
- hud.bezelView.backgroundColor = [UIColor colorWithHexString:@"#000000" alpha:0.8];
- [hud hideAnimated:YES afterDelay:60.0f]; // 自动关闭时间60s
- return hud;
- }
- #pragma mark ----- 混音功能
- - (void)playSongAction {
- // 获取路径 播放伴奏
- RoomMember *member = [ClassroomService sharedService].currentRoom.currentMember;
- NSString *musicUrl = nil;
- if (member.accompanimentPlayStatus) {
- musicUrl = member.mp3Url;
- }
- else if (member.playStatus) {
- musicUrl = member.url;
- }
- if (![NSString isEmptyString:musicUrl]) {
- [self playSongEnable:YES];
- [self mixWithUrl:musicUrl];
- }
- }
- - (void)playSongEnable:(BOOL)enable {
- if (enable) {
- if ([ClassroomService sharedService].currentRoom.isPlayBeat) {
- [self pause];
- [self removeAll];
- }
- [ClassroomService sharedService].currentRoom.isPlaySong = YES;
- [TRTC_MANAGER unPlayRemoteStudentAudioStream];
- }
- else {
- [self stopMixUrl];
- [ClassroomService sharedService].currentRoom.isPlaySong = NO;
- [TRTC_MANAGER playAllRemoteStudentAudioStream];
- }
- }
- - (void)mixWithUrl:(NSString *)remoteUrl {
- NSInteger soundVolome = [ClassroomService sharedService].currentRoom.soundVolume;
- TXAudioEffectManager *audioManager = [TRTCCloud sharedInstance].getAudioEffectManager;
- TXAudioMusicParam *parms = [[TXAudioMusicParam alloc] init];
- parms.ID = 10;
- parms.isShortFile = NO;
- parms.publish = YES;
- parms.loopCount = 100;
- parms.path = [remoteUrl getUrlEndcodeString];
-
- [audioManager startPlayMusic:parms onStart:^(NSInteger errCode) {
- [audioManager setAllMusicVolume:soundVolome];
- } onProgress:^(NSInteger progressMs, NSInteger durationMs) {
-
- } onComplete:^(NSInteger errCode) {
-
- }];
- }
- - (void)stopMixUrl {
- TXAudioEffectManager *audioManager = [TRTCCloud sharedInstance].getAudioEffectManager;
- [audioManager pausePlayMusic:10];
- }
- #pragma mark ----- 首页弹幕聊天
- - (TXDanMuView *)danView {
- if (!_danView) {
- _danView = [[TXDanMuView alloc] initWithFrame:CGRectMake(38, KLandscapeHeight - 160 - 20, 260, 160) chatGroupId:[ClassroomService sharedService].currentRoom.roomId];
- }
- return _danView;
- }
- - (void)getRoomGroupConfig {
- [self addGroupNotifer];
- [self getClassroomConfig];
- }
- - (void)addGroupNotifer {
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveGroupMessage:) name:OnReceiveTXClassroomGroupNotification object:nil];
- }
- - (void)getClassroomConfig {
- NSString *roomId = [ClassroomService sharedService].currentRoom.roomId;
- [[V2TIMManager sharedInstance] getGroupAttributes:roomId keys:nil succ:^(NSMutableDictionary<NSString *,NSString *> *groupAttributeList) {
- [self evaluateGroupInfo:groupAttributeList];
- } fail:^(int code, NSString *desc) {
- NSLog(@"");
- }];
- }
- #pragma mark ------ 群属性
- - (void)didReceiveGroupMessage:(NSNotification *)notification {
-
- NSDictionary *dic = notification.object; /// __block TXLiveMessageModel *liveMessage
-
- NSString *groupId = [dic ks_stringValueForKey:@"groupID"];
- NSDictionary *content = [dic ks_dictionaryValueForKey:@"message"];
- NSString *roomId = [ClassroomService sharedService].currentRoom.roomId;
- if ([groupId isEqualToString:roomId]) {
- [self evaluateGroupInfo:content];
- }
- }
- - (void)evaluateGroupInfo:(NSDictionary *)groupInfo {
-
- if ([[groupInfo allKeys] containsObject:@"cancelMuteFlag"]) {
- self.cancelMuteFlag = [groupInfo ks_boolValueForKey:@"cancelMuteFlag"];
- }
- else {
- self.cancelMuteFlag = YES;
- }
-
- if ([[groupInfo allKeys] containsObject:@"isMuteAll"]) {
- self.isMuteAll = [groupInfo ks_boolValueForKey:@"isMuteAll"];
- }
- else {
- self.isMuteAll = NO;
- }
- }
- /*
- #pragma mark - Navigation
- // In a storyboard-based application, you will often want to do a little preparation before navigation
- - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
- // Get the new view controller using [segue destinationViewController].
- // Pass the selected object to the new view controller.
- }
- */
- @end
|