李勇

1.增加聊天模块支持图片消息;2.增加踢人接口;3.修改CDN地址和m3u8地址拼接规则

@@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe'; @@ -35,7 +35,7 @@ import QuestionApe from 'apes/QuestionApe';
35 import UTF8 from 'utf-8'; 35 import UTF8 from 'utf-8';
36 36
37 let loger = Loger.getLoger('McuClient'); 37 let loger = Loger.getLoger('McuClient');
38 -let _sdkInfo = { "version": "v1.48.2.20170723", "author": "www.3mang.com" }; 38 +let _sdkInfo = { "version": "v1.49.1.20170724", "author": "www.3mang.com" };
39 39
40 //APE 40 //APE
41 let _sass; 41 let _sass;
@@ -164,7 +164,9 @@ export default class MessageEntrance extends Emiter { @@ -164,7 +164,9 @@ export default class MessageEntrance extends Emiter {
164 this.controlHandUpStatus = this._controlHandUpStatus.bind(this); //控制别人的举手状态 164 this.controlHandUpStatus = this._controlHandUpStatus.bind(this); //控制别人的举手状态
165 this.controlSilenceStatus = this._controlSilenceStatus.bind(this); //改变禁言状态 165 this.controlSilenceStatus = this._controlSilenceStatus.bind(this); //改变禁言状态
166 166
167 - this.sceneTableChange = this._sceneTableChange.bind(this); //控制别人的举手状态 167 + this.sceneTableChange = this._sceneTableChange.bind(this); //切换模块显示
  168 +
  169 + this.kickOutRosterFormNodeId= this._kickOutRosterFormNodeId.bind(this); //把指定nodeId的人踢出课堂
168 170
169 //录制回放 171 //录制回放
170 this.initRecordPlayback = this._initRecordPlayback.bind(this); 172 this.initRecordPlayback = this._initRecordPlayback.bind(this);
@@ -433,7 +435,8 @@ export default class MessageEntrance extends Emiter { @@ -433,7 +435,8 @@ export default class MessageEntrance extends Emiter {
433 GlobalConfig.portal = _param.portal; 435 GlobalConfig.portal = _param.portal;
434 GlobalConfig.isH5=_param.isH5||false;//外部传入的参数,是否是H5 436 GlobalConfig.isH5=_param.isH5||false;//外部传入的参数,是否是H5
435 if(GlobalConfig.isH5==true){ 437 if(GlobalConfig.isH5==true){
436 - GlobalConfig.platform = 3;//3是H5 438 + GlobalConfig.platform = "H5";
  439 + GlobalConfig.deviceType=3//3是H5
437 loger.warn("设备类型是H5"); 440 loger.warn("设备类型是H5");
438 } 441 }
439 //GlobalConfig.userId = _param.userId || "0"; 442 //GlobalConfig.userId = _param.userId || "0";
@@ -1054,6 +1057,17 @@ export default class MessageEntrance extends Emiter { @@ -1054,6 +1057,17 @@ export default class MessageEntrance extends Emiter {
1054 } 1057 }
1055 } 1058 }
1056 1059
  1060 + //将指定nodeId的人踢出课堂
  1061 + _kickOutRosterFormNodeId(_param){
  1062 + if (!_mcu.connected) {
  1063 + loger.warn(GlobalConfig.getCurrentStatus());
  1064 + return { "code": ApeConsts.RETURN_FAILED, "data": "" };
  1065 + }
  1066 + if (_confer_ape) {
  1067 + _confer_ape.kickOutRosterFormNodeId(_param);
  1068 + }
  1069 + }
  1070 +
1057 // 禁言控制 1071 // 禁言控制
1058 _controlSilenceStatus(_param) { 1072 _controlSilenceStatus(_param) {
1059 if (!_mcu.connected) { 1073 if (!_mcu.connected) {
@@ -1244,7 +1258,8 @@ export default class MessageEntrance extends Emiter { @@ -1244,7 +1258,8 @@ export default class MessageEntrance extends Emiter {
1244 GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口 1258 GlobalConfig.MS_PLAY_HLS_IP = ipItem; //ip包含了端口
1245 GlobalConfig.MS_PLAY_HLS_PORT = ""; 1259 GlobalConfig.MS_PLAY_HLS_PORT = "";
1246 loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP); 1260 loger.log('videoCDNAddr>初始->MSHls', GlobalConfig.MS_PLAY_HLS_IP);
1247 - } else if (ipItem.indexOf('rtmppull') >= 0) { 1261 + }
  1262 + if (ipItem.indexOf('rtmppull')>= 0) {
1248 //直播的时候rtmp拉流地址 1263 //直播的时候rtmp拉流地址
1249 GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口 1264 GlobalConfig.MS_PLAY_RTMP_IP = ipItem; //ip包含了端口
1250 GlobalConfig.MS_PLAY_RTMP_PORT = ''; 1265 GlobalConfig.MS_PLAY_RTMP_PORT = '';
@@ -1838,12 +1853,12 @@ export default class MessageEntrance extends Emiter { @@ -1838,12 +1853,12 @@ export default class MessageEntrance extends Emiter {
1838 1853
1839 //音乐共享模块加入频道成功,同步到MCU服务器上的数据 1854 //音乐共享模块加入频道成功,同步到MCU服务器上的数据
1840 musicShareApeJoinChannelSuccess() { 1855 musicShareApeJoinChannelSuccess() {
1841 - loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMusicList.length);  
1842 - console.log("伴音MUSIC模块共享模数据->", GlobalConfig.sharedMusicList); 1856 + loger.log("伴音MUSIC模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.musicListPrepare.length);
  1857 + console.log("伴音MUSIC模块共享模数据->", GlobalConfig.musicListPrepare);
1843 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传 1858 //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
1844 - if (GlobalConfig.isHost && GlobalConfig.sharedMusicList.length > 0) {  
1845 - for (let i = 0; i < GlobalConfig.sharedMusicList.length; i++) {  
1846 - let value = GlobalConfig.sharedMusicList[i]; 1859 + if (GlobalConfig.isHost && GlobalConfig.musicListPrepare.length > 0) {
  1860 + for (let i = 0; i < GlobalConfig.musicListPrepare.length; i++) {
  1861 + let value = GlobalConfig.musicListPrepare[i];
1847 if (value) { 1862 if (value) {
1848 let paramInfo = { 1863 let paramInfo = {
1849 "status": 0, 1864 "status": 0,
@@ -24,6 +24,7 @@ ApeConsts.CLASS_PAUSING = "class.update"; //更新当前的状态信息 @@ -24,6 +24,7 @@ ApeConsts.CLASS_PAUSING = "class.update"; //更新当前的状态信息
24 ApeConsts.CLASS_ACTION_CLOSE_ALL = 1; //所有人关闭课堂 24 ApeConsts.CLASS_ACTION_CLOSE_ALL = 1; //所有人关闭课堂
25 ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE = 2; //更改用户的举手状态 25 ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE = 2; //更改用户的举手状态
26 ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态 26 ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE = 3; //更改用户的禁言状态
  27 +ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER=4; //指定的人踢出课堂
27 28
28 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流) 29 //课堂类型 1:1v1(2路流) 2:直播(1路流) 3:小班课(可以多路流)
29 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流) 30 ApeConsts.CLASS_TYPE_1 = 1; // 互动课堂,通过MS转发音视频,不能进行H5观看 1v1(2路流)
@@ -58,6 +58,7 @@ class ChatApe extends Ape { @@ -58,6 +58,7 @@ class ChatApe extends Ape {
58 chatSendPdu.initiator = this._classInfo.nodeId;//发起人 58 chatSendPdu.initiator = this._classInfo.nodeId;//发起人
59 chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id 59 chatSendPdu.peer = parseInt(_messageInfo.to);//发送给谁,公聊的时候是0,私聊的时候是指定的用户id
60 60
  61 + chatSendPdu.msgType=parseInt(_messageInfo.msgType)||0;
61 chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message); 62 chatSendPdu.userData = this._rCArrayBufferUtil.strToUint8Array("h5" + _messageInfo.message);
62 chatSendPdu.fromName = this._rCArrayBufferUtil.strToUint8Array("h5" + this._classInfo.userName); 63 chatSendPdu.fromName = this._rCArrayBufferUtil.strToUint8Array("h5" + this._classInfo.userName);
63 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃 64 chatSendPdu.fromRole = this._classInfo.userRole;// classRole已经废弃
@@ -56,42 +56,43 @@ class ConferApe extends Ape { @@ -56,42 +56,43 @@ class ConferApe extends Ape {
56 56
57 //加入课堂 57 //加入课堂
58 _joinSessionHandler(_data) { 58 _joinSessionHandler(_data) {
59 - //let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;  
60 - let nodeInfoRecordPdu = this.getNodeInfo(); 59 + //let nodeInfoRecordPdu = this.mcu.mcuClassInfo.self;
  60 + let nodeInfoRecordPdu = this.getNodeInfo();
61 61
62 - let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];  
63 - userDataPdu.qq = '';  
64 - userDataPdu.skype = ''; 62 + let userDataPdu = new pdu['RCNodeInfoUserDataPdu'];
  63 + userDataPdu.qq = '';
  64 + userDataPdu.skype = '';
65 65
66 - nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();  
67 - nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型 66 + nodeInfoRecordPdu.userData = userDataPdu.toArrayBuffer();
  67 + nodeInfoRecordPdu.deviceType = GlobalConfig.deviceType; //设备类型
68 68
69 - loger.log('开始加入->', nodeInfoRecordPdu); 69 + loger.log('开始加入->', nodeInfoRecordPdu);
70 70
71 - let item = new pdu['RCRegistryRosterItemPdu'];  
72 - item.nodeId = nodeInfoRecordPdu.nodeId;  
73 - item.nodeData = nodeInfoRecordPdu.toArrayBuffer(); 71 + let item = new pdu['RCRegistryRosterItemPdu'];
  72 + item.nodeId = nodeInfoRecordPdu.nodeId;
  73 + item.nodeData = nodeInfoRecordPdu.toArrayBuffer();
74 74
75 - let rosterUpdateItem = new pdu['RCRegistryRosterUpdateItemPdu'];  
76 - rosterUpdateItem.type = pdu.RCPDU_REG_ROSTER_UPDATE_PDU;  
77 - rosterUpdateItem.items.push(item); 75 + let rosterUpdateItem = new pdu['RCRegistryRosterUpdateItemPdu'];
  76 + rosterUpdateItem.type = pdu.RCPDU_REG_ROSTER_UPDATE_PDU;
  77 + rosterUpdateItem.items.push(item);
78 78
79 - let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];  
80 - updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_ROSTER_ID;  
81 - updateObjPdu.subType = rosterUpdateItem.type;  
82 - updateObjPdu.userData = rosterUpdateItem.toArrayBuffer(); 79 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  80 + updateObjPdu.objId = ApeConsts.CONFERENCE_OBJ_ROSTER_ID;
  81 + updateObjPdu.subType = rosterUpdateItem.type;
  82 + updateObjPdu.userData = rosterUpdateItem.toArrayBuffer();
83 83
84 - //同步  
85 - let adapterItemPdu = new pdu['RCAdapterItemPdu'];  
86 - adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;  
87 - adapterItemPdu.itemData = updateObjPdu.toArrayBuffer(); 84 + //同步
  85 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  86 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  87 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
88 88
89 - let adapterPdu = new pdu['RCAdapterPdu'];  
90 - adapterPdu.type = pdu.RCPDU_REG_ADAPTER;  
91 - adapterPdu.item.push(adapterItemPdu);  
92 - this.sendUniform(adapterPdu, true);  
93 - }  
94 - //获取角色信息 89 + let adapterPdu = new pdu['RCAdapterPdu'];
  90 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  91 + adapterPdu.item.push(adapterItemPdu);
  92 + this.sendUniform(adapterPdu, true);
  93 + }
  94 +
  95 + //获取角色信息
95 getNodeInfo() { 96 getNodeInfo() {
96 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu']; 97 let nodeInfoRecordPdu = new pdu['RCNodeInfoRecordPdu'];
97 nodeInfoRecordPdu.nodeId = GlobalConfig.nodeId; 98 nodeInfoRecordPdu.nodeId = GlobalConfig.nodeId;
@@ -225,7 +226,7 @@ class ConferApe extends Ape { @@ -225,7 +226,7 @@ class ConferApe extends Ape {
225 sendConferRecordMsg(_param) { 226 sendConferRecordMsg(_param) {
226 if (!this.mcu.connected) { 227 if (!this.mcu.connected) {
227 loger.warn(GlobalConfig.getCurrentStatus()); 228 loger.warn(GlobalConfig.getCurrentStatus());
228 - return { "code": ApeConsts.RETURN_FAILED, "data": "已经断开连接" }; 229 + return {"code": ApeConsts.RETURN_FAILED, "data": "已经断开连接"};
229 } 230 }
230 if (_param == null) { 231 if (_param == null) {
231 loger.warn("控制录制状的消息发送失败,参数错误", _param); 232 loger.warn("控制录制状的消息发送失败,参数错误", _param);
@@ -269,7 +270,7 @@ class ConferApe extends Ape { @@ -269,7 +270,7 @@ class ConferApe extends Ape {
269 //如果是host 270 //如果是host
270 if (GlobalConfig.isHost) { 271 if (GlobalConfig.isHost) {
271 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 272 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
272 - this.sendConferRecordMsg({ "recordStatus": true }); 273 + this.sendConferRecordMsg({"recordStatus": true});
273 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 274 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
274 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制 275 this._emit(MessageTypes.CLASS_RECORD_START); //课堂开始录制
275 } 276 }
@@ -282,14 +283,14 @@ class ConferApe extends Ape { @@ -282,14 +283,14 @@ class ConferApe extends Ape {
282 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作) 283 //强制停止,可以是host之外的身份(比如当前课堂老师异常退出,没有老师,会随机选择一个人来做释放操作)
283 if (GlobalConfig.recordStatus) { 284 if (GlobalConfig.recordStatus) {
284 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 285 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
285 - this.sendConferRecordMsg({ "recordStatus": false }); 286 + this.sendConferRecordMsg({"recordStatus": false});
286 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 287 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
287 } 288 }
288 } else { 289 } else {
289 //身份是host,并且当前正在录制中 290 //身份是host,并且当前正在录制中
290 if (GlobalConfig.isHost && GlobalConfig.recordStatus) { 291 if (GlobalConfig.isHost && GlobalConfig.recordStatus) {
291 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 292 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
292 - this.sendConferRecordMsg({ "recordStatus": false }); 293 + this.sendConferRecordMsg({"recordStatus": false});
293 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 294 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
294 } 295 }
295 } 296 }
@@ -336,7 +337,7 @@ class ConferApe extends Ape { @@ -336,7 +337,7 @@ class ConferApe extends Ape {
336 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr(); 337 GlobalConfig.classStopTime = EngineUtils.creatTimestampStr();
337 this.stopRecord(); 338 this.stopRecord();
338 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 339 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
339 - this.sendUpdaterClassStatusInfo({ "actionType": 0, isStopAllPublishMedia: true }); 340 + this.sendUpdaterClassStatusInfo({"actionType": 0, isStopAllPublishMedia: true});
340 loger.log('restorClass'); 341 loger.log('restorClass');
341 } 342 }
342 343
@@ -378,7 +379,7 @@ class ConferApe extends Ape { @@ -378,7 +379,7 @@ class ConferApe extends Ape {
378 //课堂状态改变 379 //课堂状态改变
379 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 380 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
380 //同步课堂状态 381 //同步课堂状态
381 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: true }); 382 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: true});
382 383
383 //开始计时 384 //开始计时
384 this.startTimerCounter(); 385 this.startTimerCounter();
@@ -398,23 +399,24 @@ class ConferApe extends Ape { @@ -398,23 +399,24 @@ class ConferApe extends Ape {
398 399
399 this.stopRecord(); 400 this.stopRecord();
400 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param); 401 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE, _param);
401 - this.sendUpdaterClassStatusInfo({ "actionType": 2, isStopAllPublishMedia: true }); 402 + this.sendUpdaterClassStatusInfo({"actionType": 2, isStopAllPublishMedia: true});
402 this.stopTimerCounter(); 403 this.stopTimerCounter();
403 } 404 }
404 405
405 //关闭课堂 406 //关闭课堂
406 closeClass(_param) { 407 closeClass(_param) {
407 - if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) {  
408 - loger.warn('还没有开始,不能点关闭');  
409 - return;  
410 - }  
411 -  
412 - this.stopTimerCounter();  
413 - this.restorClass();  
414 - //把所有人都踢出课堂  
415 - this.sendConferMsg({ "to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL }); 408 + if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT) {
  409 + loger.warn('还没有开始,不能点关闭');
  410 + return;
416 } 411 }
417 - //更新设备信息 412 +
  413 + this.stopTimerCounter();
  414 + this.restorClass();
  415 + //把所有人都踢出课堂
  416 + this.sendConferMsg({"to": 0, "message": "所有人退出课堂", "actionType": ApeConsts.CLASS_ACTION_CLOSE_ALL});
  417 + }
  418 +
  419 + //更新设备信息
418 updateDeviceInfo(_param) { 420 updateDeviceInfo(_param) {
419 loger.log('更新用户的设备信息->', _param); 421 loger.log('更新用户的设备信息->', _param);
420 this.updateUserInfo(); 422 this.updateUserInfo();
@@ -434,7 +436,7 @@ class ConferApe extends Ape { @@ -434,7 +436,7 @@ class ConferApe extends Ape {
434 GlobalConfig.silenceUsers[_param.userId || _param.nodeId] = _param; 436 GlobalConfig.silenceUsers[_param.userId || _param.nodeId] = _param;
435 } 437 }
436 438
437 - this.sendUpdaterClassStatusInfo({ silenceUsers: GlobalConfig.silenceUsers }); 439 + this.sendUpdaterClassStatusInfo({silenceUsers: GlobalConfig.silenceUsers});
438 } 440 }
439 441
440 changeSilenceStatus(_param) { 442 changeSilenceStatus(_param) {
@@ -443,6 +445,24 @@ class ConferApe extends Ape { @@ -443,6 +445,24 @@ class ConferApe extends Ape {
443 this.updateUserInfo(); 445 this.updateUserInfo();
444 } 446 }
445 447
  448 + //将指定nodeId的人踢出课堂
  449 + kickOutRosterFormNodeId(_param) {
  450 + if(GlobalConfig.isNormal){
  451 + loger.warn("普通身份没有踢人的权限");
  452 + return;
  453 + }
  454 + if (_param && _param.nodeId) {
  455 + this.sendConferMsg({
  456 + "to": parseInt(_param.nodeId),
  457 + "message": "" + _param.nodeId + "踢出课堂",
  458 + "actionType": ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER
  459 + });
  460 + } else {
  461 + loger.warn("踢人失败-参数无效")
  462 + console.log(_param);
  463 + }
  464 + }
  465 +
446 //控制举手状态 466 //控制举手状态
447 controlHandUpStatus(_param) { 467 controlHandUpStatus(_param) {
448 //控制用户的举手状态 468 //控制用户的举手状态
@@ -456,21 +476,26 @@ class ConferApe extends Ape { @@ -456,21 +476,26 @@ class ConferApe extends Ape {
456 if (_param && _param.isHandUp == true) { 476 if (_param && _param.isHandUp == true) {
457 msgObj.isHandUp = true; 477 msgObj.isHandUp = true;
458 } 478 }
459 - this.sendConferMsg({ "to": _param.nodeId, "message": JSON.stringify(msgObj), "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE }); 479 + this.sendConferMsg({
  480 + "to": _param.nodeId,
  481 + "message": JSON.stringify(msgObj),
  482 + "actionType": ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE
  483 + });
460 } 484 }
461 485
462 //切换举手状态 486 //切换举手状态
463 changeHandUpStatus(_param) { 487 changeHandUpStatus(_param) {
464 - loger.log('切换举手状态->', _param);  
465 - if (_param && _param.isHandUp == true) {  
466 - //举手  
467 - GlobalConfig.handUpTime = EngineUtils.creatTimestamp();  
468 - } else {  
469 - GlobalConfig.handUpTime = 0; //默认0是没有举手的状态(大于0就是举手)  
470 - }  
471 - this.updateUserInfo(); 488 + loger.log('切换举手状态->', _param);
  489 + if (_param && _param.isHandUp == true) {
  490 + //举手
  491 + GlobalConfig.handUpTime = EngineUtils.creatTimestamp();
  492 + } else {
  493 + GlobalConfig.handUpTime = 0; //默认0是没有举手的状态(大于0就是举手)
472 } 494 }
473 - //课堂的场景模块发送改变 495 + this.updateUserInfo();
  496 + }
  497 +
  498 + //课堂的场景模块发送改变
474 sceneTableChange(_param) { 499 sceneTableChange(_param) {
475 if (GlobalConfig.isRecordPlayBack) { 500 if (GlobalConfig.isRecordPlayBack) {
476 return; 501 return;
@@ -483,7 +508,7 @@ class ConferApe extends Ape { @@ -483,7 +508,7 @@ class ConferApe extends Ape {
483 //保存数据到Sass 508 //保存数据到Sass
484 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 509 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
485 //同步消息给其他人 510 //同步消息给其他人
486 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false }); 511 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: false});
487 } 512 }
488 } 513 }
489 514
@@ -550,8 +575,7 @@ class ConferApe extends Ape { @@ -550,8 +575,7 @@ class ConferApe extends Ape {
550 //如果是host ,开始录制 575 //如果是host ,开始录制
551 this.startRecord(); 576 this.startRecord();
552 } else if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT && 577 } else if (GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_WAIT &&
553 - GlobalConfig.isHost && GlobalConfig.isAutoStartClass &&  
554 - !GlobalConfig.isRecordPlayBack) { 578 + GlobalConfig.isHost && GlobalConfig.isAutoStartClass && !GlobalConfig.isRecordPlayBack) {
555 //自动开始上课的4个条件 579 //自动开始上课的4个条件
556 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课 580 //1.如果自己是host,2.Sass配置的是自动开始上课,3.并且当前是未开始状态,4.当前不是录制回放,开始自动上课
557 loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:", GlobalConfig.isHost, " isAutoStartClass:", GlobalConfig.isAutoStartClass, " isRecordPlayBack:", GlobalConfig.isRecordPlayBack); 581 loger.log('自动开始上课->classStatus:', GlobalConfig.classStatus, " isHost:", GlobalConfig.isHost, " isAutoStartClass:", GlobalConfig.isAutoStartClass, " isRecordPlayBack:", GlobalConfig.isRecordPlayBack);
@@ -593,7 +617,7 @@ class ConferApe extends Ape { @@ -593,7 +617,7 @@ class ConferApe extends Ape {
593 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1; 617 GlobalConfig.recordTimestamp = GlobalConfig.recordTimestamp + 1;
594 } 618 }
595 //loger.log('课堂进行时间',GlobalConfig.classTimestamp); 619 //loger.log('课堂进行时间',GlobalConfig.classTimestamp);
596 - this._emit(MessageTypes.CLASS_UPDATE_TIMER, { "classTimestamp": GlobalConfig.classTimestamp }); 620 + this._emit(MessageTypes.CLASS_UPDATE_TIMER, {"classTimestamp": GlobalConfig.classTimestamp});
597 621
598 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) { 622 if (GlobalConfig.classTimestamp % GlobalConfig.updateClassInfoDelay == 0) {
599 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器 623 //如果是host身份,需要同步时间给其他人,同时把当前的状态上传到服务器
@@ -602,7 +626,7 @@ class ConferApe extends Ape { @@ -602,7 +626,7 @@ class ConferApe extends Ape {
602 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE); 626 this._emit(MessageTypes.CLASS_STATUS_INFO_CHANGE);
603 627
604 //同步消息给其他人 628 //同步消息给其他人
605 - this.sendUpdaterClassStatusInfo({ "actionType": 1, isStopAllPublishMedia: false }); 629 + this.sendUpdaterClassStatusInfo({"actionType": 1, isStopAllPublishMedia: false});
606 } 630 }
607 } 631 }
608 632
@@ -619,9 +643,9 @@ class ConferApe extends Ape { @@ -619,9 +643,9 @@ class ConferApe extends Ape {
619 643
620 //处理课堂更新的信息 644 //处理课堂更新的信息
621 if (model && model.classStatusInfo) { 645 if (model && model.classStatusInfo) {
622 - try{  
623 - model.classStatusInfo.silenceUsers=JSON.parse( model.classStatusInfo.silenceUsers);  
624 - }catch (err){ 646 + try {
  647 + model.classStatusInfo.silenceUsers = JSON.parse(model.classStatusInfo.silenceUsers);
  648 + } catch (err) {
625 649
626 } 650 }
627 651
@@ -670,48 +694,55 @@ class ConferApe extends Ape { @@ -670,48 +694,55 @@ class ConferApe extends Ape {
670 chatMsg.toNodeID = chatReceivePdu.peer; 694 chatMsg.toNodeID = chatReceivePdu.peer;
671 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2); 695 chatMsg.message = this._rCArrayBufferUtil.uint8ArrayToStr(chatReceivePdu.userData, 2);
672 chatMsg.actionType = chatReceivePdu.actionType; 696 chatMsg.actionType = chatReceivePdu.actionType;
673 - loger.log("conferMsgComingHandler", chatMsg); //{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1} 697 + loger.log("课堂控制消息", chatMsg); //{"fromNodeID":418883112,"toNodeID":0,"message":"所有人退出课堂","actionType":1}
674 switch (chatMsg.actionType) { 698 switch (chatMsg.actionType) {
675 - case ApeConsts.CLASS_ACTION_CLOSE_ALL:  
676 - loger.log(chatMsg.message);  
677 - //收到课堂关闭,所有人都退出,执行自己关闭的流程  
678 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 });  
679 - break;  
680 - case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE:  
681 - console.log('chatMsg', chatMsg);  
682 - let msgObj = null;  
683 - try {  
684 - msgObj = JSON.parse(chatMsg.message);  
685 - if (msgObj && msgObj.nodeId == GlobalConfig.nodeId) {  
686 - this.changeHandUpStatus(msgObj); 699 + case ApeConsts.CLASS_ACTION_CLOSE_ALL:
  700 + loger.log(chatMsg.message);
  701 + //收到课堂关闭,所有人都退出,执行自己关闭的流程
  702 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
  703 + break;
  704 + case ApeConsts.CLASS_ACTION_KICK_OUT_ROSTER:
  705 + if (chatMsg.toNodeID == GlobalConfig.nodeId) {
  706 + //自己被踢出课堂
  707 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 2});
687 } 708 }
688 - } catch (err) {  
689 - loger.warn('chatMsg->JSON数据解析失败');  
690 - }  
691 - break;  
692 - case ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE:  
693 - let silenceMsg = null;  
694 - try {  
695 - silenceMsg = JSON.parse(chatMsg.message);  
696 - if (silenceMsg && silenceMsg.nodeId == GlobalConfig.nodeId) {  
697 - this.changeSilenceStatus(silenceMsg); 709 + break;
  710 + case ApeConsts.CLASS_ACTION_HANDUP_STATUS_CHANGE:
  711 + //console.log('chatMsg', chatMsg);
  712 + let msgObj = null;
  713 + try {
  714 + msgObj = JSON.parse(chatMsg.message);
  715 + if (msgObj && msgObj.nodeId == GlobalConfig.nodeId) {
  716 + this.changeHandUpStatus(msgObj);
  717 + }
  718 + } catch (err) {
  719 + loger.warn('chatMsg->JSON数据解析失败');
698 } 720 }
699 - } catch (err) {  
700 - loger.warn('chatMsg->JSON数据解析失败');  
701 - }  
702 - break;  
703 - default:  
704 - break; 721 + break;
  722 + case ApeConsts.USER_ACTION_SILENCE_STATUS_CHANGE:
  723 + let silenceMsg = null;
  724 + try {
  725 + silenceMsg = JSON.parse(chatMsg.message);
  726 + if (silenceMsg && silenceMsg.nodeId == GlobalConfig.nodeId) {
  727 + this.changeSilenceStatus(silenceMsg);
  728 + }
  729 + } catch (err) {
  730 + loger.warn('chatMsg->JSON数据解析失败');
  731 + }
  732 + break;
  733 + default:
  734 + break;
705 } 735 }
706 } 736 }
707 737
708 //-------------第三方消息------------------------------ 738 //-------------第三方消息------------------------------
709 //收到父级页面的消息,需要广播发送出去 739 //收到父级页面的消息,需要广播发送出去
710 onThirdReciveParentMessage(_msg) { 740 onThirdReciveParentMessage(_msg) {
711 - loger.log('收到页面的消息->广播给其他模块->', _msg);  
712 - this.sendThirdBroadcastData({ to: 0, message: _msg });  
713 - }  
714 - //发送第三方广播消息 741 + loger.log('收到页面的消息->广播给其他模块->', _msg);
  742 + this.sendThirdBroadcastData({to: 0, message: _msg});
  743 + }
  744 +
  745 + //发送第三方广播消息
715 sendThirdBroadcastData(_param) { 746 sendThirdBroadcastData(_param) {
716 loger.log("发送第三方广播消息->", _param); 747 loger.log("发送第三方广播消息->", _param);
717 if (this._classInfo == null || EngineUtils.isEmptyObject(this._classInfo)) { 748 if (this._classInfo == null || EngineUtils.isEmptyObject(this._classInfo)) {
@@ -783,63 +814,64 @@ class ConferApe extends Ape { @@ -783,63 +814,64 @@ class ConferApe extends Ape {
783 814
784 //更新人员列表数据 815 //更新人员列表数据
785 rosterUpdateHandler(nodeId, nodeData) { 816 rosterUpdateHandler(nodeId, nodeData) {
786 - nodeData.userRole = ApeConsts.userTypes[nodeData.role];  
787 - //如果是自己的信息,不处理跳过  
788 - if (nodeId == GlobalConfig.nodeId) {  
789 - //loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);  
790 - //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:  
791 - // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)  
792 - let rosterLen = Object.keys(this.rosters).length;  
793 - GlobalConfig.rosterNumber=rosterLen;//记录当前的总人数  
794 - if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {  
795 - loger.warn("当前课堂没有老师->暂停课堂");  
796 - this.pauseClass({ isForce: true });  
797 - this.stopRecord(true);  
798 - }  
799 - //处理用户信息  
800 - this.unPackRosterInfo(nodeId, nodeData);  
801 - return; 817 + nodeData.userRole = ApeConsts.userTypes[nodeData.role];
  818 + //如果是自己的信息,不处理跳过
  819 + if (nodeId == GlobalConfig.nodeId) {
  820 + //loger.log("自己加入课堂的消息->",nodeId,"role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);
  821 + //自己加入的时候,需要做一下判断操作,如果满足以下3个条件就要暂停课堂:
  822 + // 1.当前课堂只有自己;2.自己的身份不是host;3当前的课堂状态为(CLASS_STATUS_STARTED= 1;//直播中)
  823 + let rosterLen = Object.keys(this.rosters).length;
  824 + GlobalConfig.rosterNumber = rosterLen;//记录当前的总人数
  825 + if (rosterLen < 1 && !GlobalConfig.isHost && GlobalConfig.classStatus == ApeConsts.CLASS_STATUS_STARTED) {
  826 + loger.warn("当前课堂没有老师->暂停课堂");
  827 + this.pauseClass({isForce: true});
  828 + this.stopRecord(true);
802 } 829 }
803 -  
804 - //loger.log(nodeId, "加入课堂,role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);  
805 -  
806 - //新加入的人员不是自己  
807 - //1.判断进入的用户身份,如果进入的人身份是host,助教,监课,并且和自己的身份冲突,自己会被踢掉  
808 - //2.最后进入的人会踢掉之前进入的人,nodeId是按时间戳生成的,最后进入的人nodeId的值比之前进入的人大  
809 - if (parseInt(nodeId) > GlobalConfig.nodeId) {  
810 - if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {  
811 - this.kickOutRoster();  
812 - return;  
813 - } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") {  
814 - loger.log("异地登陆->userId->", GlobalConfig.userId);  
815 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);  
816 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 });  
817 - }  
818 - }  
819 - /*if (parseInt(nodeId) > GlobalConfig.nodeId) {  
820 - if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {  
821 - this.kickOutRoster();  
822 - return;  
823 - } else if (nodeData.role == ApeConsts.NR_PRESENTER && GlobalConfig.isPresenter) {  
824 - this.kickOutRoster();  
825 - return;  
826 - } else if (nodeData.role == ApeConsts.NR_ASSISTANT && GlobalConfig.isAssistant) {  
827 - this.kickOutRoster();  
828 - return;  
829 - } else if (nodeData.role == ApeConsts.NR_INVISIBLE && GlobalConfig.isInvisible) {  
830 - this.kickOutRoster();  
831 - return;  
832 - }else if(nodeData.userId==GlobalConfig.userId&&GlobalConfig.userId!="0"){  
833 - loger.log("异地登陆->userId->",GlobalConfig.userId);  
834 - this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);  
835 - this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':1});  
836 - }  
837 - }*/  
838 -  
839 //处理用户信息 830 //处理用户信息
840 this.unPackRosterInfo(nodeId, nodeData); 831 this.unPackRosterInfo(nodeId, nodeData);
  832 + return;
  833 + }
  834 +
  835 + //loger.log(nodeId, "加入课堂,role-->", nodeData.role, ApeConsts.userTypes[nodeData.role]);
  836 +
  837 + //新加入的人员不是自己
  838 + //1.判断进入的用户身份,如果进入的人身份是host,助教,监课,并且和自己的身份冲突,自己会被踢掉
  839 + //2.最后进入的人会踢掉之前进入的人,nodeId是按时间戳生成的,最后进入的人nodeId的值比之前进入的人大
  840 + if (parseInt(nodeId) > GlobalConfig.nodeId) {
  841 + if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {
  842 + this.kickOutRoster();
  843 + return;
  844 + } else if (nodeData.userId == GlobalConfig.userId && GlobalConfig.userId != "0") {
  845 + loger.log("异地登陆->userId->", GlobalConfig.userId);
  846 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);
  847 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
  848 + }
841 } 849 }
  850 + /*if (parseInt(nodeId) > GlobalConfig.nodeId) {
  851 + if (nodeData.role == ApeConsts.NR_HOST && GlobalConfig.isHost) {
  852 + this.kickOutRoster();
  853 + return;
  854 + } else if (nodeData.role == ApeConsts.NR_PRESENTER && GlobalConfig.isPresenter) {
  855 + this.kickOutRoster();
  856 + return;
  857 + } else if (nodeData.role == ApeConsts.NR_ASSISTANT && GlobalConfig.isAssistant) {
  858 + this.kickOutRoster();
  859 + return;
  860 + } else if (nodeData.role == ApeConsts.NR_INVISIBLE && GlobalConfig.isInvisible) {
  861 + this.kickOutRoster();
  862 + return;
  863 + }else if(nodeData.userId==GlobalConfig.userId&&GlobalConfig.userId!="0"){
  864 + loger.log("异地登陆->userId->",GlobalConfig.userId);
  865 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_REMOTE_LANDING);
  866 + this._emit(MessageTypes.CLASS_RUN_EXIT,{'type':1});
  867 + }
  868 + }*/
  869 +
842 //处理用户信息 870 //处理用户信息
  871 + this.unPackRosterInfo(nodeId, nodeData);
  872 + }
  873 +
  874 + //处理用户信息
843 unPackRosterInfo(nodeId, nodeData) { 875 unPackRosterInfo(nodeId, nodeData) {
844 let rosterExists = this.rosters[nodeId]; 876 let rosterExists = this.rosters[nodeId];
845 this.rosters[nodeId] = nodeData; 877 this.rosters[nodeId] = nodeData;
@@ -859,13 +891,13 @@ class ConferApe extends Ape { @@ -859,13 +891,13 @@ class ConferApe extends Ape {
859 } 891 }
860 if (!rosterExists) { 892 if (!rosterExists) {
861 loger.log("人员加入->", newNodeData); 893 loger.log("人员加入->", newNodeData);
862 - this._emit(MessageTypes.CLASS_INSERT_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData }); 894 + this._emit(MessageTypes.CLASS_INSERT_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
863 this.emitRosterChange(); 895 this.emitRosterChange();
864 896
865 } else { 897 } else {
866 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists); 898 //loger.log("更新人员列表数据,rosterExists已经存在",rosterExists);
867 loger.log("人员更新信息->", newNodeData); 899 loger.log("人员更新信息->", newNodeData);
868 - this._emit(MessageTypes.CLASS_UPDATE_ROSTER, { "nodeId": nodeId, "nodeData": newNodeData }); 900 + this._emit(MessageTypes.CLASS_UPDATE_ROSTER, {"nodeId": nodeId, "nodeData": newNodeData});
869 } 901 }
870 902
871 } 903 }
@@ -873,46 +905,47 @@ class ConferApe extends Ape { @@ -873,46 +905,47 @@ class ConferApe extends Ape {
873 //踢出用户 905 //踢出用户
874 kickOutRoster() { 906 kickOutRoster() {
875 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT); 907 this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_CLASS_KICK_OUT);
876 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 1 }); 908 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 1});
877 } 909 }
878 910
879 //视频模块发生更新,人员状态需要更新 911 //视频模块发生更新,人员状态需要更新
880 updaterRosterStatus(_param) { 912 updaterRosterStatus(_param) {
881 - //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param);  
882 - //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的  
883 - if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {  
884 - loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);  
885 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": _param.fromNodeId });  
886 - }  
887 -  
888 - /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {  
889 - if(this.rosters[_param.fromNodeId] == null){  
890 - loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->", _param);  
891 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});  
892 - }  
893 -  
894 - //如果音视频消息是自己的,需要设置麦克风和摄像头状态  
895 - if(_param.fromNodeId==GlobalConfig.nodeId){  
896 - if(_param.mediaId==ApeConsts.MEDIA_TYPE_AUDIO){  
897 - GlobalConfig.openMicrophones=EngineUtils.creatTimestamp();  
898 - GlobalConfig.openCamera=0;  
899 - }else {  
900 - GlobalConfig.openCamera=EngineUtils.creatTimestamp();  
901 - GlobalConfig.openMicrophones=GlobalConfig.openCamera;  
902 - }  
903 - this.updateUserInfo();  
904 - }  
905 -  
906 - }else if (_param && _param.status == ApeConsts.CHANNEL_STATUS_RELEASED) {  
907 - //如果音视频消息是自己的,需要设置麦克风和摄像头状态  
908 - if(_param.fromNodeId==GlobalConfig.nodeId){  
909 - GlobalConfig.openCamera=0;  
910 - GlobalConfig.openMicrophones=0;  
911 - this.updateUserInfo();  
912 - }  
913 - }*/ 913 + //loger.log("媒体模块发生更新,人员状态需要更新,fromNodeId->",_param);
  914 + //如果视频消息中channel的占用人 fromNodeId在人员列表中不存在,需要释放这channel,因为这个有可能是之前没释放成功的
  915 + if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING && this.rosters[_param.fromNodeId] == null) {
  916 + loger.log("媒体模块被占用->占有人已经不存在课堂中->释放->", _param);
  917 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
914 } 918 }
915 - //设备状态更新 919 +
  920 + /* if (_param && _param.status == ApeConsts.CHANNEL_STATUS_OPENING) {
  921 + if(this.rosters[_param.fromNodeId] == null){
  922 + loger.log("媒体模块被占用,占有人已经不存在课堂中,释放Channel,_param->", _param);
  923 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": _param.fromNodeId});
  924 + }
  925 +
  926 + //如果音视频消息是自己的,需要设置麦克风和摄像头状态
  927 + if(_param.fromNodeId==GlobalConfig.nodeId){
  928 + if(_param.mediaId==ApeConsts.MEDIA_TYPE_AUDIO){
  929 + GlobalConfig.openMicrophones=EngineUtils.creatTimestamp();
  930 + GlobalConfig.openCamera=0;
  931 + }else {
  932 + GlobalConfig.openCamera=EngineUtils.creatTimestamp();
  933 + GlobalConfig.openMicrophones=GlobalConfig.openCamera;
  934 + }
  935 + this.updateUserInfo();
  936 + }
  937 +
  938 + }else if (_param && _param.status == ApeConsts.CHANNEL_STATUS_RELEASED) {
  939 + //如果音视频消息是自己的,需要设置麦克风和摄像头状态
  940 + if(_param.fromNodeId==GlobalConfig.nodeId){
  941 + GlobalConfig.openCamera=0;
  942 + GlobalConfig.openMicrophones=0;
  943 + this.updateUserInfo();
  944 + }
  945 + }*/
  946 + }
  947 +
  948 + //设备状态更新
916 updaterUserDeviecStatusChange(_data) { 949 updaterUserDeviecStatusChange(_data) {
917 loger.log("音视频设备状态更新->", _data); 950 loger.log("音视频设备状态更新->", _data);
918 this.updateUserInfo(); 951 this.updateUserInfo();
@@ -923,7 +956,7 @@ class ConferApe extends Ape { @@ -923,7 +956,7 @@ class ConferApe extends Ape {
923 if (GlobalConfig.nodeId == nodeId) { 956 if (GlobalConfig.nodeId == nodeId) {
924 loger.log("自己离开课堂"); 957 loger.log("自己离开课堂");
925 // 自己退出 958 // 自己退出
926 - this._emit(MessageTypes.CLASS_RUN_EXIT, { 'type': 0 }); 959 + this._emit(MessageTypes.CLASS_RUN_EXIT, {'type': 0});
927 } else { 960 } else {
928 let user = this.rosters[nodeId]; 961 let user = this.rosters[nodeId];
929 if (user) { 962 if (user) {
@@ -931,7 +964,7 @@ class ConferApe extends Ape { @@ -931,7 +964,7 @@ class ConferApe extends Ape {
931 } 964 }
932 delete this.rosters[nodeId]; 965 delete this.rosters[nodeId];
933 this.emitRosterChange(); 966 this.emitRosterChange();
934 - this._emit(MessageTypes.CLASS_DELETE_ROSTER, { "nodeId": nodeId }); 967 + this._emit(MessageTypes.CLASS_DELETE_ROSTER, {"nodeId": nodeId});
935 968
936 //当前人员列表中抽一个人来检查离开人员是否占用频道 969 //当前人员列表中抽一个人来检查离开人员是否占用频道
937 for (let key in this.rosters) { 970 for (let key in this.rosters) {
@@ -939,7 +972,7 @@ class ConferApe extends Ape { @@ -939,7 +972,7 @@ class ConferApe extends Ape {
939 //如果抽到的人是自己就处理以下操作 972 //如果抽到的人是自己就处理以下操作
940 if (randNodeId == GlobalConfig.nodeId) { 973 if (randNodeId == GlobalConfig.nodeId) {
941 loger.log(randNodeId, "有权限检查离开的人员是否占用channel"); 974 loger.log(randNodeId, "有权限检查离开的人员是否占用channel");
942 - this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, { "nodeId": nodeId }); 975 + this._emit(MessageTypes.CLASS_NONENTITY_ROSTER, {"nodeId": nodeId});
943 //如果离开的人员是老师,需要暂停当前的课堂 976 //如果离开的人员是老师,需要暂停当前的课堂
944 977
945 if (user && user.role == ApeConsts.NR_HOST) { 978 if (user && user.role == ApeConsts.NR_HOST) {
@@ -47,7 +47,8 @@ class MediaModule { @@ -47,7 +47,8 @@ class MediaModule {
47 path = "http://" + GlobalConfig.MS_PLAY_HLS_IP 47 path = "http://" + GlobalConfig.MS_PLAY_HLS_IP
48 + port + "/live/" 48 + port + "/live/"
49 + _param.streamId 49 + _param.streamId
50 - + "/"+fileName; 50 + +".m3u8";//新版的规则,不需要加playlist 20170724
  51 + //+ "/"+fileName;//
51 52
52 53
53 } else { 54 } else {
@@ -718,6 +718,7 @@ message RCChatSendDataRequestPdu { @@ -718,6 +718,7 @@ message RCChatSendDataRequestPdu {
718 required bytes user_data = 4; 718 required bytes user_data = 4;
719 required string from_role = 5; 719 required string from_role = 5;
720 required bytes from_name = 6; 720 required bytes from_name = 6;
  721 + optional uint32 msgType = 7 [default =0];//当前消息类型,0是文字消息 1是图片消息
721 } 722 }
722 723
723 message RCDocSendDataModelPdu { 724 message RCDocSendDataModelPdu {