UNPKG

olympus-r-17plugins

Version:

A plugin of Olympus for 17zuoye.

207 lines (206 loc) 7.97 kB
import { core } from "olympus-r/core/Core"; import AudioMessage from "olympus-r/engine/audio/AudioMessage"; import { environment } from "olympus-r/engine/env/Environment"; import { cloneObject } from 'olympus-r/utils/ObjectUtil'; import { isAbsolutePath, trimURL } from "olympus-r/utils/URLUtil"; import { ClientType, Platform } from "../env/Shell17"; import Shell17Mobile from "../env/Shell17Mobile"; /** * @author Raykid * @email initial_r@qq.com * @create date 2017-10-30 * @modify date 2017-10-30 * * 使用一起作业外壳实现IAudio接口的实现类 */ var Audio17MobileImpl = /** @class */ (function () { function Audio17MobileImpl() { this._mute = false; this._playingDict = {}; this._urlMap = {}; var urlMap = this._urlMap; this._shell17 = core.getInject(Shell17Mobile); // 监听全局的那个playAudioProgress回调,IOS在调用playAudioControl接口后不会回调playcallBack(-. -!) core.listen("playAudioProgress", function (url, state, currentTime, duration) { // 派发AudioMessage switch (state) { case "init": // 由于某些版本外壳不会派发init事件,因此将事件移动回play时派发,这里仅留空 break; case "playing": // 派发播放进度事件 core.dispatch(AudioMessage.AUDIO_PLAY_PROGRESS, urlMap[url], currentTime * 1000, duration * 1000); break; case "paused": case "stop": core.dispatch(AudioMessage.AUDIO_PLAY_STOPPED, urlMap[url]); break; case "ended": // 派发播放完毕事件 core.dispatch(AudioMessage.AUDIO_PLAY_ENDED, urlMap[url]); break; default: // 是错误码,派发错误事件 var evt = new ErrorEvent(state); core.dispatch(AudioMessage.AUDIO_ERROR, urlMap[url], evt); break; } }, this); // 监听全局的那个loadAudioProgress回调 core.listen("loadAudioProgress", function (url, state, currentTime, duration) { switch (state) { case "init": // 派发加载开始事件 core.dispatch(AudioMessage.AUDIO_LOAD_STARTED, urlMap[url]); break; case "loading": // 加载中,暂时不做处理 break; case "loaded": // 派发加载完毕事件 core.dispatch(AudioMessage.AUDIO_LOAD_ENDED, urlMap[url]); break; default: // 是错误码,派发错误事件 var evt = new ErrorEvent(state); core.dispatch(AudioMessage.AUDIO_ERROR, urlMap[url], evt); break; } }); } Object.defineProperty(Audio17MobileImpl.prototype, "mute", { /** * 静音状态 * * @type {boolean} * @memberof AudioTagImpl */ get: function () { return this._mute; }, set: function (value) { this._mute = value; // 静音,暂停所有声音 for (var url in this._playingDict) { if (value) { // 静音,暂停音频,不可调用pause方法,因为要保持播放中的音频状态 this._doPause(url); } else { // 非静音,播放音频 var params = this._playingDict[url]; this.play(params); } } }, enumerable: true, configurable: true }); Audio17MobileImpl.prototype.handleUrl = function (url) { if (isAbsolutePath(url)) // 如果是绝对路径,则不变更host和protocol return trimURL(url); else // 如果是相对路径,则添加一个CDN host return environment.toCDNHostURL(url); }; /** * 加载音频 * * @param {string} url 音频URL * @memberof IAudio */ Audio17MobileImpl.prototype.load = function (url) { // 调用加载 this._shell17.callExternal("loadAudio", this.handleUrl(url)); }; /** * 播放音频,如果音频没有加载则先加载再播放 * * @param {AudioPlayParams} params 音频播放参数 * @returns {void} * @memberof IAudio */ Audio17MobileImpl.prototype.play = function (params) { // 记录转换后的URL var toUrl = this.handleUrl(params.url); this._urlMap[toUrl] = params.url; // 两个端的老师端以及IOS的家长端没实现playAudioControl接口,需要判断端来决定使用的接口 if (this._shell17.clientType === ClientType.TEACHER || (this._shell17.clientType === ClientType.PARENT && this._shell17.platform === Platform.IOS17)) { // 使用playAudio接口 this._shell17.callExternal("playAudio", toUrl); } else { // 使用playAudioControl接口(一定要传volume,否则IOS和安卓的表现会不一致,IOS默认1,安卓默认0) this._shell17.callExternal("playAudioControl", JSON.stringify({ url: toUrl, isStopPre: params.stopOthers || false, isLoop: params.loop || false, volume: 1 })); } // 记录正在播放数据 this._playingDict[toUrl] = params; // 派发播放开始事件 core.dispatch(AudioMessage.AUDIO_PLAY_STARTED, params.url); }; Audio17MobileImpl.prototype._doPause = function (url) { var toUrl = this.handleUrl(url); this._shell17.callExternal("pauseAudio", toUrl); // 派发播放停止事件 core.dispatch(AudioMessage.AUDIO_PLAY_STOPPED, url); return toUrl; }; /** * 暂停音频(不会重置进度) * * @param {string} url 音频URL * @memberof IAudio */ Audio17MobileImpl.prototype.pause = function (url) { var toUrl = this._doPause(url); // 移除正在播放数据 delete this._playingDict[toUrl]; }; Audio17MobileImpl.prototype._doStop = function (url) { var toUrl = this.handleUrl(url); this._shell17.callExternal("stopAudio", toUrl); // 派发播放停止事件 core.dispatch(AudioMessage.AUDIO_PLAY_STOPPED, url); return toUrl; }; /** * 停止音频(会重置进度) * * @param {string} url 音频URL * @memberof IAudio */ Audio17MobileImpl.prototype.stop = function (url) { var toUrl = this._doStop(url); // 移除正在播放数据 delete this._playingDict[toUrl]; }; /** * 停止所有音频 * * @memberof IAudio */ Audio17MobileImpl.prototype.stopAll = function () { var temp = cloneObject(this._playingDict); for (var url in temp) { this.stop(url); } }; /** * 跳转音频进度 * * @param {string} url 音频URL * @param {number} time 要跳转到的音频位置,毫秒值 * @memberof IAudio */ Audio17MobileImpl.prototype.seek = function (url, time) { this._shell17.callExternal("seekAudio", this.handleUrl(url), time * 0.001); }; return Audio17MobileImpl; }()); export default Audio17MobileImpl;