AlexWang

音乐接口

@@ -28,6 +28,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil'; @@ -28,6 +28,7 @@ import ArrayBufferUtil from 'libs/ArrayBufferUtil';
28 import Server from "config/Server"; 28 import Server from "config/Server";
29 import MediaModule from 'apes/MediaModule'; 29 import MediaModule from 'apes/MediaModule';
30 import MediaSharedApe from 'apes/MediaSharedApe'; 30 import MediaSharedApe from 'apes/MediaSharedApe';
  31 +import MusicSharedApe from 'apes/MusicSharedApe';
31 import QuestionApe from 'apes/QuestionApe'; 32 import QuestionApe from 'apes/QuestionApe';
32 33
33 import UTF8 from 'utf-8'; 34 import UTF8 from 'utf-8';
@@ -48,6 +49,7 @@ let _whiteboard_ape; @@ -48,6 +49,7 @@ let _whiteboard_ape;
48 let _cursor_ape; 49 let _cursor_ape;
49 let _recordPlayback; 50 let _recordPlayback;
50 let _mediaShareApe; 51 let _mediaShareApe;
  52 +let _musicShareApe;
51 let _questionApe; 53 let _questionApe;
52 54
53 //MCUClient 外部实例化主类 55 //MCUClient 外部实例化主类
@@ -125,6 +127,10 @@ export default class MessageEntrance extends Emiter { @@ -125,6 +127,10 @@ export default class MessageEntrance extends Emiter {
125 _mediaShareApe.on('*', (type, data) => this._emit(type, data)); 127 _mediaShareApe.on('*', (type, data) => this._emit(type, data));
126 _mediaShareApe.on(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS, this.mediaShareApeJoinChannelSuccess.bind(this)); 128 _mediaShareApe.on(MediaSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS, this.mediaShareApeJoinChannelSuccess.bind(this));
127 129
  130 + _musicShareApe = new MusicSharedApe();
  131 + _musicShareApe.on('*', (type, data) => this._emit(type, data));
  132 + _musicShareApe.on(MusicSharedApe.MUSICSHARED_JOIN_CHANNEL_SUCCESS, this.musicShareApeJoinChannelSuccess.bind(this));
  133 +
128 _whiteboard_ape = new WhiteBoardApe(); 134 _whiteboard_ape = new WhiteBoardApe();
129 _whiteboard_ape.on('*', (type, data) => this._emit(type, data)); 135 _whiteboard_ape.on('*', (type, data) => this._emit(type, data));
130 136
@@ -221,6 +227,10 @@ export default class MessageEntrance extends Emiter { @@ -221,6 +227,10 @@ export default class MessageEntrance extends Emiter {
221 this.mediaSharedStop = this._sendMediaSharedStop.bind(this); //停止 227 this.mediaSharedStop = this._sendMediaSharedStop.bind(this); //停止
222 this.mediaSharedUpdate = this._sendMediaSharedUpdate.bind(this); //更新媒体的状态 228 this.mediaSharedUpdate = this._sendMediaSharedUpdate.bind(this); //更新媒体的状态
223 229
  230 + this.musicSharedPlay = this._sendMusicSharedPlay.bind(this); //Music播放
  231 + this.musicSharedStop = this._sendMusicSharedStop.bind(this); //Music停止
  232 + this.musicSharedUpdate = this._sendMusicSharedUpdate.bind(this); //Music更新媒体的状态
  233 +
224 //答题卡 234 //答题卡
225 this.creatQuestion = this._creatQuestion.bind(this); 235 this.creatQuestion = this._creatQuestion.bind(this);
226 this.getQuestion = this._getQuestion.bind(this); 236 this.getQuestion = this._getQuestion.bind(this);
@@ -1233,7 +1243,6 @@ export default class MessageEntrance extends Emiter { @@ -1233,7 +1243,6 @@ export default class MessageEntrance extends Emiter {
1233 } 1243 }
1234 } 1244 }
1235 1245
1236 -  
1237 //获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do 1246 //获取课堂所有参数 api/meeting/detail.do? flash中的接口文件是 getClassParam.do
1238 _sassGetClassParamSuccessHandler(_data) { 1247 _sassGetClassParamSuccessHandler(_data) {
1239 loger.log('获取课堂课堂信息完成.'); 1248 loger.log('获取课堂课堂信息完成.');
@@ -1773,6 +1782,19 @@ export default class MessageEntrance extends Emiter { @@ -1773,6 +1782,19 @@ export default class MessageEntrance extends Emiter {
1773 _mediaShareApe.mediaSharedUpload(_param); 1782 _mediaShareApe.mediaSharedUpload(_param);
1774 } 1783 }
1775 } 1784 }
  1785 +
  1786 + //音乐共享模块的接口
  1787 + //上传
  1788 + _sendMusicSharedUpload(_param) {
  1789 + if (!_mcu.connected) {
  1790 + loger.warn(GlobalConfig.getCurrentStatus());
  1791 + return;
  1792 + }
  1793 + if (_musicShareApe) {
  1794 + _musicShareApe.musicSharedUpload(_param);
  1795 + }
  1796 + }
  1797 +
1776 //Sass删除媒体文件数据 1798 //Sass删除媒体文件数据
1777 _sassDeletMediaShare(_param) { 1799 _sassDeletMediaShare(_param) {
1778 if (!_mcu.connected) { 1800 if (!_mcu.connected) {
@@ -1798,6 +1820,7 @@ export default class MessageEntrance extends Emiter { @@ -1798,6 +1820,7 @@ export default class MessageEntrance extends Emiter {
1798 _sass.sassDeletMediaShare(_param); 1820 _sass.sassDeletMediaShare(_param);
1799 } 1821 }
1800 } 1822 }
  1823 +
1801 //删除 1824 //删除
1802 _sendMediaSharedDelete(_param) { 1825 _sendMediaSharedDelete(_param) {
1803 if (!_mcu.connected) { 1826 if (!_mcu.connected) {
@@ -1808,6 +1831,39 @@ export default class MessageEntrance extends Emiter { @@ -1808,6 +1831,39 @@ export default class MessageEntrance extends Emiter {
1808 _mediaShareApe.mediaSharedDelete(_param); 1831 _mediaShareApe.mediaSharedDelete(_param);
1809 } 1832 }
1810 } 1833 }
  1834 +
  1835 + //音乐更新
  1836 + _sendMusicSharedUpdate(_param) {
  1837 + if (!_mcu.connected) {
  1838 + loger.warn(GlobalConfig.getCurrentStatus());
  1839 + return;
  1840 + }
  1841 + if (_musicShareApe) {
  1842 + _musicShareApe.musicSharedUpdate(_param);
  1843 + }
  1844 + }
  1845 +
  1846 + //音乐播放
  1847 + _sendMusicSharedPlay(_param) {
  1848 + if (!_mcu.connected) {
  1849 + loger.warn(GlobalConfig.getCurrentStatus());
  1850 + return;
  1851 + }
  1852 + if (_musicShareApe) {
  1853 + _musicShareApe.musicSharedPlay(_param);
  1854 + }
  1855 + }
  1856 + //音乐停止
  1857 + _sendMusicSharedStop(_param) {
  1858 + if (!_mcu.connected) {
  1859 + loger.warn(GlobalConfig.getCurrentStatus());
  1860 + return;
  1861 + }
  1862 + if (_musicShareApe) {
  1863 + _musicShareApe.musicSharedStop(_param);
  1864 + }
  1865 + }
  1866 +
1811 //更新媒体文件的状态信息 1867 //更新媒体文件的状态信息
1812 _sendMediaSharedUpdate(_param) { 1868 _sendMediaSharedUpdate(_param) {
1813 if (!_mcu.connected) { 1869 if (!_mcu.connected) {
@@ -1818,6 +1874,7 @@ export default class MessageEntrance extends Emiter { @@ -1818,6 +1874,7 @@ export default class MessageEntrance extends Emiter {
1818 _mediaShareApe.mediaSharedUpdate(_param); 1874 _mediaShareApe.mediaSharedUpdate(_param);
1819 } 1875 }
1820 } 1876 }
  1877 +
1821 //播放 1878 //播放
1822 _sendMediaSharedPlay(_param) { 1879 _sendMediaSharedPlay(_param) {
1823 if (!_mcu.connected) { 1880 if (!_mcu.connected) {
@@ -1829,6 +1886,7 @@ export default class MessageEntrance extends Emiter { @@ -1829,6 +1886,7 @@ export default class MessageEntrance extends Emiter {
1829 } 1886 }
1830 } 1887 }
1831 //停止 1888 //停止
  1889 +
1832 _sendMediaSharedStop(_param) { 1890 _sendMediaSharedStop(_param) {
1833 if (!_mcu.connected) { 1891 if (!_mcu.connected) {
1834 loger.warn(GlobalConfig.getCurrentStatus()); 1892 loger.warn(GlobalConfig.getCurrentStatus());
@@ -1839,6 +1897,31 @@ export default class MessageEntrance extends Emiter { @@ -1839,6 +1897,31 @@ export default class MessageEntrance extends Emiter {
1839 } 1897 }
1840 } 1898 }
1841 1899
  1900 + //音乐共享模块加入频道成功,同步到MCU服务器上的数据
  1901 + musicShareApeJoinChannelSuccess() {
  1902 + loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMusicList.length);
  1903 + console.log("媒体共享模数据->", GlobalConfig.sharedMusicList);
  1904 + //如果是主持人,那么需要判断一下文档模块同步的数据和从sass获取的文档数据是否相同,如果mcu服务器不存在的,需要上传
  1905 + if (GlobalConfig.isHost && GlobalConfig.sharedMusicList.length > 0) {
  1906 + for (let i = 0; i < GlobalConfig.sharedMusicList.length; i++) {
  1907 + let value = GlobalConfig.sharedMusicList[i];
  1908 + if (value) {
  1909 + let paramInfo = {
  1910 + "status": 0,
  1911 + "creatUserId": value.creatUserId,
  1912 + "creatUserName": value.createUserName,
  1913 + "url": value.url,
  1914 + "fileType": value.type,
  1915 + "fileId": "" + value.id,
  1916 + "fileName": value.name,
  1917 + "seek": 0
  1918 + };
  1919 + this._sendMusicSharedUpload(paramInfo);
  1920 + }
  1921 + }
  1922 + }
  1923 + }
  1924 +
1842 //媒体共享模块加入频道成功,同步到MCU服务器上的数据 1925 //媒体共享模块加入频道成功,同步到MCU服务器上的数据
1843 mediaShareApeJoinChannelSuccess() { 1926 mediaShareApeJoinChannelSuccess() {
1844 loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length); 1927 loger.log("媒体共享模块加入频道成功->isHost=", GlobalConfig.isHost, "length=", GlobalConfig.sharedMediaList.length);
@@ -2049,5 +2132,5 @@ export default class MessageEntrance extends Emiter { @@ -2049,5 +2132,5 @@ export default class MessageEntrance extends Emiter {
2049 } 2132 }
2050 } 2133 }
2051 2134
2052 - } 2135 +}
2053 2136
@@ -202,6 +202,15 @@ class GlobalConfig { @@ -202,6 +202,15 @@ class GlobalConfig {
202 return this.sharedMediaList; 202 return this.sharedMediaList;
203 } 203 }
204 204
  205 + //储存已经提前上传的媒体共享文件列表
  206 + static setMusicShareList(_data) {
  207 + if (_data == null) return;
  208 + this.sharedMusicList = _data;
  209 + }
  210 + static getMusicShareList() {
  211 + return this.sharedMusicList;
  212 + }
  213 +
205 //储存录制列表 214 //储存录制列表
206 static setRecordList(_data) { 215 static setRecordList(_data) {
207 if (_data == null) return; 216 if (_data == null) return;
@@ -429,6 +438,7 @@ GlobalConfig.classDetail = {}; //Sass直接返回的当前课堂基本信息 @@ -429,6 +438,7 @@ GlobalConfig.classDetail = {}; //Sass直接返回的当前课堂基本信息
429 438
430 //从Sass获取的 439 //从Sass获取的
431 GlobalConfig.sharedMediaList = []; // 已经提前上传的媒体文件列表,进入课堂后需要自动加载 440 GlobalConfig.sharedMediaList = []; // 已经提前上传的媒体文件列表,进入课堂后需要自动加载
  441 +GlobalConfig.sharedMusicList = []; // 已经提前上传的音乐文件列表,进入课堂后需要自动加载
432 GlobalConfig.docListPrepare = []; // 已经提前上传的文档,进入课堂后需要自动加载 442 GlobalConfig.docListPrepare = []; // 已经提前上传的文档,进入课堂后需要自动加载
433 GlobalConfig.recordList = []; //录制服务器地址集合 443 GlobalConfig.recordList = []; //录制服务器地址集合
434 GlobalConfig.docList = []; //文档服务器地址集合 444 GlobalConfig.docList = []; //文档服务器地址集合
@@ -141,6 +141,7 @@ ApeConsts.SCREENSHARING_SESSION_ID = 20; @@ -141,6 +141,7 @@ ApeConsts.SCREENSHARING_SESSION_ID = 20;
141 ApeConsts.POLL_SESSION_ID = 21; 141 ApeConsts.POLL_SESSION_ID = 21;
142 ApeConsts.QUESTION_SESSION_ID = 22; 142 ApeConsts.QUESTION_SESSION_ID = 22;
143 ApeConsts.CURSOR_SESSION_ID = 23; 143 ApeConsts.CURSOR_SESSION_ID = 23;
  144 +ApeConsts.MUSIC_SESSION_ID = 24;
144 145
145 // defs for common channel id 146 // defs for common channel id
146 ApeConsts.BROADCAST_CHANNEL_ID = 0; 147 ApeConsts.BROADCAST_CHANNEL_ID = 0;
@@ -152,6 +153,7 @@ ApeConsts.DOCSHARING_CHANNEL_ID = ApeConsts.DOCSHARING_SESSION_ID; @@ -152,6 +153,7 @@ ApeConsts.DOCSHARING_CHANNEL_ID = ApeConsts.DOCSHARING_SESSION_ID;
152 ApeConsts.WHITEBOARD_CHANNEL_ID = ApeConsts.WHITEBOARD_SESSION_ID; 153 ApeConsts.WHITEBOARD_CHANNEL_ID = ApeConsts.WHITEBOARD_SESSION_ID;
153 ApeConsts.CURSOR_CHANNEL_ID = ApeConsts.CURSOR_SESSION_ID; 154 ApeConsts.CURSOR_CHANNEL_ID = ApeConsts.CURSOR_SESSION_ID;
154 ApeConsts.MEDIA_CHANNEL_ID = ApeConsts.MEDIA_SESSION_ID; 155 ApeConsts.MEDIA_CHANNEL_ID = ApeConsts.MEDIA_SESSION_ID;
  156 +ApeConsts.MUSIC_CHANNEL_ID = ApeConsts.MUSIC_SESSION_ID;
155 ApeConsts.SCREENSHARING_CHANNEL_ID = ApeConsts.SCREENSHARING_SESSION_ID; 157 ApeConsts.SCREENSHARING_CHANNEL_ID = ApeConsts.SCREENSHARING_SESSION_ID;
156 158
157 ApeConsts.QUESTION_CHANNEL_ID = ApeConsts.QUESTION_SESSION_ID; 159 ApeConsts.QUESTION_CHANNEL_ID = ApeConsts.QUESTION_SESSION_ID;
@@ -167,6 +169,7 @@ ApeConsts.DOCSHARING_SESSION_NAME = "doc sharing app"; @@ -167,6 +169,7 @@ ApeConsts.DOCSHARING_SESSION_NAME = "doc sharing app";
167 ApeConsts.WHITEBOARD_SESSION_NAME = "whiteboard app"; 169 ApeConsts.WHITEBOARD_SESSION_NAME = "whiteboard app";
168 ApeConsts.CURSOR_SESSION_NAME = "cursor app"; 170 ApeConsts.CURSOR_SESSION_NAME = "cursor app";
169 ApeConsts.MEDIA_SESSION_NAME = "media sharing app"; 171 ApeConsts.MEDIA_SESSION_NAME = "media sharing app";
  172 +ApeConsts.MUSIC_SESSION_NAME = "music sharing app";
170 ApeConsts.SCREENSHARING_SESSION_NAME = "screen sharing app"; 173 ApeConsts.SCREENSHARING_SESSION_NAME = "screen sharing app";
171 ApeConsts.QUESTION_SESSION_NAME = "question app"; 174 ApeConsts.QUESTION_SESSION_NAME = "question app";
172 175
@@ -181,6 +184,7 @@ ApeConsts.DOCSHARING_SESSION_TAG = "doc-tag"; @@ -181,6 +184,7 @@ ApeConsts.DOCSHARING_SESSION_TAG = "doc-tag";
181 ApeConsts.WHITEBOARD_SESSION_TAG = "wbd-tag"; 184 ApeConsts.WHITEBOARD_SESSION_TAG = "wbd-tag";
182 ApeConsts.CURSOR_SESSION_TAG = "cursor-tag"; 185 ApeConsts.CURSOR_SESSION_TAG = "cursor-tag";
183 ApeConsts.MEDIA_SESSION_TAG = "med-tag"; 186 ApeConsts.MEDIA_SESSION_TAG = "med-tag";
  187 +ApeConsts.MUSIC_SESSION_TAG = "mis-tag";
184 ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag"; 188 ApeConsts.SCREENSHARING_SESSION_TAG = "scr-tag";
185 ApeConsts.QUESTION_SESSION_TAG = "qst-tag"; 189 ApeConsts.QUESTION_SESSION_TAG = "qst-tag";
186 190
@@ -237,6 +241,11 @@ ApeConsts.MEDIA_OBJ_TABLE_ID = ((ApeConsts.MEDIA_SESSION_ID << 16) + 1); @@ -237,6 +241,11 @@ ApeConsts.MEDIA_OBJ_TABLE_ID = ((ApeConsts.MEDIA_SESSION_ID << 16) + 1);
237 ApeConsts.MEDIA_OBJ_TABLE_NAME = "med list"; 241 ApeConsts.MEDIA_OBJ_TABLE_NAME = "med list";
238 ApeConsts.MEDIA_OBJ_TABLE_TAG = "med list tag"; 242 ApeConsts.MEDIA_OBJ_TABLE_TAG = "med list tag";
239 243
  244 +// music sharing objects
  245 +ApeConsts.MUSIC_OBJ_TABLE_ID = ((ApeConsts.MUSIC_SESSION_ID << 16) + 1);
  246 +ApeConsts.MUSIC_OBJ_TABLE_NAME = "mis list";
  247 +ApeConsts.MUSIC_OBJ_TABLE_TAG = "mis list tag";
  248 +
240 // chat sharing objects 249 // chat sharing objects
241 ApeConsts.CHAT_OBJ_TABLE_ID = ((ApeConsts.CHAT_SESSION_ID << 16) + 1); 250 ApeConsts.CHAT_OBJ_TABLE_ID = ((ApeConsts.CHAT_SESSION_ID << 16) + 1);
242 ApeConsts.CHAT_OBJ_TABLE_NAME = "chat list"; 251 ApeConsts.CHAT_OBJ_TABLE_NAME = "chat list";
@@ -470,6 +470,7 @@ class ConferApe extends Ape { @@ -470,6 +470,7 @@ class ConferApe extends Ape {
470 } 470 }
471 471
472 } 472 }
  473 +
473 //更新课堂信息 474 //更新课堂信息
474 sendUpdaterClassStatusInfo(_param) { 475 sendUpdaterClassStatusInfo(_param) {
475 //{"actionType": 1,isStopAllPublishMedia:false} //actionType课堂状态 isStopAllPublishMedia是否停止当前的所有推流 476 //{"actionType": 1,isStopAllPublishMedia:false} //actionType课堂状态 isStopAllPublishMedia是否停止当前的所有推流
  1 +// //////////////////////////////////////////////////////////////////////////////
  2 +//
  3 +// 媒体共享模块
  4 +// //////////////////////////////////////////////////////////////////////////////
  5 +
  6 +import Ape from './Ape';
  7 +import ApeConsts from './ApeConsts';
  8 +import pdu from 'pdus';
  9 +import Loger from 'Loger';
  10 +import MessageTypes from 'MessageTypes';
  11 +import GlobalConfig from 'GlobalConfig';
  12 +import EngineUtils from 'EngineUtils';
  13 +
  14 +let loger = Loger.getLoger('MusicSharedApe');
  15 +
  16 +class MusicSharedApe extends Ape {
  17 + constructor() {
  18 + super(
  19 + ApeConsts.MUSIC_SESSION_ID,
  20 + ApeConsts.MUSIC_SESSION_NAME,
  21 + ApeConsts.MUSIC_SESSION_TAG
  22 + );
  23 +
  24 + this.musicSharedList = {}; //记录媒体数据
  25 +
  26 + // Ape Models
  27 + this.registerKey(this._session_id, this._session_name, this._session_tag, new ArrayBuffer);
  28 + 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);
  29 + }
  30 +
  31 + /////////////发送数据操作//////////////////////////////////////////////////////
  32 + //上传媒体文件
  33 + musicSharedUpload(paramInfo) {
  34 + if (paramInfo == null || EngineUtils.isEmptyObject(paramInfo)) {
  35 + loger.warn('上传媒体文件->失败->参数错误->', paramInfo);
  36 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  37 + return;
  38 + }
  39 + //判断媒体文件是否已经存在,每个媒体文件都有唯一的fileId,如果已经同步的媒体文件中存在相同的fileId就不需要再同步
  40 + if (this.checkMusicSharedId(paramInfo.fileId)) {
  41 + //媒体文件已经存在相同的fileId,不需要同步上传
  42 + loger.warn('上传媒体文件->失败->媒体文件档的fileId无效或已经存在相同的fileId不需要上传');
  43 + return;
  44 + }
  45 +
  46 + let itemIdx = EngineUtils.creatSoleNumberFromTimestamp(); //
  47 + let pduDataModel = this.packPdu(paramInfo, itemIdx);
  48 + if (pduDataModel == null) {
  49 + loger.log('上传媒体文件->失败->数据无效');
  50 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  51 + return;
  52 + }
  53 +
  54 + let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
  55 + tableItemPdu.itemIdx = itemIdx; //直接用时间戳作为id
  56 + tableItemPdu.registerObjId = ApeConsts.MUSIC_OBJ_TABLE_ID;
  57 + tableItemPdu.owner = 0; //收到flash的是这个值,不清楚先写固定
  58 + tableItemPdu.itemData = pduDataModel.toArrayBuffer();
  59 +
  60 + //insert
  61 + let tableInsertItemPdu = new pdu['RCRegistryTableInsertItemPdu'];
  62 + //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
  63 + //repeated RCRegistryTableItemPdu items = 2;
  64 + tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_INSERT_PDU; //
  65 + tableInsertItemPdu.items.push(tableItemPdu);
  66 +
  67 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  68 + updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
  69 + updateObjPdu.subType = tableInsertItemPdu.type;
  70 + updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
  71 +
  72 + //同步
  73 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  74 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  75 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  76 +
  77 + let adapterPdu = new pdu['RCAdapterPdu'];
  78 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  79 + adapterPdu.item.push(adapterItemPdu);
  80 +
  81 + loger.log("上传媒体文件->发送->itemIdx=" + tableItemPdu.itemIdx);
  82 + this.sendUniform(adapterPdu, true);
  83 + }
  84 +
  85 + //删除媒体文件
  86 + musicSharedDelete(paramInfo) {
  87 + let tableDeleteItemPdu = new pdu['RCRegistryTableDeleteItemPdu'];
  88 + tableDeleteItemPdu.type = pdu.RCPDU_REG_TABLE_DELETE_PDU; //
  89 + tableDeleteItemPdu.itemIdx = parseInt(paramInfo.itemIdx); //这里需要设置要删除的数据的itemIdx,每条数据的这个id都不一样
  90 +
  91 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  92 + updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
  93 + updateObjPdu.subType = tableDeleteItemPdu.type;
  94 + updateObjPdu.userData = tableDeleteItemPdu.toArrayBuffer();
  95 +
  96 + //同步
  97 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  98 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  99 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  100 +
  101 + let adapterPdu = new pdu['RCAdapterPdu'];
  102 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  103 + adapterPdu.item.push(adapterItemPdu);
  104 +
  105 + loger.log("媒体文件发送删除数据=============>" + tableDeleteItemPdu.itemIdx);
  106 + this.sendUniform(adapterPdu, true);
  107 + }
  108 +
  109 + //更新
  110 + updaterMusicShared(_pduDataModel, _itemIdx) {
  111 + //验证坐标点集合数组是否合法
  112 + if (_pduDataModel == null || _itemIdx == null) {
  113 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  114 + return null;
  115 + }
  116 + loger.log("媒体文件->更新 ", _pduDataModel);
  117 +
  118 + let pduDataModel = this.packPdu(_pduDataModel, _itemIdx);
  119 + let tableItemPdu = new pdu['RCRegistryTableItemPdu'];
  120 + tableItemPdu.itemIdx = _itemIdx; //直接用时间戳作为id
  121 + tableItemPdu.owner = 0; //收到flash的是这个值,不清楚先写固定
  122 + tableItemPdu.itemData = pduDataModel.toArrayBuffer();
  123 +
  124 + //insert
  125 + let tableInsertItemPdu = new pdu['RCRegistryTableUpdateItemPdu'];
  126 + //optional RCPduType_E type = 1 [default = RCPDU_REG_TABLE_UPDATE_PDU];
  127 + //repeated RCRegistryTableItemPdu items = 2;
  128 + tableInsertItemPdu.type = pdu.RCPDU_REG_TABLE_UPDATE_PDU; //
  129 + tableInsertItemPdu.items.push(tableItemPdu);
  130 +
  131 + let updateObjPdu = new pdu['RCRegistryUpdateObjPdu'];
  132 + updateObjPdu.objId = ApeConsts.MUSIC_OBJ_TABLE_ID;
  133 + updateObjPdu.subType = tableInsertItemPdu.type;
  134 + updateObjPdu.userData = tableInsertItemPdu.toArrayBuffer();
  135 +
  136 + //同步
  137 + let adapterItemPdu = new pdu['RCAdapterItemPdu'];
  138 + adapterItemPdu.type = pdu.RCPDU_REG_UPDATE_OBJ;
  139 + adapterItemPdu.itemData = updateObjPdu.toArrayBuffer();
  140 +
  141 + let adapterPdu = new pdu['RCAdapterPdu'];
  142 + adapterPdu.type = pdu.RCPDU_REG_ADAPTER;
  143 + adapterPdu.item.push(adapterItemPdu);
  144 +
  145 + loger.log("发送更新媒体文件.itemIdx=" + tableItemPdu.itemIdx);
  146 + this.sendUniform(adapterPdu, true);
  147 + }
  148 +
  149 + //组织完整的媒体文件信息,包含上传时的信息和转换后的完整地址信息
  150 + _musicSharedPackFullInfo(_itemDataInfo) {
  151 + let itemDataInfo = _itemDataInfo;
  152 + if (!itemDataInfo.seek) {
  153 + itemDataInfo.seek = 1;
  154 + }
  155 + loger.log('musicPackFullInfo->', itemDataInfo);
  156 + return itemDataInfo;
  157 + }
  158 +
  159 + //更新媒体文件模块的录制信息,每次开启录制的时候需要把当前媒体文件的信息更新一次
  160 + updaterRecordApeStatus(_param) {
  161 + loger.warn("录制状态发送改变->更新当前的媒体文件数据->fileId:", GlobalConfig.activeMusicId, 'page:', GlobalConfig.activeMusicSeek);
  162 + this.musicSharedSeek({
  163 + "itemIdx": GlobalConfig.activeMusicId,
  164 + "seek": GlobalConfig.activeMusicSeek
  165 + });
  166 + }
  167 + //清除当前媒体文件模块的数据
  168 + clearData() {
  169 + loger.log("clearData->")
  170 + this.musicSharedList = {};
  171 + GlobalConfig.activeMusicId = 0;
  172 + GlobalConfig.activeMusicSeek = 1;
  173 +
  174 + }
  175 + //更新媒体文件(播放,暂停,停止,seek)
  176 + musicSharedUpdate(_param) {
  177 + if (_param == null || _param.itemIdx == null) {
  178 + loger.warn('媒体文件更新失败->参数错误', _param);
  179 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  180 + return;
  181 + }
  182 +
  183 + //获取已经存在的数据
  184 + let pduDataModel = this.musicSharedList[_param.itemIdx];
  185 + if (pduDataModel == null) {
  186 + loger.warn('更新媒体文件->媒体文件不存在', _param);
  187 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  188 + return;
  189 + }
  190 +
  191 + //更新当前选择的媒体文件数据的字段
  192 + pduDataModel.status = parseInt(_param.status) || 0; //默认是0
  193 + pduDataModel.seek = parseInt(_param.seek) || 1;
  194 + pduDataModel.musicVolume = parseInt(_param.musicVolume) || 0;
  195 + //更新当前选择的媒体文件
  196 + this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
  197 + }
  198 +
  199 + //播放媒体文件
  200 + musicSharedPlay(paramInfo) {
  201 + loger.log('切换媒体文件->', paramInfo);
  202 + if (GlobalConfig.isRecordPlayBack) {
  203 + loger.warn('录制回放状态不允许切换媒体文件');
  204 + return;
  205 + }
  206 +
  207 + if (paramInfo == null || paramInfo.itemIdx == null) {
  208 + loger.warn('切换媒体文件失败,参数错误', paramInfo);
  209 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  210 + return;
  211 + }
  212 +
  213 + /* if (paramInfo.itemIdx == GlobalConfig.activeMusicId && GlobalConfig.activeMusicId != 0) {
  214 + loger.warn('媒体文件已经显示', paramInfo.itemIdx, GlobalConfig.activeMusicId);
  215 + return;
  216 + }*/
  217 +
  218 + //更新切换之前的媒体文件的数据,要显示当前切换的媒体文件,上一个媒体文件需要隐藏
  219 + let oldPduDataModel;
  220 + if (GlobalConfig.activeMusicId != 0) {
  221 + oldPduDataModel = this.musicSharedList[GlobalConfig.activeMusicId];
  222 + if (oldPduDataModel) {
  223 + oldPduDataModel.status = 0; //停止状态
  224 + //oldPduDataModel.seek=0;
  225 + }
  226 + }
  227 +
  228 + //获取已经存在的数据
  229 + let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
  230 + if (pduDataModel == null) {
  231 + loger.warn('切换媒体文件失败,媒体文件不存在', paramInfo);
  232 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  233 + return;
  234 + }
  235 +
  236 + //更新当前选择的媒体文件数据的字段
  237 + pduDataModel.status = paramInfo.status || 0; //默认是0
  238 + pduDataModel.seek = paramInfo.seek || 1;
  239 + pduDataModel.musicVolume = parseInt(paramInfo.musicVolume) || 0;
  240 + //loger.log('切换媒体文件,当前媒体文件和上一个显示的媒体文件都需要更新状态');
  241 + loger.log({ "oldDoc": oldPduDataModel, "nowDoc": pduDataModel });
  242 + //更新当前选择的媒体文件
  243 + this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
  244 +
  245 + //更新上一个媒体文件 隐藏
  246 + if (oldPduDataModel && oldPduDataModel.itemIdx != pduDataModel.itemIdx) {
  247 + this.updaterMusicShared(oldPduDataModel, oldPduDataModel.itemIdx);
  248 + }
  249 + }
  250 +
  251 + //停止媒体文件
  252 + musicSharedStop(paramInfo) {
  253 + loger.log('停止媒体文件->', paramInfo);
  254 + if (GlobalConfig.isRecordPlayBack) {
  255 + loger.warn('录制回放状态不允许停止媒体文件');
  256 + return;
  257 + }
  258 +
  259 + if (paramInfo == null || paramInfo.itemIdx == null) {
  260 + loger.warn('停止媒体文件,参数错误', paramInfo);
  261 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  262 + return;
  263 + }
  264 +
  265 + //获取已经存在的数据
  266 + let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
  267 + if (pduDataModel == null) {
  268 + loger.warn('停止媒体文件,媒体文件不存在', paramInfo);
  269 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  270 + return;
  271 + }
  272 +
  273 + //更新当前选择的媒体文件数据的字段
  274 + pduDataModel.status = 0; //默认是0
  275 + pduDataModel.seek = 0;
  276 + pduDataModel.musicVolume = 60;
  277 + //更新当前选择的媒体文件
  278 + this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
  279 + }
  280 +
  281 + //暂停媒体文件
  282 + musicSharedPause(paramInfo) {
  283 + loger.log('暂停媒体文件->', paramInfo);
  284 + if (GlobalConfig.isRecordPlayBack) {
  285 + loger.warn('录制回放-》暂停媒体文件');
  286 + return;
  287 + }
  288 +
  289 + if (paramInfo == null || paramInfo.itemIdx == null) {
  290 + loger.warn('暂停媒体文件,参数错误', paramInfo);
  291 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  292 + return;
  293 + }
  294 +
  295 + //获取已经存在的数据
  296 + let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
  297 + if (pduDataModel == null) {
  298 + loger.warn('暂停媒体文件,媒体文件不存在', paramInfo);
  299 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  300 + return;
  301 + }
  302 +
  303 + //更新当前选择的媒体文件数据的字段
  304 + pduDataModel.status = 2; //默认是0
  305 + //更新当前选择的媒体文件
  306 + this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
  307 + }
  308 +
  309 + //媒体文件SEEK
  310 + musicSharedSeek(paramInfo) {
  311 + loger.log('媒体文件SEEK->', paramInfo);
  312 + //获取已经存在的数据
  313 + let pduDataModel = this.musicSharedList[paramInfo.itemIdx];
  314 + if (pduDataModel == null) {
  315 + loger.log('媒体文件SEEK->媒体文件不存在', paramInfo);
  316 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  317 + return;
  318 + }
  319 + //更新数据的字段
  320 + pduDataModel.seek = parseInt(paramInfo.seek) || 1;
  321 + if (pduDataModel.seek < 1) {
  322 + pduDataModel.seek = 1; //默认值最小是1
  323 + }
  324 + this.updaterMusicShared(pduDataModel, pduDataModel.itemIdx);
  325 + }
  326 +
  327 + /////收到消息处理/////////////////////////////////////////////////////////////////////////////////
  328 + tableInsertHandler(owner, itemIdx, itemData) {
  329 +
  330 + }
  331 +
  332 + //添加媒体文件
  333 + tableInsertApeHandler(_tableUpdateItems, _seekTime) {
  334 + let tableInsertItems = _tableUpdateItems;
  335 + let tableInsertItemsLen = tableInsertItems.length;
  336 + loger.log('添加媒体文件->_seekTime:' + _seekTime, "activeMusicId->", GlobalConfig.activeMusicId, "tableUpdateItemsLen->", tableInsertItemsLen);
  337 + for (let i = 0; i < tableInsertItemsLen; ++i) {
  338 + let insertItem = tableInsertItems[i];
  339 + //this.tableInsertHandler(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
  340 + let itemDataInfo = this.unPackPdu(insertItem.owner, insertItem.itemIdx, insertItem.itemData);
  341 + if (itemDataInfo) {
  342 + itemDataInfo.seek = itemDataInfo.seek + parseInt(_seekTime); //seek是媒体文件自己的,_seekTime是录制回放时进度条换算的
  343 + this.musicSharedList[insertItem.itemIdx] = itemDataInfo;
  344 + if (itemDataInfo.status == 1) {
  345 + GlobalConfig.activeMusicId = itemDataInfo.itemIdx; //当前激活的媒体文件ID
  346 + GlobalConfig.activeMusicSeek = itemDataInfo.seek;
  347 + loger.log('添加媒体文件->设置当前激活的媒体文件id');
  348 + }
  349 + let getMusicPackFullInfo = this._musicSharedPackFullInfo(itemDataInfo);
  350 + this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
  351 + }
  352 + }
  353 + //媒体文件数据更新完毕,如果当前没有显示的媒体文件,默认选择一个显示
  354 + this._showDefaultMeida();
  355 + }
  356 + tableDeleteHandler(object_id, tableDeleteData) {
  357 + loger.log('删除媒体文件数据->', object_id, tableDeleteData); //["tableDeleteHandler",1179649,{"type":231,"itemIdx":[1486301768]}]
  358 + if (tableDeleteData && tableDeleteData.itemIdx) {
  359 + let len = tableDeleteData.itemIdx.length;
  360 + let itemIdxs = tableDeleteData.itemIdx;
  361 + for (let i = 0; i < len; i++) {
  362 + if (this.musicSharedList[itemIdxs[i]]) {
  363 + loger.log("删除媒体文件数据:", itemIdxs[i]);
  364 + let itemDataInfo = this.musicSharedList[itemIdxs[i]];
  365 + if (itemDataInfo && itemDataInfo.status == 1) {
  366 + GlobalConfig.activeMusicId = 0; //当前激活的媒体文件ID
  367 + GlobalConfig.activeMusicSeek = 1; //当前激活的媒体文件的当前页
  368 + loger.log('删除媒体文件数据->清除当前显示的媒体文件');
  369 + }
  370 + this._emit(MessageTypes.MEDIA_SHARED_DELETE, { "itemIdx": itemIdxs[i] });
  371 + delete this.musicSharedList[itemIdxs[i]];
  372 + }
  373 + }
  374 + }
  375 + }
  376 +
  377 + tableUpdateHandler(owner, itemIdx, itemData) {
  378 +
  379 + }
  380 +
  381 + tableUpdateApeHandler(_tableUpdateItems, _seekTime) {
  382 + let tableUpdateItemsLen = _tableUpdateItems.length;
  383 + loger.log('更新媒体文件->_seekTime:' + _seekTime, "activeDocId->", GlobalConfig.activeMusicId, "更新的数量->", tableUpdateItemsLen);
  384 + for (let i = 0; i < tableUpdateItemsLen; ++i) {
  385 + let tableItem = _tableUpdateItems[i];
  386 + let itemDataInfo = this.unPackPdu(tableItem.owner, tableItem.itemIdx, tableItem.itemData);
  387 + if (itemDataInfo != null) {
  388 + itemDataInfo.seek = itemDataInfo.seek + parseInt(_seekTime);
  389 + this.musicSharedList[tableItem.itemIdx] = itemDataInfo;
  390 + if (itemDataInfo && itemDataInfo.status == 1) {
  391 + GlobalConfig.activeMusicId = itemDataInfo.itemIdx; //当前激活的媒体文件ID
  392 + GlobalConfig.activeMusicSeek = itemDataInfo.seek;
  393 + loger.log('更新媒体文件->设置当前激活的媒体文件id->', GlobalConfig.activeMusicId, "curPageNum->", GlobalConfig.activeMusicSeek);
  394 + }
  395 + let getMusicPackFullInfo = this._musicSharedPackFullInfo(itemDataInfo);
  396 + this._emit(MessageTypes.MEDIA_SHARED_UPDATE, getMusicPackFullInfo);
  397 + } else {
  398 + loger.log('更新媒体文件-> 数据无效--> itemIdx', itemIdx);
  399 + }
  400 + }
  401 + this._showDefaultMeida();
  402 + }
  403 +
  404 + //果当前没有显示的媒体文件,默认选择一个显示媒体文件
  405 + _showDefaultMeida() {
  406 + //显示默认媒体文件条件->1.非录制回放状态下 2.只有host有权限操作 3.当前激活的媒体文件id不为0
  407 + if (GlobalConfig.isRecordPlayBack || !GlobalConfig.isHost || GlobalConfig.activeMusicId > 0) {
  408 + return;
  409 + }
  410 + /*
  411 + let tempDocItemIdx;//临时记录媒体文件数据,用于显示默认媒体文件
  412 + for (let key in this.musicSharedList) {
  413 + tempDocItemIdx= this.musicSharedList[key];
  414 + if (tempDocItemIdx) {
  415 + loger.log("选择一个媒体文件作为默认媒体文件显示->", tempDocItemIdx);
  416 + let paramInfo = {
  417 + "itemIdx": tempDocItemIdx.itemIdx,
  418 + "status": 1
  419 + };
  420 + this.musicSharedPlay(paramInfo);
  421 + //选择完成就跳出循环
  422 + return;
  423 + }
  424 + }*/
  425 + }
  426 +
  427 + onJoinChannelHandlerSuccess() {
  428 + loger.log(this._session_name + ' 媒体共享加入频道成功');
  429 + if (this._apeDelayed) {
  430 + setTimeout(() => {
  431 + this._emit(MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
  432 + }, (GlobalConfig.mcuDelay + GlobalConfig.docDelay) || 12000 + GlobalConfig.docDelay);
  433 + } else {
  434 + setTimeout(() => {
  435 + this._emit(MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS);
  436 + }, GlobalConfig.docDelay);
  437 + }
  438 + }
  439 +
  440 + //检查媒体文件是否已经存在,如果存在 返回true,否则返回false
  441 + checkMusicSharedId(_fileId) {
  442 + if (_fileId == null) {
  443 + loger.warn('查找媒体文件->失败->参数为null');
  444 + return true;
  445 + }
  446 + //遍历查找
  447 + for (let key in this.musicSharedList) {
  448 + let item = this.musicSharedList[key];
  449 + if (item && item.fileId == _fileId) {
  450 + loger.log('查找媒体文件->已经存在->', _fileId);
  451 + return true;
  452 + }
  453 + }
  454 + loger.log('查找媒体文件->没有查找到媒体文件->', _fileId);
  455 + //储存的数据中没有查找到
  456 + return false;
  457 + }
  458 +
  459 + ///////数据的封包和解包/////////////////////////////////////////
  460 + packPdu(_param, _itemIdx) {
  461 + loger.log("媒体文件->packPdu");
  462 + //验证坐标点集合数组是否合法
  463 + if (_param == null || _itemIdx == null) {
  464 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  465 + return null;
  466 + }
  467 + /* optional uint32 item_idx=1;//唯一标识
  468 + optional uint32 owner=2;
  469 + optional uint32 from=3;
  470 + optional string file_type=4;
  471 + optional string creat_user_id=5;//创建文件userid
  472 + optional string url =6;//文件地址
  473 + optional uint32 status=7;//状态0停止 1播放 2暂停
  474 + optional string fileId=8;//文件在服务器数据库中的唯一id
  475 + optional string file_name=9;//文件的名字
  476 + optional uint32 seek=10;//seek*/
  477 +
  478 + //判断type类型,根据type设置不同的参数
  479 + let pduDataModel = new pdu['RCMusicSharedSendDataModelPdu'];
  480 + pduDataModel.itemIdx = _itemIdx;
  481 + pduDataModel.owner = GlobalConfig.nodeId;
  482 + pduDataModel.from = GlobalConfig.nodeId;
  483 + pduDataModel.fileType = _param.fileType || "";
  484 + pduDataModel.creatUserId = _param.creatUserId || "0";
  485 + pduDataModel.url = _param.url || ""; //这个地址没用到,数据太长占用资源 暂停使用//"http://101.200.150.192/DocSharing/data/h5test/20170206-171100025/7e9c4178cac1133e0dd9d5b583439122.jpg";
  486 + pduDataModel.status = _param.status || 0;
  487 + pduDataModel.fileId = _param.fileId || ""; //媒体文件在服务器数据库中的唯一id,必须有
  488 + pduDataModel.fileName = _param.fileName || "music_" + _itemIdx; //媒体文件的名字
  489 + pduDataModel.seek = parseInt(_param.seek) || 1;
  490 + pduDataModel.musicVolume = parseInt(_param.musicVolume);
  491 + if (!pduDataModel.musicVolume) {
  492 + pduDataModel.musicVolume = 60;
  493 + }
  494 + return pduDataModel;
  495 + }
  496 +
  497 + unPackPdu(owner, itemIdx, itemData) {
  498 + if (owner == null || itemIdx == null || itemData == null) {
  499 + this._emit(MessageTypes.MCU_ERROR, MessageTypes.ERR_APE_INTERFACE_PARAM_WRONG);
  500 + return null;
  501 + }
  502 + try {
  503 + let pduDataModel = pdu['RCMusicSharedSendDataModelPdu'].decode(itemData);
  504 + loger.log("媒体文件===>unPackPdu");
  505 + return pduDataModel;
  506 + } catch (err) {
  507 + loger.log("媒体文件===>unPackPdu->Pdu解析错误->itemIdx=" + itemIdx + "->err:" + err.message);
  508 + }
  509 + return null;
  510 + }
  511 +
  512 +}
  513 +MusicSharedApe.prototype.MEDIASHARED_JOIN_CHANNEL_SUCCESS = MusicSharedApe.MEDIASHARED_JOIN_CHANNEL_SUCCESS = 'musicShared_join_channel_success';
  514 +export default MusicSharedApe;
  515 +
@@ -758,6 +758,20 @@ message RCMediaSharedSendDataModelPdu { @@ -758,6 +758,20 @@ message RCMediaSharedSendDataModelPdu {
758 optional uint32 mediaVolume=11;//音量 758 optional uint32 mediaVolume=11;//音量
759 } 759 }
760 760
  761 +message RCMusicSharedSendDataModelPdu {
  762 + optional uint32 item_idx=1;//唯一标识
  763 + optional uint32 owner=2;
  764 + optional uint32 from=3;
  765 + optional string file_type=4;
  766 + optional string creat_user_id=5;//创建文件userid
  767 + optional string url =6;//文件地址
  768 + optional uint32 status=7;//状态0停止 1播放 2暂停
  769 + optional string fileId=8;//文件在服务器数据库中的唯一id
  770 + optional string file_name=9;//文件的名字
  771 + optional uint32 seek=10;//seek
  772 + optional uint32 mediaVolume=11;//音量
  773 +}
  774 +
761 message RCDocBroadcastDataRequestPdu { 775 message RCDocBroadcastDataRequestPdu {
762 optional uint32 from_node_id = 1;//发起人 776 optional uint32 from_node_id = 1;//发起人
763 optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收 777 optional uint32 to_node_id = 2;//接收人,如果是0就是所有人都接收