UNPKG

olympus-r

Version:

一个力求简单易用的前端开发框架 #### 开发语言 TypeScript #### 核心架构 MVC #### 模块间通讯和解耦 采用事件机制,利用一个全局唯一的事件派发器进行模块间通讯,解耦模块间依赖 #### 表现层结构 使用桥接模式拆分接口与实现,达到一套核心驱动多套表现层的目的(目前支持DOM、Egret、PixiJS三种表现层),同时支持表现层的未来可扩展性 #### TypeScript装饰器注入 框架提供TypeScript装饰器注入功能,便捷获取托管对象。例如:

296 lines (295 loc) 10.1 kB
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);