olympus-r
Version:
一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:
296 lines (295 loc) • 10.1 kB
JavaScript
import * as tslib_1 from "tslib";
import { core } from "../../core/Core";
import { Injectable } from "../../core/injector/Injector";
import Dictionary from '../../utils/Dictionary';
import Shell from "../env/Shell";
import EngineMessage from "../message/EngineMessage";
import AudioContextImpl from "./AudioContextImpl";
import AudioMessage from './AudioMessage';
import AudioTagImpl from "./AudioTagImpl";
/**
* @author Raykid
* @email initial_r@qq.com
* @create date 2017-10-30
* @modify date 2017-10-30
*
* 音频管理器,音频接口被强行分为两部分:Sound和Music。
* Sound:使用Audio标签播放,可以跨域播放但可能会被某些浏览器限制,必须在点击事件处理函数中播放
* Music:使用AudioContext播放,可以一定程度上越过点击事件检查,但无法跨域播放,适合播放背景音乐
*/
var AudioManager = /** @class */ (function () {
function AudioManager() {
var _this = this;
this._loadTupleDict = {};
this._playTupleDict = new Dictionary();
this._soundImpl = new AudioTagImpl();
// 为WebAudio做兼容处理
window["AudioContext"] = window["AudioContext"] || window["webkitAudioContext"] || window["mozAudioContext"] || window["msAudioContext"];
// 由于IE可能不支持AudioContext,因此如果是IE则要改用Audio标签实现
this._musicImpl = (window["AudioContext"] ? new AudioContextImpl() : this._soundImpl);
core.listen(EngineMessage.INITIALIZED, function () {
// 读取持久化记录
var shell = core.getInject(Shell);
_this.muteSound = (shell.localStorageGet(AudioManager_1.STORAGE_KEY_MUTE_SOUND) === "true");
_this.muteMusic = (shell.localStorageGet(AudioManager_1.STORAGE_KEY_MUTE_MUSIC) === "true");
});
core.listen(AudioMessage.AUDIO_LOAD_ENDED, function (url) {
var loadTuple = _this._loadTupleDict[url];
if (loadTuple) {
delete _this._loadTupleDict[url];
loadTuple[1]();
}
});
var playEndHandler = function (url, playParams) {
var playTuple = _this._playTupleDict.get(playParams);
if (playTuple) {
_this._playTupleDict.delete(playParams);
playTuple[1]();
}
};
core.listen(AudioMessage.AUDIO_PLAY_STOPPED, playEndHandler);
core.listen(AudioMessage.AUDIO_PLAY_ENDED, playEndHandler);
}
AudioManager_1 = AudioManager;
/**
* 注册Sound音频实现对象
*
* @param {IAudio} soundImpl Sound音频实现对象
* @memberof AudioManager
*/
AudioManager.prototype.registerSoundImpl = function (soundImpl) {
if (this._soundImpl)
this._soundImpl.dispose();
this._soundImpl = soundImpl;
};
Object.defineProperty(AudioManager.prototype, "muteSound", {
/**
* 获取或设置Sound类型音频静音属性
*
* @type {boolean}
* @memberof AudioManager
*/
get: function () {
return this._soundImpl.mute;
},
set: function (value) {
if (value === this._soundImpl.mute)
return;
this._soundImpl.mute = value;
// 持久化
var shell = core.getInject(Shell);
shell.localStorageSet(AudioManager_1.STORAGE_KEY_MUTE_SOUND, value + "");
},
enumerable: true,
configurable: true
});
/**
* 加载Sound音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.loadSound = function (url) {
var _this = this;
var promise = new Promise(function (resolve, reject) {
var tuple = _this._loadTupleDict[url];
if (tuple) {
tuple[0].then(resolve).catch(reject);
}
else {
_this._loadTupleDict[url] = [promise, resolve, reject];
}
_this._soundImpl.load(url);
});
return promise;
};
/**
* 播放Sound音频,如果没有加载则会先行加载
*
* @param {AudioPlayParams} params 音频播放参数
* @memberof AudioManager
*/
AudioManager.prototype.playSound = function (params) {
var _this = this;
var promise = new Promise(function (resolve, reject) {
// 判断静音
if (_this.muteSound) {
resolve();
return;
}
// 停止其他音频
if (params.stopOthers) {
_this.stopAllSound();
_this.stopAllMusics();
}
var tuple = _this._playTupleDict.get(params);
if (!tuple) {
_this._playTupleDict.set(params, [promise, resolve, reject]);
_this._soundImpl.play(params);
}
});
return promise;
};
/**
* 跳转Sound音频进度
*
* @param {string} url 音频URL
* @param {number} time 要跳转到的音频位置,毫秒值
* @memberof AudioManager
*/
AudioManager.prototype.seekSound = function (url, time) {
this._soundImpl.seek(url, time);
};
/**
* 停止Sound音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.stopSound = function (url) {
this._soundImpl.stop(url);
};
/**
* 暂停Sound音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.pauseSound = function (url) {
this._soundImpl.pause(url);
};
/**
* 停止所有Sound音频
*
* @memberof AudioManager
*/
AudioManager.prototype.stopAllSound = function () {
this._soundImpl.stopAll();
};
/**
* 注册Music音频实现对象
*
* @param {IAudio} musicImpl Music音频实现对象
* @memberof AudioManager
*/
AudioManager.prototype.registerMusicImpl = function (musicImpl) {
if (this._musicImpl)
this._musicImpl.dispose();
this._musicImpl = musicImpl;
};
Object.defineProperty(AudioManager.prototype, "muteMusic", {
/**
* 获取或设置Music类型音频静音属性
*
* @type {boolean}
* @memberof AudioManager
*/
get: function () {
return this._musicImpl.mute;
},
set: function (value) {
if (value === this._musicImpl.mute)
return;
this._musicImpl.mute = value;
// 持久化
var shell = core.getInject(Shell);
shell.localStorageSet(AudioManager_1.STORAGE_KEY_MUTE_MUSIC, value + "");
},
enumerable: true,
configurable: true
});
/**
* 加载Music音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.loadMusic = function (url) {
var _this = this;
var promise = new Promise(function (resolve, reject) {
var tuple = _this._loadTupleDict[url];
if (tuple) {
tuple[0].then(resolve).catch(reject);
}
else {
_this._loadTupleDict[url] = [promise, resolve, reject];
}
_this._musicImpl.load(url);
});
return promise;
};
/**
* 播放Music音频,如果没有加载则会先行加载
*
* @param {AudioPlayParams} [params] 音频参数
* @memberof AudioManager
*/
AudioManager.prototype.playMusic = function (params) {
var _this = this;
var promise = new Promise(function (resolve, reject) {
// 判断静音
if (_this.muteMusic) {
resolve();
return;
}
// 停止其他音频
if (params.stopOthers) {
_this.stopAllSound();
_this.stopAllMusics();
}
var tuple = _this._playTupleDict.get(params);
if (!tuple) {
_this._playTupleDict.set(params, [promise, resolve, reject]);
_this._musicImpl.play(params);
}
});
return promise;
};
/**
* 跳转Music音频进度
*
* @param {string} url 音频URL
* @param {number} time 要跳转到的音频位置,毫秒值
* @memberof AudioManager
*/
AudioManager.prototype.seekMusic = function (url, time) {
this._musicImpl.seek(url, time);
};
/**
* 停止Music音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.stopMusic = function (url) {
this._musicImpl.stop(url);
};
/**
* 暂停Music音频
*
* @param {string} url 音频地址
* @memberof AudioManager
*/
AudioManager.prototype.pauseMusic = function (url) {
this._musicImpl.pause(url);
};
/**
* 停止所有Music音频
*
* @memberof AudioManager
*/
AudioManager.prototype.stopAllMusics = function () {
this._musicImpl.stopAll();
};
var AudioManager_1;
AudioManager.STORAGE_KEY_MUTE_SOUND = "AudioManager::muteSound";
AudioManager.STORAGE_KEY_MUTE_MUSIC = "AudioManager::muteMusic";
AudioManager = AudioManager_1 = tslib_1.__decorate([
Injectable,
tslib_1.__metadata("design:paramtypes", [])
], AudioManager);
return AudioManager;
}());
export default AudioManager;
/** 再额外导出一个单例 */
export var audioManager = core.getInject(AudioManager);