olympus-r-17plugins
Version:
A plugin of Olympus for 17zuoye.
207 lines (206 loc) • 7.97 kB
JavaScript
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;