retrolib
Version:
Render low-res scenes to the canvas in a retro 8-bit era style. Aseprite exported animation wrapper, scene management, sound and image management, particle support.
108 lines • 3.42 kB
JavaScript
import MusicDefinition from './MusicDefinition';
var sfxVolume = 0.45;
var sfxs = [];
/**
* Populate sfx manifest with JSON list of definitions. Manifest is an arry of
* objects matching format { "name": "track id ref", "filename": "./file_path/filename.ext" },
* @param json JSON representation of image definitions.
*/
function musicManifestFromJSON(json) {
json.forEach((function (def) { return sfxs.push(MusicDefinition.fromJSON(def)); }));
}
/**
* Whether or not the named track is currently playing.
* @param name Music track asset id.
* @returns
*/
function isPlaying(name) {
var sf = getTrack(name);
if (sf) {
return !sf.paused || sf.currentTime && sf.currentTime < sf.duration;
}
return false;
}
/**
* Get the named audio element.
* @param name Music track asset id.
* @returns
*/
function getTrack(name) {
var sf = sfxs.filter(function (f) { return f.name === name; });
return sf.length > 0 ? sf[0].track : null;
}
/**
* Play specified track.
* @param name Music track asset id.
* @param onEnded Optional callback for when the track ends.
* @returns
*/
function playTrack(name, onEnded) {
return new Promise(function (resolve) {
try {
var sf_1 = sfxs.filter(function (f) { return f.name === name; });
if (sf_1.length > 0) {
if (!isPlaying(name)) {
sf_1[0].track.volume = sfxVolume;
if (onEnded) {
sf_1[0].track.onended = function () {
onEnded(sf_1[0]);
sf_1[0].track.onended = function () { resolve(); };
};
}
else {
sf_1[0].track.onended = function () { resolve(); };
}
sf_1[0].track.play();
}
else {
sf_1[0].track.currentTime = 0;
}
}
}
catch (e) {
console.log('Error playing sfx', name, e);
}
});
}
/**
* Load track from location.
* @param filename Path to audio asset.
* @returns
*/
function loadTrack(filename) {
return new Promise(function (resolve, reject) {
var sf = new Audio(filename);
sf.oncanplaythrough = function () {
resolve(sf);
};
sf.onerror = function (e) {
console.error("Failed to load file ".concat(filename, ":"), e);
reject(e);
};
});
}
/**
* Load all tracks that have been loaded into the manifest.
* @returns
*/
function loadAllTracks() {
return new Promise(function (resolveAll, rejectAll) {
var promises = [];
var _loop_1 = function (i) {
var sfx = sfxs[i];
promises.push(new Promise(function (resolve) { return loadTrack(sfx.filename).then(function (r) {
sfx.track = r;
resolve(r);
}).catch(function (e) {
console.error('Failed to load', sfx.filename, e);
rejectAll('Failed to load' + sfx.filename + ':' + JSON.stringify(e));
}); }));
};
for (var i in sfxs) {
_loop_1(i);
}
return Promise.allSettled(promises);
});
}
export { loadAllTracks, loadTrack, playTrack, getTrack, isPlaying, musicManifestFromJSON };
//# sourceMappingURL=music.js.map