AlexWang

音乐接口

... ... @@ -28,6 +28,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
import Server from "config/Server";
import MediaModule from 'apes/MediaModule';
import MediaSharedApe from 'apes/MediaSharedApe';
import MusicSharedApe from 'apes/MusicSharedApe';
import QuestionApe from 'apes/QuestionApe';
import UTF8 from 'utf-8';
... ... @@ -48,6 +49,7 @@ let _whiteboard_ape;
let _cursor_ape;
let _recordPlayback;
let _mediaShareApe;
let _musicShareApe;
let _questionApe;
//MCUClient 外部实例化主类
... ... @@ -125,6 +127,10 @@ export default class MessageEntrance extends Emiter {
_mediaShareApe.on('*', (type, data) => this._emit(type, data));
_mediaShareApe.on(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS, this.mediaShareApeJoinChannelSuccess.bind(this));
_musicShareApe = new MusicSharedApe();
_musicShareApe.on('*', (type, data) => this._emit(type, data));
_musicShareApe.on(MusicSharedApe.MUSICSHARED_JOIN_CHANNEL_SUCCESS, this.musicShareApeJoinChannelSuccess.bind(this));
_whiteboard_ape = new WhiteBoardApe();
_whiteboard_ape.on('*', (type, data) => this._emit(type, data));
... ... @@ -221,6 +227,10 @@ export default class MessageEntrance extends Emiter {
this.mediaSharedStop = this._sendMediaSharedStop.bind(this); //停止
this.mediaSharedUpdate = this._sendMediaSharedUpdate.bind(this); //更新媒体的状态
this.musicSharedPlay = this._sendMusicSharedPlay.bind(this); //Music播放
this.musicSharedStop = this._sendMusicSharedStop.bind(this); //Music停止
this.musicSharedUpdate = this._sendMusicSharedUpdate.bind(this); //Music更新媒体的状态
//答题卡
this.creatQuestion = this._creatQuestion.bind(this);
this.getQuestion = this._getQuestion.bind(this);
... ... @@ -1233,7 +1243,6 @@ export default class MessageEntrance extends Emiter {
}
}
//获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
_sassGetClassParamSuccessHandler(_data) {
loger.log('获取课堂课堂信息完成.');
... ... @@ -1773,6 +1782,19 @@ export default class MessageEntrance extends Emiter {
_mediaShareApe.mediaSharedUpload(_param);
}
}
//音乐共享模块的接口
//上传
_sendMusicSharedUpload(_param) {
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_musicShareApe) {
_musicShareApe.musicSharedUpload(_param);
}
}
//Sass删除媒体文件数据
_sassDeletMediaShare(_param) {
if (!_mcu.connected) {
... ... @@ -1798,6 +1820,7 @@ export default class MessageEntrance extends Emiter {
_sass.sassDeletMediaShare(_param);
}
}
//删除
_sendMediaSharedDelete(_param) {
if (!_mcu.connected) {
... ... @@ -1808,6 +1831,39 @@ export default class MessageEntrance extends Emiter {
_mediaShareApe.mediaSharedDelete(_param);
}
}
//音乐更新
_sendMusicSharedUpdate(_param) {
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_musicShareApe) {
_musicShareApe.musicSharedUpdate(_param);
}
}
//音乐播放
_sendMusicSharedPlay(_param) {
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_musicShareApe) {
_musicShareApe.musicSharedPlay(_param);
}
}
//音乐停止
_sendMusicSharedStop(_param) {
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
return;
}
if (_musicShareApe) {
_musicShareApe.musicSharedStop(_param);
}
}
//更新媒体文件的状态信息
_sendMediaSharedUpdate(_param) {
if (!_mcu.connected) {
... ... @@ -1818,6 +1874,7 @@ export default class MessageEntrance extends Emiter {
_mediaShareApe.mediaSharedUpdate(_param);
}
}
//播放
_sendMediaSharedPlay(_param) {
if (!_mcu.connected) {
... ... @@ -1829,6 +1886,7 @@ export default class MessageEntrance extends Emiter {
}
}
//停止
_sendMediaSharedStop(_param) {
if (!_mcu.connected) {
loger.warn(GlobalConfig.getCurrentStatus());
... ... @@ -1839,6 +1897,31 @@ export default class MessageEntrance extends Emiter {
}
}
//音乐共享模块加入频道成功,同步到MCU服务器上的数据
musicShareApeJoinChannelSuccess() {
loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMusicList.length);
console.log("媒体共享模数据->", GlobalConfig.sharedMusicList);
//如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
if (GlobalConfig.isHost && GlobalConfig.sharedMusicList.length > 0) {
for (let i = 0; i < GlobalConfig.sharedMusicList.length; i++) {
let value = GlobalConfig.sharedMusicList[i];
if (value) {
let paramInfo = {
"status": 0,
"creatUserId": value.creatUserId,
"creatUserName": value.createUserName,
"url": value.url,
"fileType": value.type,
"fileId": "" + value.id,
"fileName": value.name,
"seek": 0
};
this._sendMusicSharedUpload(paramInfo);
}
}
}
}
//媒体共享模块加入频道成功,同步到MCU服务器上的数据
mediaShareApeJoinChannelSuccess() {
loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length);
... ... @@ -2049,5 +2132,5 @@ export default class MessageEntrance extends Emiter {
}
}
}
}
... ...
... ... @@ -202,6 +202,15 @@ class GlobalConfig {
return this.sharedMediaList;
}
//储存已经提前上传的媒体共享文件列表
static setMusicShareList(_data) {
if (_data == null) return;
this.sharedMusicList = _data;
}
static getMusicShareList() {
return this.sharedMusicList;
}
//储存录制列表
static setRecordList(_data) {
if (_data == null) return;
... ... @@ -429,6 +438,7 @@ GlobalConfig.classDetail = {}; //Sass直接返回的当前课堂基本信息
//从Sass获取的
GlobalConfig.sharedMediaList = []; // 已经提前上传的媒体文件列表,进入课堂后需要自动加载
GlobalConfig.sharedMusicList = []; // 已经提前上传的音乐文件列表,进入课堂后需要自动加载
GlobalConfig.docListPrepare = []; // 已经提前上传的文档,进入课堂后需要自动加载
GlobalConfig.recordList = []; //录制服务器地址集合
GlobalConfig.docList = []; //文档服务器地址集合
... ...
... ... @@ -141,6 +141,7 @@ ApeConsts.SCREENSHARING_SESSION_ID = 20;
ApeConsts.POLL_SESSION_ID = 21;
ApeConsts.QUESTION_SESSION_ID = 22;
ApeConsts.CURSOR_SESSION_ID = 23;
ApeConsts.MUSIC_SESSION_ID = 24;
// defs for common channel id
ApeConsts.BROADCAST_CHANNEL_ID = 0;
... ... @@ -152,6 +153,7 @@ ApeConsts.DOCSHARING_CHANNEL_ID = ApeConsts.DOCSHARING_SESSION_ID;
ApeConsts.WHITEBOARD_CHANNEL_ID = ApeConsts.WHITEBOARD_SESSION_ID;
ApeConsts.CURSOR_CHANNEL_ID = ApeConsts.CURSOR_SESSION_ID;
ApeConsts.MEDIA_CHANNEL_ID = ApeConsts.MEDIA_SESSION_ID;
ApeConsts.MUSIC_CHANNEL_ID = ApeConsts.MUSIC_SESSION_ID;
ApeConsts.SCREENSHARING_CHANNEL_ID = ApeConsts.SCREENSHARING_SESSION_ID;
ApeConsts.QUESTION_CHANNEL_ID = ApeConsts.QUESTION_SESSION_ID;
... ... @@ -167,6 +169,7 @@ ApeConsts.DOCSHARING_SESSION_NAME = "doc sharing app";
ApeConsts.WHITEBOARD_SESSION_NAME = "whiteboard app";
ApeConsts.CURSOR_SESSION_NAME = "cursor app";
ApeConsts.MEDIA_SESSION_NAME = "media sharing app";
ApeConsts.MUSIC_SESSION_NAME = "music sharing app";
ApeConsts.SCREENSHARING_SESSION_NAME = "screen sharing app";
ApeConsts.QUESTION_SESSION_NAME = "question app";
... ... @@ -181,6 +184,7 @@ ApeConsts.DOCSHARING_SESSION_TAG = "doc-tag";
ApeConsts.WHITEBOARD_SESSION_TAG = "wbd-tag";
ApeConsts.CURSOR_SESSION_TAG = "cursor-tag";
ApeConsts.MEDIA_SESSION_TAG = "med-tag";
ApeConsts.MUSIC_SESSION_TAG = "mis-tag";
ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag";
ApeConsts.QUESTION_SESSION_TAG = "qst-tag";
... ... @@ -237,6 +241,11 @@ ApeConsts.MEDIA_OBJ_TABLE_ID = ((ApeConsts.MEDIA_SESSION_ID << 16) + 1);
ApeConsts.MEDIA_OBJ_TABLE_NAME = "med list";
ApeConsts.MEDIA_OBJ_TABLE_TAG = "med list tag";
// music sharing objects
ApeConsts.MUSIC_OBJ_TABLE_ID = ((ApeConsts.MUSIC_SESSION_ID << 16) + 1);
ApeConsts.MUSIC_OBJ_TABLE_NAME = "mis list";
ApeConsts.MUSIC_OBJ_TABLE_TAG = "mis list tag";
// chat sharing objects
ApeConsts.CHAT_OBJ_TABLE_ID = ((ApeConsts.CHAT_SESSION_ID << 16) + 1);
ApeConsts.CHAT_OBJ_TABLE_NAME = "chat list";
... ...
... ... @@ -470,6 +470,7 @@ class ConferApe extends Ape {
}
}
//更新课堂信息
sendUpdaterClassStatusInfo(_param) {
//{"actionType": 1,isStopAllPublishMedia:false} //actionType课堂状态 isStopAllPublishMedia是否停止当前的所有推流
... ...
// //////////////////////////////////////////////////////////////////////////////
//
// 媒体共享模块
// //////////////////////////////////////////////////////////////////////////////
import Ape from './Ape';
import ApeConsts from './ApeConsts';
import pdu from 'pdus';
import Loger from 'Loger';
import MessageTypes from 'MessageTypes';
import GlobalConfig from 'GlobalConfig';
import EngineUtils from 'EngineUtils';
let loger = Loger.getLoger('MusicSharedApe');
class MusicSharedApe extends Ape {
constructor() {
super(
ApeConsts.MUSIC_SESSION_ID,
ApeConsts.MUSIC_SESSION_NAME,
ApeConsts.MUSIC_SESSION_TAG
);
this.musicSharedList = {}; //记录媒体数据
// Ape Models
this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
this.registerObj(pdu.RCPDU_REG_REGISTER_TABLE, ApeConsts.MUSIC_OBJ_TABLE_ID, ApeConsts.MUSIC_OBJ_TABLE_NAME, ApeConsts.MUSIC_OBJ_TABLE_TAG, 0, new ArrayBuffer);
}
/////////////发送数据操作//////////////////////////////////////////////////////
//上传媒体文件
musicSharedUpload(paramInfo) {
if (paramInfo == null || EngineUtils.isEmptyObject(paramInfo)) {
loger.warn('上传媒体文件->失败->参数错误->', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//判断媒体文件是否已经存在,每个媒体文件都有唯一的fileId,如果已经同步的媒体文件中存在相同的fileId就不需要再同步
if (this.checkMusicSharedId(paramInfo.fileId)) {
//媒体文件已经存在相同的fileId,不需要同步上传
loger.warn('上传媒体文件->失败->媒体文件档的fileId无效或已经存在相同的fileId不需要上传');
return;
}
let itemIdx = EngineUtils.creatSoleNumberFromTimestamp(); //
let pduDataModel = this.packPdu(paramInfo, itemIdx);
if (pduDataModel == null) {
loger.log('上传媒体文件->失败->数据无效');
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx = itemIdx; //直接用时间戳作为id
tableItemPdu.registerObjId = ApeConsts.MUSIC_OBJ_TABLE_ID;
tableItemPdu.owner = 0; //收到flash的是这个值,不清楚先写固定
tableItemPdu.itemData = pduDataModel.toArrayBuffer();
//insert
let tableInsertItemPdu = new pdu['RCRegistryTableInsertItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_INSERT_PDU; //
tableInsertItemPdu.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
updateObjPdu.subType = tableInsertItemPdu.type;
updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("上传媒体文件->发送->itemIdx=" + tableItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
//删除媒体文件
musicSharedDelete(paramInfo) {
let tableDeleteItemPdu = new pdu['RCRegistryTableDeleteItemPdu'];
tableDeleteItemPdu.type = pdu.RCPDU_REG_TABLE_DELETE_PDU; //
tableDeleteItemPdu.itemIdx = parseInt(paramInfo.itemIdx); //这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
updateObjPdu.subType = tableDeleteItemPdu.type;
updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("媒体文件发送删除数据=============>" + tableDeleteItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
//更新
updaterMusicShared(_pduDataModel, _itemIdx) {
//验证坐标点集合数组是否合法
if (_pduDataModel == null || _itemIdx == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
loger.log("媒体文件->更新 ", _pduDataModel);
let pduDataModel = this.packPdu(_pduDataModel, _itemIdx);
let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
tableItemPdu.itemIdx = _itemIdx; //直接用时间戳作为id
tableItemPdu.owner = 0; //收到flash的是这个值,不清楚先写固定
tableItemPdu.itemData = pduDataModel.toArrayBuffer();
//insert
let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu'];
//optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
//repeated RCRegistryTableItemPdu items = 2;
tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU; //
tableInsertItemPdu.items.push(tableItemPdu);
let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
updateObjPdu.subType = tableInsertItemPdu.type;
updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
//同步
let adapterItemPdu = new pdu['RCAdapterItemPdu'];
adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
let adapterPdu = new pdu['RCAdapterPdu'];
adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
adapterPdu.item.push(adapterItemPdu);
loger.log("发送更新媒体文件.itemIdx=" + tableItemPdu.itemIdx);
this.sendUniform(adapterPdu, true);
}
//组织完整的媒体文件信息,包含上传时的信息和转换后的完整地址信息
_musicSharedPackFullInfo(_itemDataInfo) {
let itemDataInfo = _itemDataInfo;
if (!itemDataInfo.seek) {
itemDataInfo.seek = 1;
}
loger.log('musicPackFullInfo->', itemDataInfo);
return itemDataInfo;
}
//更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
updaterRecordApeStatus(_param) {
loger.warn("录制状态发送改变->更新当前的媒体文件数据->fileId:", GlobalConfig.activeMusicId, 'page:', GlobalConfig.activeMusicSeek);
this.musicSharedSeek({
"itemIdx": GlobalConfig.activeMusicId,
"seek": GlobalConfig.activeMusicSeek
});
}
//清除当前媒体文件模块的数据
clearData() {
loger.log("clearData->")
this.musicSharedList = {};
GlobalConfig.activeMusicId = 0;
GlobalConfig.activeMusicSeek = 1;
}
//更新媒体文件(播放,暂停,停止,seek)
musicSharedUpdate(_param) {
if (_param == null || _param.itemIdx == null) {
loger.warn('媒体文件更新失败->参数错误', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//获取已经存在的数据
let pduDataModel = this.musicSharedList[_param.itemIdx];
if (pduDataModel == null) {
loger.warn('更新媒体文件->媒体文件不存在', _param);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新当前选择的媒体文件数据的字段
pduDataModel.status = parseInt(_param.status) || 0; //默认是0
pduDataModel.seek = parseInt(_param.seek) || 1;
pduDataModel.musicVolume = parseInt(_param.musicVolume) || 0;
//更新当前选择的媒体文件
this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
}
//播放媒体文件
musicSharedPlay(paramInfo) {
loger.log('切换媒体文件->', paramInfo);
if (GlobalConfig.isRecordPlayBack) {
loger.warn('录制回放状态不允许切换媒体文件');
return;
}
if (paramInfo == null || paramInfo.itemIdx == null) {
loger.warn('切换媒体文件失败,参数错误', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
/* if (paramInfo.itemIdx == GlobalConfig.activeMusicId && GlobalConfig.activeMusicId != 0) {
loger.warn('媒体文件已经显示', paramInfo.itemIdx, GlobalConfig.activeMusicId);
return;
}*/
//更新切换之前的媒体文件的数据,要显示当前切换的媒体文件,上一个媒体文件需要隐藏
let oldPduDataModel;
if (GlobalConfig.activeMusicId != 0) {
oldPduDataModel = this.musicSharedList[GlobalConfig.activeMusicId];
if (oldPduDataModel) {
oldPduDataModel.status = 0; //停止状态
//oldPduDataModel.seek=0;
}
}
//获取已经存在的数据
let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
if (pduDataModel == null) {
loger.warn('切换媒体文件失败,媒体文件不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新当前选择的媒体文件数据的字段
pduDataModel.status = paramInfo.status || 0; //默认是0
pduDataModel.seek = paramInfo.seek || 1;
pduDataModel.musicVolume = parseInt(paramInfo.musicVolume) || 0;
//loger.log('切换媒体文件,当前媒体文件和上一个显示的媒体文件都需要更新状态');
loger.log({ "oldDoc": oldPduDataModel, "nowDoc": pduDataModel });
//更新当前选择的媒体文件
this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
//更新上一个媒体文件 隐藏
if (oldPduDataModel && oldPduDataModel.itemIdx != pduDataModel.itemIdx) {
this.updaterMusicShared(oldPduDataModel, oldPduDataModel.itemIdx);
}
}
//停止媒体文件
musicSharedStop(paramInfo) {
loger.log('停止媒体文件->', paramInfo);
if (GlobalConfig.isRecordPlayBack) {
loger.warn('录制回放状态不允许停止媒体文件');
return;
}
if (paramInfo == null || paramInfo.itemIdx == null) {
loger.warn('停止媒体文件,参数错误', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//获取已经存在的数据
let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
if (pduDataModel == null) {
loger.warn('停止媒体文件,媒体文件不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新当前选择的媒体文件数据的字段
pduDataModel.status = 0; //默认是0
pduDataModel.seek = 0;
pduDataModel.musicVolume = 60;
//更新当前选择的媒体文件
this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
}
//暂停媒体文件
musicSharedPause(paramInfo) {
loger.log('暂停媒体文件->', paramInfo);
if (GlobalConfig.isRecordPlayBack) {
loger.warn('录制回放-》暂停媒体文件');
return;
}
if (paramInfo == null || paramInfo.itemIdx == null) {
loger.warn('暂停媒体文件,参数错误', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//获取已经存在的数据
let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
if (pduDataModel == null) {
loger.warn('暂停媒体文件,媒体文件不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新当前选择的媒体文件数据的字段
pduDataModel.status = 2; //默认是0
//更新当前选择的媒体文件
this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
}
//媒体文件SEEK
musicSharedSeek(paramInfo) {
loger.log('媒体文件SEEK->', paramInfo);
//获取已经存在的数据
let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
if (pduDataModel == null) {
loger.log('媒体文件SEEK->媒体文件不存在', paramInfo);
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return;
}
//更新数据的字段
pduDataModel.seek = parseInt(paramInfo.seek) || 1;
if (pduDataModel.seek < 1) {
pduDataModel.seek = 1; //默认值最小是1
}
this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
}
/////收到消息处理/////////////////////////////////////////////////////////////////////////////////
tableInsertHandler(owner, itemIdx, itemData) {
}
//添加媒体文件
tableInsertApeHandler(_tableUpdateItems, _seekTime) {
let tableInsertItems = _tableUpdateItems;
let tableInsertItemsLen = tableInsertItems.length;
loger.log('添加媒体文件->_seekTime:' + _seekTime, "activeMusicId->", GlobalConfig.activeMusicId, "tableUpdateItemsLen->", tableInsertItemsLen);
for (let i = 0; i < tableInsertItemsLen; ++i) {
let insertItem = tableInsertItems[i];
//this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
let itemDataInfo = this.unPackPdu(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
if (itemDataInfo) {
itemDataInfo.seek = itemDataInfo.seek + parseInt(_seekTime); //seek是媒体文件自己的,_seekTime是录制回放时进度条换算的
this.musicSharedList[insertItem.itemIdx] = itemDataInfo;
if (itemDataInfo.status == 1) {
GlobalConfig.activeMusicId = itemDataInfo.itemIdx; //当前激活的媒体文件ID
GlobalConfig.activeMusicSeek = itemDataInfo.seek;
loger.log('添加媒体文件->设置当前激活的媒体文件id');
}
let getMusicPackFullInfo = this._musicSharedPackFullInfo(itemDataInfo);
this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
}
}
//媒体文件数据更新完毕,如果当前没有显示的媒体文件,默认选择一个显示
this._showDefaultMeida();
}
tableDeleteHandler(object_id, tableDeleteData) {
loger.log('删除媒体文件数据->', object_id, tableDeleteData); //["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
if (tableDeleteData && tableDeleteData.itemIdx) {
let len = tableDeleteData.itemIdx.length;
let itemIdxs = tableDeleteData.itemIdx;
for (let i = 0; i < len; i++) {
if (this.musicSharedList[itemIdxs[i]]) {
loger.log("删除媒体文件数据:", itemIdxs[i]);
let itemDataInfo = this.musicSharedList[itemIdxs[i]];
if (itemDataInfo && itemDataInfo.status == 1) {
GlobalConfig.activeMusicId = 0; //当前激活的媒体文件ID
GlobalConfig.activeMusicSeek = 1; //当前激活的媒体文件的当前页
loger.log('删除媒体文件数据->清除当前显示的媒体文件');
}
this._emit(MessageTypes.MEDIA_SHARED_DELETE, { "itemIdx": itemIdxs[i] });
delete this.musicSharedList[itemIdxs[i]];
}
}
}
}
tableUpdateHandler(owner, itemIdx, itemData) {
}
tableUpdateApeHandler(_tableUpdateItems, _seekTime) {
let tableUpdateItemsLen = _tableUpdateItems.length;
loger.log('更新媒体文件->_seekTime:' + _seekTime, "activeDocId->", GlobalConfig.activeMusicId, "更新的数量->", tableUpdateItemsLen);
for (let i = 0; i < tableUpdateItemsLen; ++i) {
let tableItem = _tableUpdateItems[i];
let itemDataInfo = this.unPackPdu(tableItem.owner, tableItem.itemIdx, tableItem.itemData);
if (itemDataInfo != null) {
itemDataInfo.seek = itemDataInfo.seek + parseInt(_seekTime);
this.musicSharedList[tableItem.itemIdx] = itemDataInfo;
if (itemDataInfo && itemDataInfo.status == 1) {
GlobalConfig.activeMusicId = itemDataInfo.itemIdx; //当前激活的媒体文件ID
GlobalConfig.activeMusicSeek = itemDataInfo.seek;
loger.log('更新媒体文件->设置当前激活的媒体文件id->', GlobalConfig.activeMusicId, "curPageNum->", GlobalConfig.activeMusicSeek);
}
let getMusicPackFullInfo = this._musicSharedPackFullInfo(itemDataInfo);
this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
} else {
loger.log('更新媒体文件-> 数据无效--> itemIdx', itemIdx);
}
}
this._showDefaultMeida();
}
//果当前没有显示的媒体文件,默认选择一个显示媒体文件
_showDefaultMeida() {
//显示默认媒体文件条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的媒体文件id不为0
if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeMusicId > 0) {
return;
}
/*
let tempDocItemIdx;//临时记录媒体文件数据,用于显示默认媒体文件
for (let key in this.musicSharedList) {
tempDocItemIdx= this.musicSharedList[key];
if (tempDocItemIdx) {
loger.log("选择一个媒体文件作为默认媒体文件显示->", tempDocItemIdx);
let paramInfo = {
"itemIdx": tempDocItemIdx.itemIdx,
"status": 1
};
this.musicSharedPlay(paramInfo);
//选择完成就跳出循环
return;
}
}*/
}
onJoinChannelHandlerSuccess() {
loger.log(this._session_name + ' 媒体共享加入频道成功');
if (this._apeDelayed) {
setTimeout(() => {
this._emit(MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
}, (GlobalConfig.mcuDelay + GlobalConfig.docDelay) || 12000 + GlobalConfig.docDelay);
} else {
setTimeout(() => {
this._emit(MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
}, GlobalConfig.docDelay);
}
}
//检查媒体文件是否已经存在,如果存在 返回true,否则返回false
checkMusicSharedId(_fileId) {
if (_fileId == null) {
loger.warn('查找媒体文件->失败->参数为null');
return true;
}
//遍历查找
for (let key in this.musicSharedList) {
let item = this.musicSharedList[key];
if (item && item.fileId == _fileId) {
loger.log('查找媒体文件->已经存在->', _fileId);
return true;
}
}
loger.log('查找媒体文件->没有查找到媒体文件->', _fileId);
//储存的数据中没有查找到
return false;
}
///////数据的封包和解包/////////////////////////////////////////
packPdu(_param, _itemIdx) {
loger.log("媒体文件->packPdu");
//验证坐标点集合数组是否合法
if (_param == null || _itemIdx == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
/* optional uint32 item_idx=1;//唯一标识
optional uint32 owner=2;
optional uint32 from=3;
optional string file_type=4;
optional string creat_user_id=5;//创建文件userid
optional string url =6;//文件地址
optional uint32 status=7;//状态0停止 1播放 2暂停
optional string fileId=8;//文件在服务器数据库中的唯一id
optional string file_name=9;//文件的名字
optional uint32 seek=10;//seek*/
//判断type类型,根据type设置不同的参数
let pduDataModel = new pdu['RCMusicSharedSendDataModelPdu'];
pduDataModel.itemIdx = _itemIdx;
pduDataModel.owner = GlobalConfig.nodeId;
pduDataModel.from = GlobalConfig.nodeId;
pduDataModel.fileType = _param.fileType || "";
pduDataModel.creatUserId = _param.creatUserId || "0";
pduDataModel.url = _param.url || ""; //这个地址没用到,数据太长占用资源 暂停使用//"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
pduDataModel.status = _param.status || 0;
pduDataModel.fileId = _param.fileId || ""; //媒体文件在服务器数据库中的唯一id,必须有
pduDataModel.fileName = _param.fileName || "music_" + _itemIdx; //媒体文件的名字
pduDataModel.seek = parseInt(_param.seek) || 1;
pduDataModel.musicVolume = parseInt(_param.musicVolume);
if (!pduDataModel.musicVolume) {
pduDataModel.musicVolume = 60;
}
return pduDataModel;
}
unPackPdu(owner, itemIdx, itemData) {
if (owner == null || itemIdx == null || itemData == null) {
this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
return null;
}
try {
let pduDataModel = pdu['RCMusicSharedSendDataModelPdu'].decode(itemData);
loger.log("媒体文件===>unPackPdu");
return pduDataModel;
} catch (err) {
loger.log("媒体文件===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message);
}
return null;
}
}
MusicSharedApe.prototype.MEDIASHARED_JOIN_CHANNEL_SUCCESS = MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS = 'musicShared_join_channel_success';
export default MusicSharedApe;
... ...
... ... @@ -758,6 +758,20 @@ message RCMediaSharedSendDataModelPdu {
optional uint32 mediaVolume=11;//音量
}
message RCMusicSharedSendDataModelPdu {
optional uint32 item_idx=1;//唯一标识
optional uint32 owner=2;
optional uint32 from=3;
optional string file_type=4;
optional string creat_user_id=5;//创建文件userid
optional string url =6;//文件地址
optional uint32 status=7;//状态0停止 1播放 2暂停
optional string fileId=8;//文件在服务器数据库中的唯一id
optional string file_name=9;//文件的名字
optional uint32 seek=10;//seek
optional uint32 mediaVolume=11;//音量
}
message RCDocBroadcastDataRequestPdu {
optional uint32 from_node_id = 1;//发起人
optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收
... ...