diff --git a/src/js/HuesCore.js b/src/js/HuesCore.js
index 076a762..6db4ff4 100644
--- a/src/js/HuesCore.js
+++ b/src/js/HuesCore.js
@@ -146,7 +146,24 @@ function HuesCore(defaults) {
this.vCtx = this.visualiser.getContext("2d");
this.soundManager = new SoundManager(this);
- this.soundManager.init().then(response => {
+
+ this.resourceManager.getSizes(defaults.respacks).then( sizes => {
+ let size = sizes.reduce( (prev, curr) => {
+ return typeof curr === 'number' ? prev + curr : null;
+ });
+ if(typeof size === 'number') {
+ size = size.toFixed(1);
+ } else {
+ size = '???';
+ }
+
+ this.warning(size + "MB of music/images.
" +
+ "Epilepsy warning.
" +
+ "Tap or click to start");
+
+ return this.soundManager.init();
+ }).then(() => {
+ this.clearMessage();
setInterval(this.loopCheck.bind(this), 1000);
this.renderer = new HuesCanvas("waifu", this.soundManager.context, this);
this.settings.connectCore(this);
@@ -168,7 +185,7 @@ function HuesCore(defaults) {
document.getElementById("preloadHelper").style.display = "none";
return;
}
- }).then(response => {
+ }).then(() => {
document.getElementById("preloadHelper").classList.add("loaded");
if(defaults.firstImage) {
this.setImageByName(defaults.firstImage);
@@ -931,7 +948,7 @@ HuesCore.prototype.error = function(message) {
HuesCore.prototype.warning = function(message) {
console.log(message);
- document.getElementById("preSub").textContent = message;
+ document.getElementById("preSub").innerHTML = message;
document.getElementById("preMain").style.color = "#F93";
};
diff --git a/src/js/HuesEditor.js b/src/js/HuesEditor.js
index 4fcde42..45c6803 100644
--- a/src/js/HuesEditor.js
+++ b/src/js/HuesEditor.js
@@ -1282,7 +1282,7 @@ HuesEditor.prototype.drawOneWave = function(wave, center, width) {
HuesEditor.prototype.confirmLeave = function() {
return "Unsaved beatmap - leave anyway?";
-}
+};
HuesEditor.prototype.alert = function(msg) {
this.statusMsg.classList.remove("fade");
diff --git a/src/js/ResourceManager.js b/src/js/ResourceManager.js
index b43187a..9aaad53 100644
--- a/src/js/ResourceManager.js
+++ b/src/js/ResourceManager.js
@@ -76,6 +76,39 @@ function Resources(core) {
}
}
+/* Uses HTTP HEAD requests to get the size of all the linked URLs
+ Returns an Promise.all which will resolve to an array of sizes */
+Resources.prototype.getSizes = function(urls) {
+ let promises = [];
+
+ urls.forEach(url => {
+ let p = new Promise((resolve, reject) => {
+ let xhr = new XMLHttpRequest();
+ xhr.open("HEAD", url, true);
+ xhr.onreadystatechange = function() {
+ if (this.readyState == this.DONE) {
+ let bytes = parseInt(xhr.getResponseHeader("Content-Length"));
+ resolve(bytes / 1024 / 1024);
+ }
+ };
+ xhr.onerror = function() {
+ reject(Error(req.status + ": Could not fetch respack at " + url));
+ };
+ xhr.send();
+ }).catch(error => {
+ // Infinitely more user friendly than the error Same Origin gives
+ if(error.code == 1012) {
+ throw Error("Respack at URL " + url + " is restricted. Check CORS.");
+ } else {
+ throw error;
+ }
+ });
+ promises.push(p);
+ });
+
+ return Promise.all(promises);
+};
+
// Array of URLs to load, and a callback for when we're done
// Preserves order of URLs being loaded
Resources.prototype.addAll = function(urls, progressCallback) {
diff --git a/src/js/SoundManager.js b/src/js/SoundManager.js
index 95c66fa..3884cde 100644
--- a/src/js/SoundManager.js
+++ b/src/js/SoundManager.js
@@ -115,30 +115,25 @@ SoundManager.prototype.init = function() {
return new Promise((resolve, reject) => {
// iOS and other some mobile browsers - unlock the context as
// it starts in a suspended state
- if(this.context.state != "running") {
- this.core.warning("We're about to load about 10MB of stuff. Tap to begin!");
- 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);
- } else {
+ 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);
});
});
}