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