diff options
Diffstat (limited to 'www/js')
-rw-r--r-- | www/js/api.js | 95 |
1 files changed, 49 insertions, 46 deletions
diff --git a/www/js/api.js b/www/js/api.js index ed357de..e029413 100644 --- a/www/js/api.js +++ b/www/js/api.js @@ -33,6 +33,38 @@ window.html5ks.api = new (function () { return when.resolve(); }, + _loadMedia: function (el, src, types) { + var deferred = when.defer(); + var i = 0; + var _nextType = function () { + for (; i < types.length; i++) { + var type = types[i]; + if (el.canPlayType(type[0])) { + el.src = src + "." + type[1]; + el.load(); + el.play(); + return true; + } + } + return false; + }; + + _nextType(); + + el.onerror = function (e) { + if (e.code === e.MEDIA_ERR_SRC_NOT_SUPPORTED) { + if (!_nextType()) { + console.log("no audio formats supported"); + deferred.resolve(); + } + } else { + console.error("unknown audio error"); + deferred.resolve(); + } + }; + return deferred.promise; + }, + play: function (channel, name, ignore, fade) { this.stop(channel); var deferred = when.defer(), @@ -55,19 +87,6 @@ window.html5ks.api = new (function () { volume = html5ks.persistent.sfxVolume; } - var types = ["opus", "ogg", "m4a", "wav"]; - - var setNextType = function (i) { - for (; i < types.length; i++) { - if (Modernizr.audio[types[i]]) { - audio.src = src + "." + types[i]; - return i; - } - } - }; - - var i = setNextType(0); - audio.addEventListener("playing", function playing() { audio.removeEventListener("playing", playing, false); if (fade) { @@ -75,21 +94,16 @@ window.html5ks.api = new (function () { } deferred.resolve(); }, false); - audio.onerror = function (e) { - if (e.code === e.MEDIA_ERR_SRC_NOT_SUPPORTED) { - i = setNextType(i); - if (!i) { - console.log("no audio formats supported"); - deferred.resolve(); - } - } else { - console.error("unknown audio error"); - deferred.resolve(); - } - }; - audio.load(); + audio.volume = fade ? 0 : volume; - audio.play(); + this._loadMedia(audio, src, [ + ['audio/ogg; codecs="opus"', "opus"], + ['audio/ogg; codecs="vorbis"', "ogg"], + ['audio/x-m4a', "m4a"], + ['audio/aac', "aac"], + ['audio/wav; codecs="1"', "wav"]]).then(function () { deferred.resolve(); }); + // TODO: fix this garbage -------------------------------^ + return deferred.promise; }, @@ -115,7 +129,7 @@ window.html5ks.api = new (function () { movie_cutscene: function (vid_src, skippable) { var deferred = when.defer(), video = html5ks.elements.video, - src = "dump/video/" + vid_src + "."; + src = "dump/video/" + vid_src; this.stop("all"); clearInterval(html5ks._nextTimeout); @@ -124,23 +138,15 @@ window.html5ks.api = new (function () { return deferred.resolve(); } - var types = { - "vp9": "vp9.webm", - "webm": "webm", - "ogg": "ogv", - "h264": "mp4" - }; - for (var type in types) { - if (Modernizr.video[type]) { - video.src = src + types[type]; - break; - } - } - - video.load(); + this._loadMedia(video, src, [ + ['video/webm; codecs="vp9,opus"', "vp9.webm"], + ['video/webm; codecs="vp8,vorbis"', "webm"], + ['video/ogg; codecs="theora,vorbis"', "ogv"], + // TODO: check that this is the right codec + ['video/mp4; codecs="avc1.42E01E,mp4a.40.2"']]).then(function () { deferred.resolve(); }); + // TODO: fix this garbage video.style.display = "block"; video.volume = html5ks.persistent.musicVolume; - video.play(); var done = function () { video.style.display = "none"; video.pause(); @@ -159,9 +165,6 @@ window.html5ks.api = new (function () { } }; video.onended = done; - video.onerror = function () { - deferred.reject(this.error); - }; return deferred.promise; }, |