diff --git a/src/css/style.css b/src/css/style.css index c0e4edb..2883ec6 100644 --- a/src/css/style.css +++ b/src/css/style.css @@ -159,6 +159,11 @@ h1, h2, h3 { font-size: 12pt; } +#preSub span { + font-size: 8pt; + opacity: 0.7; +} + #tabs { margin: -1px; padding-top: 22px; diff --git a/src/js/HuesCore.js b/src/js/HuesCore.js index 2ee4542..1abc204 100644 --- a/src/js/HuesCore.js +++ b/src/js/HuesCore.js @@ -147,21 +147,36 @@ function HuesCore(defaults) { this.soundManager = new SoundManager(this); - this.resourceManager.getSizes(defaults.respacks).then( sizes => { + this.soundManager.init().then(() => { + if(!this.soundManager.locked && localStorage["skipPreloader"] == "on") { + return null; + } else { + return this.resourceManager.getSizes(defaults.respacks); + } + }).then( sizes => { + if(sizes === null) { + return; + } + let size = sizes.reduce( (prev, curr) => { return typeof curr === 'number' ? prev + curr : null; - }); + }, 0); if(typeof size === 'number') { size = size.toFixed(1); } else { size = '???'; } - this.warning(size + "MB of music/images.
" + + let warning = size + "MB of music/images.
" + "Flashing lights.
" + - "Tap or click to start"); - - return this.soundManager.init(); + "Tap or click to start"; + + if(!this.soundManager.locked) { + warning += "
Skip this screen from Options"; + } + this.warning(warning); + // Even if not locked, this steals clicks which is useful here + return this.soundManager.unlock(); }).then(() => { this.clearMessage(); setInterval(this.loopCheck.bind(this), 1000); diff --git a/src/js/HuesSettings.js b/src/js/HuesSettings.js index e98dfde..9f6bbac 100644 --- a/src/js/HuesSettings.js +++ b/src/js/HuesSettings.js @@ -67,7 +67,8 @@ HuesSettings.prototype.defaultSettings = { autoSongShuffle: "on", autoSongFadeout: "on", trippyMode: "off", - volume: 0.7 + volume: 0.7, + skipPreloader: "off" }; // Don't get saved to localStorage @@ -109,7 +110,8 @@ HuesSettings.prototype.settingsCategories = { ], "Interface" : [ "currentUI", - "blackoutUI" + "blackoutUI", + "skipPreloader" ] }; @@ -198,6 +200,10 @@ HuesSettings.prototype.settingsOptions = { shuffleImages : { name : "Shuffle images", options : ["off", "on"] + }, + skipPreloader : { + name : "Skip preloader warning", + options : ["off", "on"] } }; diff --git a/src/js/SoundManager.js b/src/js/SoundManager.js index 3884cde..e5efd50 100644 --- a/src/js/SoundManager.js +++ b/src/js/SoundManager.js @@ -29,6 +29,8 @@ function SoundManager(core) { this.song = null; this.initPromise = null; + this.lockedPromise = null; + this.locked = true; /* Lower level audio and timing info */ this.context = null; // Audio context, Web Audio API @@ -112,34 +114,42 @@ SoundManager.prototype.init = function() { audioWorker.postMessage({ping:true, ogg:this.oggSupport}); }); }).then(() => { - return new Promise((resolve, reject) => { - // iOS and other some mobile browsers - unlock the context as - // it starts in a suspended state - let unlocker = () => { - // create empty buffer - let buffer = this.context.createBuffer(1, 1, 22050); - let source = this.context.createBufferSource(); - source.buffer = buffer; - - // connect to output (your speakers) - source.connect( this.context.destination); - - // play the file - source.start(0); - - window.removeEventListener('touchend', unlocker); - window.removeEventListener('click', unlocker); - this.core.clearMessage(); - resolve(); - }; - window.addEventListener('touchend', unlocker, false); - window.addEventListener('click', unlocker, false); - }); + this.locked = this.context.state != "running"; }); } return this.initPromise; }; +SoundManager.prototype.unlock = function() { + if(this.lockedPromise) { + return this.lockedPromise; + } + this.lockedPromise = new Promise((resolve, reject) => { + // iOS and other some mobile browsers - unlock the context as + // it starts in a suspended state + let unlocker = () => { + // create empty buffer + let buffer = this.context.createBuffer(1, 1, 22050); + let source = this.context.createBufferSource(); + source.buffer = buffer; + + // connect to output (your speakers) + source.connect( this.context.destination); + + // play the file + source.start(0); + + window.removeEventListener('touchend', unlocker); + window.removeEventListener('click', unlocker); + this.core.clearMessage(); + resolve(); + }; + window.addEventListener('touchend', unlocker, false); + window.addEventListener('click', unlocker, false); + }); + return this.lockedPromise; +} + SoundManager.prototype.playSong = function(song, playBuild, forcePlay) { let p = Promise.resolve(); // Editor forces play on audio updates