Use bind() instead of that = this

master
William Toohey 10 years ago
parent b4a278f630
commit e5c01801d3
  1. 42
      js/HuesCore.js
  2. 33
      js/HuesSettings.js
  3. 67
      js/HuesUI.js
  4. 165
      js/ResourceManager.js
  5. 69
      js/ResourcePack.js
  6. 69
      js/SoundManager.js

@ -108,12 +108,11 @@ function HuesCore(defaults) {
settingsupdated : []
};
var that = this;
window.onerror = function(msg, url, line, col, error) {
that.error(msg);
this.error(msg);
// Get more info in console
return false;
};
}.bind(this);
console.log("0x40 Hues - start your engines!");
this.colours = this.oldColours;
@ -129,8 +128,8 @@ function HuesCore(defaults) {
return;
}
setInterval(function() {
that.loopCheck();
}, 1000);
this.loopCheck();
}.bind(this), 1000);
this.renderer = new HuesCanvas("waifu", this.soundManager.context, this);
this.visualiser = document.createElement("canvas");
@ -148,18 +147,18 @@ function HuesCore(defaults) {
this.resourceManager.addAll(defaults.respacks, function() {
document.getElementById("preloadHelper").classList.add("loaded");
if(defaults.firstImage) {
that.setImageByName(defaults.firstImage);
this.setImageByName(defaults.firstImage);
} else {
that.setImage(0);
this.setImage(0);
}
if(defaults.autoplay) {
if(defaults.firstSong) {
that.setSongByName(defaults.firstSong);
this.setSongByName(defaults.firstSong);
} else {
that.setSong(0);
this.setSong(0);
}
}
}, function(progress) {
}.bind(this), function(progress) {
var prog = document.getElementById("preMain");
var scale = Math.floor(progress * defaults.preloadMax);
var padding = defaults.preloadMax.toString(defaults.preloadBase).length;
@ -182,8 +181,8 @@ function HuesCore(defaults) {
return true;
}
var key = e.keyCode || e.which;
return that.keyHandler(key);
};
return this.keyHandler(key);
}.bind(this);
this.animationLoop();
}
@ -258,8 +257,7 @@ HuesCore.prototype.updateVisualiser = function() {
}
HuesCore.prototype.animationLoop = function() {
var that = this;
requestAnimationFrame(function() {that.animationLoop();});
requestAnimationFrame(this.animationLoop.bind(this));
if(!this.soundManager.playing) {
this.callEventListeners("frame");
return;
@ -349,12 +347,11 @@ HuesCore.prototype.setSong = function(index) {
}
}
this.setInvert(false);
var that = this;
this.soundManager.playSong(this.currentSong, this.doBuildup, function() {
that.resetAudio();
that.fillBuildup();
that.callEventListeners("songstarted");
});
this.resetAudio();
this.fillBuildup();
this.callEventListeners("songstarted");
}.bind(this));
};
HuesCore.prototype.fillBuildup = function() {
@ -417,7 +414,6 @@ HuesCore.prototype.onLoop = function() {
HuesCore.prototype.doAutoSong = function() {
var func = null;
var that = this;
if(localStorage["autoSongShuffle"] == "on") {
func = this.randomSong;
} else {
@ -425,10 +421,10 @@ HuesCore.prototype.doAutoSong = function() {
}
if(localStorage["autoSongFadeout"] == "on") {
this.soundManager.fadeOut(function() {
func.call(that);
});
func.call(this);
}.bind(this));
} else {
func.call(that);
func.call(this);
}
}

@ -215,8 +215,9 @@ function HuesSettings(defaults) {
}
// because we still care about the main window
var that = this;
document.getElementById("closeButton").onclick = function() {that.hide();};
document.getElementById("closeButton").onclick = function() {
this.hide();
}.bind(this);
if(!this.defaults.noUI) {
this.initUI();
}
@ -265,8 +266,6 @@ HuesSettings.prototype.showInfo = function() {
HuesSettings.prototype.initUI = function() {
var doc = this.root.ownerDocument;
var that = this;
// To order things nicely
for(var cat in this.settingsCategories) {
if(this.settingsCategories.hasOwnProperty(cat)) {
@ -294,9 +293,9 @@ HuesSettings.prototype.initUI = function() {
if(localStorage[setName] == option) {
checkbox.checked = true;
}
checkbox.onclick = function() {
that.set(this.name, this.value);
};
checkbox.onclick = function(self) {
self.set(this.name, this.value);
}.bind(checkbox, this);
buttonContainer.appendChild(checkbox);
// So we can style this nicely
var label = doc.createElement("label");
@ -317,18 +316,16 @@ HuesSettings.prototype.initUI = function() {
input.value = localStorage[option.variable];
// TODO: support more than just positive ints when the need arises
if(option.inputType == "int") {
input.oninput = (function(variable) {
return function() {
this.value = this.value.replace(/\D/g,'');
if(this.value == "" || this.value < 1) {
this.value = "";
return;
}
localStorage[variable] = this.value;
that.updateConditionals();
that.core.settingsUpdated();
input.oninput = (function(self, variable) {
this.value = this.value.replace(/\D/g,'');
if(this.value == "" || this.value < 1) {
this.value = "";
return;
}
})(option.variable);
localStorage[variable] = this.value;
self.updateConditionals();
self.core.settingsUpdated();
}.bind(input, this, option.variable));
}
input.autofocus = false;
buttonContainer.appendChild(input);

@ -76,8 +76,6 @@ HuesUI.prototype.addCoreCallback = function(name, func) {
}
HuesUI.prototype.initUI = function() {
var that = this;
// Major info, image, song names
var imageName = document.createElement("div");
this.imageName = imageName;
@ -99,28 +97,28 @@ HuesUI.prototype.initUI = function() {
// Prev/next controls
var imagePrev = document.createElement("div");
imagePrev.textContent = "<";
imagePrev.onclick = function() {that.core.previousImage();};
imagePrev.onclick = function() {this.core.previousImage();}.bind(this);
this.imagePrev = imagePrev;
var imageNext = document.createElement("div");
imageNext.textContent = ">";
imageNext.onclick = function() {that.core.nextImage();};
imageNext.onclick = function() {this.core.nextImage();}.bind(this);
this.imageNext = imageNext;
var songPrev = document.createElement("div");
songPrev.textContent = "<";
this.songPrev = songPrev;
songPrev.onclick = function() {that.core.previousSong();};
songPrev.onclick = function() {this.core.previousSong();}.bind(this);
var songNext = document.createElement("div");
songNext.textContent = ">";
songNext.onclick = function() {that.core.nextSong();};
songNext.onclick = function() {this.core.nextSong();}.bind(this);
this.songNext = songNext;
var songList = document.createElement("div");
songList.textContent = "SONGS";
songList.onclick = function() {that.core.toggleSongList();};
songList.onclick = function() {this.core.toggleSongList();}.bind(this);
this.songList = songList;
var imageList = document.createElement("div");
imageList.textContent = "IMAGES";
imageList.onclick = function() {that.core.toggleImageList();};
imageList.onclick = function() {this.core.toggleImageList();}.bind(this);
this.imageList = imageList;
// Beat timer, x and y blur, millis timer
@ -140,14 +138,14 @@ HuesUI.prototype.initUI = function() {
this.settingsToggle = document.createElement("div");
this.settingsToggle.innerHTML = '<i class="fa fa-cog"></i>';
this.settingsToggle.onclick = function() {
that.core.settings.toggle();
};
this.core.settings.toggle();
}.bind(this);
this.hideToggle = document.createElement("div");
this.hideToggle.innerHTML = "&#x25BC;";
this.hideToggle.onclick = function() {
that.toggleHide();
};
this.toggleHide();
}.bind(this);
this.listContainer = document.createElement("div");
this.visualiserContainer = document.createElement("div");
@ -284,8 +282,6 @@ RetroUI.prototype.constructor = RetroUI;
RetroUI.prototype.initUI = function() {
HuesUI.prototype.initUI.call(this);
var that = this;
var container = document.createElement("div");
container.className = "hues-r-container";
this.root.appendChild(container);
@ -318,11 +314,15 @@ RetroUI.prototype.initUI = function() {
var imageMode = document.createElement("div");
this.imageModeManual = document.createElement("div");
this.imageModeManual.textContent = "NORMAL";
this.imageModeManual.onclick = function() {that.core.setIsFullAuto(false);};
this.imageModeManual.onclick = function() {
this.core.setIsFullAuto(false);
}.bind(this);
this.imageModeManual.className = "hues-r-manualmode hues-r-button";
this.imageModeAuto = document.createElement("div");
this.imageModeAuto.textContent = "FULL AUTO";
this.imageModeAuto.onclick = function() {that.core.setIsFullAuto(true);};
this.imageModeAuto.onclick = function() {
this.core.setIsFullAuto(true);
}.bind(this);
this.imageModeAuto.className = "hues-r-automode hues-r-button";
imageMode.appendChild(this.imageModeManual);
imageMode.appendChild(this.imageModeAuto);
@ -356,8 +356,8 @@ RetroUI.prototype.initUI = function() {
this.hideRestore.className = "hues-r-hiderestore";
this.hideRestore.innerHTML = "&#x25B2;";
this.hideRestore.onclick = function() {
that.toggleHide();
};
this.toggleHide();
}.bind(this);
this.root.appendChild(this.hideRestore);
this.listContainer.className = "hues-r-listcontainer";
@ -490,7 +490,7 @@ WeedUI.prototype.beat = function(beats, index) {
beatCenter.style.transform = transform;
beatCenter.textContent = beats[0].toUpperCase();
this.root.appendChild(beatCenter);
window.setTimeout(this.getRemoveBeat(beatCenter), 1500);
window.setTimeout(this.removeBeat.bind(this, beatCenter), 1500);
}
};
@ -498,11 +498,8 @@ WeedUI.prototype.round10 = function(num) {
return Math.round(num * 10) / 10;
};
WeedUI.prototype.getRemoveBeat = function(element) {
var that = this;
return function() {
that.root.removeChild(element);
};
WeedUI.prototype.removeBeat = function(element) {
this.root.removeChild(element);
};
function ModernUI() {
@ -532,8 +529,6 @@ ModernUI.prototype.constructor = ModernUI;
ModernUI.prototype.initUI = function() {
HuesUI.prototype.initUI.call(this);
var that = this;
this.imageName.className = "hues-m-imagename";
this.songName.className = "hues-m-songtitle";
@ -572,8 +567,8 @@ ModernUI.prototype.initUI = function() {
label.textContent = "VOL";
label.className = "hues-m-vol-label";
label.onclick = function() {
that.core.soundManager.toggleMute();
};
this.core.soundManager.toggleMute();
}.bind(this);
volBar.appendChild(label);
this.volLabel = label;
@ -581,8 +576,8 @@ ModernUI.prototype.initUI = function() {
this.infoToggle.innerHTML = '?';
this.infoToggle.className = "hues-m-question";
this.infoToggle.onclick = function() {
that.core.settings.showInfo();
};
this.core.settings.showInfo();
}.bind(this);
volCluster.appendChild(this.infoToggle);
var input = document.createElement("input");
@ -593,8 +588,8 @@ ModernUI.prototype.initUI = function() {
volBar.appendChild(input);
this.volInput = input;
input.oninput = function() {
that.core.soundManager.setVolume(parseFloat(input.value));
};
this.core.soundManager.setVolume(parseFloat(input.value));
}.bind(this);
var rightBox = document.createElement("div");
rightBox.className = "hues-m-rightbox";
@ -614,7 +609,7 @@ ModernUI.prototype.initUI = function() {
this.songShuffle = document.createElement("div");
this.songShuffle.innerHTML = '<i class="fa fa-random"></i>';
this.songShuffle.className = "hues-m-actbutton";
this.songShuffle.onclick = function() {that.core.randomSong();};
this.songShuffle.onclick = function() {this.core.randomSong();}.bind(this);
songs.appendChild(this.songList);
songControls.appendChild(this.songPrev);
songControls.appendChild(this.songShuffle);
@ -633,7 +628,7 @@ ModernUI.prototype.initUI = function() {
this.imageMode = document.createElement("div");
this.imageMode.innerHTML = "&#9654;"; // PLAY
this.imageMode.className = "hues-m-actbutton";
this.imageMode.onclick = function() {that.core.toggleFullAuto();};
this.imageMode.onclick = function() {this.core.toggleFullAuto();}.bind(this);
this.imagePrev.className = "hues-m-prevbutton";
this.imageNext.className = "hues-m-nextbutton";
images.appendChild(this.imageList);
@ -682,8 +677,8 @@ ModernUI.prototype.initUI = function() {
this.hideRestore = document.createElement("div");
this.hideRestore.className = "hues-m-hiderestore";
this.hideRestore.onclick = function() {
that.toggleHide();
};
this.toggleHide();
}.bind(this);
this.root.appendChild(this.hideRestore);
this.listContainer.className = "hues-m-listcontainer";

@ -80,7 +80,6 @@ function Resources(core) {
// Array of URLs to load, and a callback for when we're done
// Preserves order of URLs being loaded
Resources.prototype.addAll = function(urls, callback, progressCallback) {
var that = this;
this.toLoad += urls.length;
if(progressCallback) {
this.progressCallback = progressCallback;
@ -93,31 +92,26 @@ Resources.prototype.addAll = function(urls, callback, progressCallback) {
var r = new Respack();
this.rToLoad.push(r);
r.loadFromURL(urls[i], function() {
that.toLoad--;
if(that.toLoad <= 0) {
this.toLoad--;
if(this.toLoad <= 0) {
// could use a while() and shift(), but it'd be slower
for(var i = 0; i < that.rToLoad.length; i++) {
that.addPack(that.rToLoad[i]);
for(var i = 0; i < this.rToLoad.length; i++) {
this.addPack(this.rToLoad[i]);
}
that.rToLoad = [];
if(that.loadFinishCallback) {
that.loadFinishCallback();
that.loadFinishCallback = null;
this.rToLoad = [];
if(this.loadFinishCallback) {
this.loadFinishCallback();
this.loadFinishCallback = null;
}
that.progressCallback = null;
this.progressCallback = null;
}
}, this.createProgCallback(i));
}.bind(this), function(index, progress, pack) {
this.progressState[index] = progress;
this.updateProgress(pack);
}.bind(this, i));
}
};
Resources.prototype.createProgCallback = function(i) {
var that = this;
return function(progress, pack) {
that.progressState[i] = progress;
that.updateProgress(pack);
};
};
Resources.prototype.updateProgress = function(pack) {
var total = 0;
for(var i = 0; i < this.progressState.length; i++) {
@ -129,19 +123,20 @@ Resources.prototype.updateProgress = function(pack) {
Resources.prototype.addPack = function(pack) {
console.log("Added", pack.name, "to respacks");
var that = this;
var id = this.resourcePacks.length;
this.resourcePacks.push(pack);
this.addResourcesToArrays(pack);
this.rebuildEnabled();
this.updateTotals();
var self = this;
this.appendListItem("respacks", pack.name, "res" + id, this.packsView.respackList,
function() {
pack.enabled = this.checked;
that.rebuildEnabled();
},
this.selectPackCallback(id)
self.rebuildEnabled();
}, function(id) {
this.selectPack(id);
}.bind(this, id)
);
};
@ -193,31 +188,21 @@ Resources.prototype.rebuildEnabled = function() {
}
for(var i = 0; i < this.enabledSongs.length; i++) {
var song = this.enabledSongs[i];
this.appendSimpleListItem(song.title, songList, this.playSongCallback(i));
this.appendSimpleListItem(song.title, songList, function(index) {
this.core.setSong(index);
}.bind(this, i));
}
for(var i = 0; i < this.enabledImages.length; i++) {
var image = this.enabledImages[i];
this.appendSimpleListItem(image.name, imageList, this.selectImageCallback(i));
this.appendSimpleListItem(image.name, imageList, function(index) {
this.core.setImage(index);
this.core.setIsFullAuto(false);
}.bind(this, i));
}
}
this.updateTotals();
};
Resources.prototype.playSongCallback = function(index) {
var that = this;
return function() {
that.core.setSong(index);
};
};
Resources.prototype.selectImageCallback = function(index) {
var that = this;
return function() {
that.core.setImage(index);
that.core.setIsFullAuto(false);
};
};
Resources.prototype.removePack = function(pack) {
var index = this.resourcePacks.indexOf(pack);
if (index != -1) {
@ -249,7 +234,6 @@ Resources.prototype.loadLocal = function() {
};
Resources.prototype.parseLocalQueue = function(recursing) {
var that = this;
// avoid race conditions
if(this.currentlyParsing && !recursing) {
return;
@ -259,12 +243,12 @@ Resources.prototype.parseLocalQueue = function(recursing) {
var r = new Respack();
r.loadBlob(this.fileParseQueue.shift(),
function() {
that.addPack(r);
that.localComplete();
that.parseLocalQueue(true);
},
function(progress, respack) {that.localProgress(progress, respack);},
function() {that.parseLocalQueue(true);});
this.addPack(r);
this.localComplete();
this.parseLocalQueue(true);
}.bind(this),
function(progress, respack) {this.localProgress(progress, respack);}.bind(this),
function() {this.parseLocalQueue(true);}.bind(this));
} else {
console.log("Local respack parsing complete");
this.currentlyParsing = false;
@ -294,7 +278,6 @@ Resources.prototype.localComplete = function(progress) {
Resources.prototype.initUI = function() {
this.root = document.getElementById("huesResources");
var that = this;
var packsContainer = document.createElement("div");
packsContainer.className = "res-packscontainer";
@ -318,7 +301,7 @@ Resources.prototype.initUI = function() {
remoteList.className = "res-list";
remoteList.id = "res-remotelist";
this.appendSimpleListItem("Click to load the list", remoteList,
function() {that.loadRemotes();});
function() {this.loadRemotes();}.bind(this));
this.packsView.remoteList = remoteList;
} else {
packList.className += " noremotes";
@ -329,11 +312,11 @@ Resources.prototype.initUI = function() {
var loadRemote = document.createElement("div");
loadRemote.className = "res-button hidden";
loadRemote.textContent = "LOAD REMOTE";
loadRemote.onclick = function() {that.loadCurrentRemote();};
loadRemote.onclick = function() {this.loadCurrentRemote();}.bind(this);
var loadLocal = document.createElement("div");
loadLocal.className = "res-button";
loadLocal.textContent = "LOAD ZIPS";
loadLocal.onclick = function() {that.fileInput.click();};
loadLocal.onclick = function() {this.fileInput.click();}.bind(this);
buttons.appendChild(loadLocal);
buttons.appendChild(loadRemote);
this.packsView.loadRemote = loadRemote;
@ -342,7 +325,7 @@ Resources.prototype.initUI = function() {
this.fileInput.type ="file";
this.fileInput.accept="application/zip";
this.fileInput.multiple = true;
this.fileInput.onchange = function() {that.loadLocal();};
this.fileInput.onchange = function() {this.loadLocal();}.bind(this);
var progressContainer = document.createElement("div");
progressContainer.id = "res-progress-container";
@ -448,15 +431,15 @@ Resources.prototype.initUI = function() {
var enableAll = document.createElement("div");
enableAll.textContent = "ENABLE ALL";
enableAll.className = "res-button";
enableAll.onclick = function() {that.enableAll();};
enableAll.onclick = function() {this.enableAll();}.bind(this);
var invert = document.createElement("div");
invert.textContent = "INVERT";
invert.className = "res-button";
invert.onclick = function() {that.invert();};
invert.onclick = function() {this.invert();}.bind(this);
var disableAll = document.createElement("div");
disableAll.textContent = "DISABLE ALL";
disableAll.className = "res-button";
disableAll.onclick = function() {that.disableAll();};
disableAll.onclick = function() {this.disableAll();}.bind(this);
packButtons.appendChild(enableAll);
packButtons.appendChild(invert);
packButtons.appendChild(disableAll);
@ -590,7 +573,7 @@ Resources.prototype.selectPack = function(id) {
var song = pack.songs[i];
this.appendListItem("songs", song.title, "song" + i, songList,
this.selectResourceCallback(song),
this.clickResourceCallback(song, true),
this.clickResourceCallback.bind(this, song, true),
song.enabled);
}
@ -598,40 +581,32 @@ Resources.prototype.selectPack = function(id) {
var image = pack.images[i];
this.appendListItem("images", image.name, "image" + i, imageList,
this.selectResourceCallback(image),
this.clickResourceCallback(image, false),
this.clickResourceCallback.bind(this, image, false),
image.enabled);
}
};
Resources.prototype.selectPackCallback = function(id) {
var that = this;
return function() {that.selectPack(id);};
};
Resources.prototype.selectResourceCallback = function(res) {
var that = this;
var self = this;
return function() {
res.enabled = this.checked;
that.rebuildEnabled();
self.rebuildEnabled();
};
};
Resources.prototype.clickResourceCallback = function(res, isSong) {
var that = this;
return function() {
if(!res.enabled) {
res.enabled = true;
that.rebuildEnabled();
// rebuild display
that.selectPack(that.resourcePacks.indexOf(that.packView.pack));
}
if(isSong) {
that.core.setSong(that.enabledSongs.indexOf(res));
} else {
that.core.setImage(that.enabledImages.indexOf(res));
that.core.setIsFullAuto(false);
}
};
if(!res.enabled) {
res.enabled = true;
this.rebuildEnabled();
// rebuild display
this.selectPack(this.resourcePacks.indexOf(this.packView.pack));
}
if(isSong) {
this.core.setSong(this.enabledSongs.indexOf(res));
} else {
this.core.setImage(this.enabledImages.indexOf(res));
this.core.setIsFullAuto(false);
}
};
Resources.prototype.getEnabledTabContents = function() {
@ -707,7 +682,6 @@ Resources.prototype.appendListItem = function(name, value, id, root, oncheck, on
};
Resources.prototype.loadRemotes = function() {
var that = this;
var remoteList = this.packsView.remoteList;
while(remoteList.firstElementChild) {
remoteList.removeChild(remoteList.firstElementChild);
@ -721,13 +695,13 @@ Resources.prototype.loadRemotes = function() {
if(!req.response) {
req.onerror();
}
that.remotes = req.response;
that.populateRemotes();
};
this.remotes = req.response;
this.populateRemotes();
}.bind(this);
req.onerror = function() {
item.textContent = "Could not load list! Click to try again";
item.onclick = function() {that.loadRemotes();};
};
item.onclick = function() {this.loadRemotes();}.bind(this);
}.bind(this);
req.send();
};
@ -739,15 +713,12 @@ Resources.prototype.populateRemotes = function() {
for(var i = 0; i < this.remotes.length; i++) {
this.remotes[i].loaded = false;
this.appendSimpleListItem(this.remotes[i].name, remoteList,
this.getRemoteCallback(i));
function(index) {
this.selectRemotePack(index);
}.bind(this, i));
}
};
Resources.prototype.getRemoteCallback = function(index) {
var that = this;
return function() {that.selectRemotePack(index);};
};
Resources.prototype.selectRemotePack = function(id) {
var pack = this.remotes[id];
this.packView.pack = pack;
@ -796,7 +767,6 @@ Resources.prototype.selectRemotePack = function(id) {
Resources.prototype.loadCurrentRemote = function() {
var pack = this.packView.pack;
var that = this;
// Not actually a remote, ignore. How did you press this :<
if(pack.loaded === undefined || pack.loaded) {
@ -805,11 +775,14 @@ Resources.prototype.loadCurrentRemote = function() {
// TODO Error checking on failure
pack.loaded = true;
that.packsView.loadRemote.className = "res-button loaded";
that.packsView.loadRemote.textContent = "LOADING";
this.packsView.loadRemote.className = "res-button loaded";
this.packsView.loadRemote.textContent = "LOADING";
this.addAll([pack.url], function() {
that.remoteComplete();
}, function(progress, respack) {that.remoteProgress(progress, respack);}
this.remoteComplete();
}.bind(this),
function(progress, respack) {
this.remoteProgress(progress, respack);
}.bind(this)
);
};

@ -75,51 +75,48 @@ Respack.prototype.updateProgress = function() {
};
Respack.prototype.loadFromURL = function(url, callback, progress) {
var that = this;
this.loadedFromURL = true;
var req = new XMLHttpRequest();
req.open('GET', url, true);
req.responseType = 'blob';
req.onload = function() {
that.loadBlob(req.response, callback, progress);
};
this.loadBlob(req.response, callback, progress);
}.bind(this);
req.onerror = function() {
console.log("Could not load respack at URL", url);
};
req.onprogress = function(event) {
if (event.lengthComputable) {
that.size = event.total;
that.downloaded = event.loaded;
this.size = event.total;
this.downloaded = event.loaded;
var percent = event.loaded / event.total;
if(progress) {
progress(percent / 2, that); // because of processing too
progress(percent / 2, this); // because of processing too
}
} else {
// Unable to compute progress information since the total size is unknown
}
};
}.bind(this);
req.send();
};
Respack.prototype.loadBlob = function(blob, callback, progress, errorCallback) {
this._completionCallback = callback;
this.progressCallback = progress;
var that = this;
this.size = blob.size;
this.file = new zip.fs.FS();
this.file.importBlob(blob,
function() { // success
that.parseWholeZip();
},
this.parseWholeZip();
}.bind(this),
function(error) { // failure
console.log("Error loading respack :", error.toString());
that.file = null;
this.file = null;
if(errorCallback) {
errorCallback(error.toString());
}
}
}.bind(this)
);
};
@ -179,16 +176,14 @@ Respack.prototype.parseImage = function(file) {
};
Respack.prototype.parseXML = function() {
var that = this;
if (this._infoFile) {
this._infoFile.getText(function(text) {
text = text.replace(/&amp;/g, '&');
text = text.replace(/&/g, '&amp;');
that.parseInfoFile(text);
that._infoFile = null;
that.parseXML();
});
this.parseInfoFile(text);
this._infoFile = null;
this.parseXML();
}.bind(this));
return;
}
if (this.songs.length > 0) {
@ -197,12 +192,12 @@ Respack.prototype.parseXML = function() {
//XML parser will complain about a bare '&', but some respacks use &amp
text = text.replace(/&amp;/g, '&');
text = text.replace(/&/g, '&amp;');
that.parseSongFile(text);
this.parseSongFile(text);
// Go to next in series
that._songFile = null;
that._songFileParsed = true;
that.parseXML();
});
this._songFile = null;
this._songFileParsed = true;
this.parseXML();
}.bind(this));
return;
} else if(!this._songFileParsed) {
console.log("!!!", "Got songs but no songs.xml!");
@ -213,10 +208,10 @@ Respack.prototype.parseXML = function() {
this._imageFile.getText(function(text) {
text = text.replace(/&amp;/g, '&');
text = text.replace(/&/g, '&amp;');
that.parseImageFile(text);
that._imageFile = null;
that.parseXML();
});
this.parseImageFile(text);
this._imageFile = null;
this.parseXML();
}.bind(this));
return;
}
@ -415,7 +410,6 @@ Respack.prototype.getImage = function(name) {
};
Respack.prototype.parseSongQueue = function() {
var that = this;
var songFile = this.songQueue.shift();
var name = songFile.name.replace(this.audioExtensions, "");
@ -449,14 +443,14 @@ Respack.prototype.parseSongQueue = function() {
songFile.getBlob(mime, function(sound) {
// Because blobs are crap
var fr = new FileReader();
fr.onload = function() {
fr.onload = function(self) {
newSong.sound = this.result;
that.filesLoaded++;
that.updateProgress();
that.tryFinish();
};
self.filesLoaded++;
self.updateProgress();
self.tryFinish();
}.bind(fr, this);
fr.readAsArrayBuffer(sound);
});
}.bind(this));
this.songs.push(newSong);
}
};
@ -500,7 +494,6 @@ Respack.prototype.parseImageQueue = function() {
};
Respack.prototype.imageLoadStart = function(imgFile, imageObj) {
var that = this;
var extension = imgFile.name.split('.').pop().toLowerCase();
var mime = "";
switch(extension) {
@ -518,8 +511,8 @@ Respack.prototype.imageLoadStart = function(imgFile, imageObj) {
mime = "application/octet-stream";
}
imgFile.getData64URI(mime, function(image) {
that.imageLoadComplete(image, imageObj);
});
this.imageLoadComplete(image, imageObj);
}.bind(this));
};
Respack.prototype.imageLoadComplete = function(imageBmp, imageObj) {

@ -83,24 +83,22 @@ function SoundManager(core) {
return;
}
var that = this;
window.addEventListener('touchend', function() {
// create empty buffer
var buffer = that.context.createBuffer(1, 1, 22050);
var source = that.context.createBufferSource();
var buffer = this.context.createBuffer(1, 1, 22050);
var source = this.context.createBufferSource();
source.buffer = buffer;
// connect to output (your speakers)
source.connect( that.context.destination);
source.connect( this.context.destination);
// play the file
source.start(0);
}, false);
}.bind(this), false);
}
SoundManager.prototype.playSong = function(song, playBuild, callback) {
var that = this;
if(this.song == song) {
return;
}
@ -120,50 +118,50 @@ SoundManager.prototype.playSong = function(song, playBuild, callback) {
this.loadBuffer(song, function() {
// To prevent race condition if you press "next" twice fast
if(song == that.song) {
if(song == this.song) {
// more racing than the Melbourne Cup
try {
that.bufSource.stop(0);
this.bufSource.stop(0);
} catch(err) {}
that.bufSource = that.context.createBufferSource();
that.bufSource.buffer = that.buffer;
that.bufSource.loop = true;
that.bufSource.loopStart = that.loopStart;
that.bufSource.loopEnd = that.buffer.duration;
that.bufSource.connect(that.gainNode);
this.bufSource = this.context.createBufferSource();
this.bufSource.buffer = this.buffer;
this.bufSource.loop = true;
this.bufSource.loopStart = this.loopStart;
this.bufSource.loopEnd = this.buffer.duration;
this.bufSource.connect(this.gainNode);
// This fixes sync issues on Firefox and slow machines.
if(that.context.suspend && that.context.resume) {
that.context.suspend().then(function() {
if(this.context.suspend && this.context.resume) {
this.context.suspend().then(function() {
if(playBuild) {
// mobile webkit requires offset, even if 0
that.bufSource.start(0);
that.startTime = that.context.currentTime + that.loopStart;
this.bufSource.start(0);
this.startTime = this.context.currentTime + this.loopStart;
} else {
that.bufSource.start(0, that.loopStart);
that.startTime = that.context.currentTime;
this.bufSource.start(0, this.loopStart);
this.startTime = this.context.currentTime;
}
that.context.resume().then(function() {
that.playing = true;
this.context.resume().then(function() {
this.playing = true;
if(callback)
callback();
});
});
}.bind(this));
}.bind(this));
} else {
if(playBuild) {
// mobile webkit requires offset, even if 0
that.bufSource.start(0);
that.startTime = that.context.currentTime + that.loopStart;
this.bufSource.start(0);
this.startTime = this.context.currentTime + this.loopStart;
} else {
that.bufSource.start(0, that.loopStart);
that.startTime = that.context.currentTime;
this.bufSource.start(0, this.loopStart);
this.startTime = this.context.currentTime;
}
that.playing = true;
this.playing = true;
if(callback)
callback();
}
}
});
}.bind(this));
};
SoundManager.prototype.stop = function() {
@ -223,7 +221,6 @@ SoundManager.prototype.loadAudioFile = function(song, isBuild) {
/* decodeAudioData nukes our original MP3 array, but we want to keep it around
for memory saving purposes, so we must duplicate it locally here */
SoundManager.prototype.getAudioCallback = function(song, isBuild) {
var that = this;
var current = isBuild ? song.buildup : song.sound;
var copy = current.slice(0);
return function(buffer) {
@ -234,16 +231,16 @@ SoundManager.prototype.getAudioCallback = function(song, isBuild) {
song.sound = copy;
}
// race condition prevention
if(that.song != song) {
if(this.song != song) {
return;
}
if(isBuild) {
that.tmpBuild = that.trimMP3(buffer, song.forceTrim, song.noTrim);
this.tmpBuild = this.trimMP3(buffer, song.forceTrim, song.noTrim);
} else {
that.tmpBuffer = that.trimMP3(buffer, song.forceTrim, song.noTrim);
this.tmpBuffer = this.trimMP3(buffer, song.forceTrim, song.noTrim);
}
that.onSongLoad(song);
};
this.onSongLoad(song);
}.bind(this);
};
SoundManager.prototype.onSongLoad = function(song) {

Loading…
Cancel
Save