mami/src/mami.js/context.js

155 lines
5.1 KiB
JavaScript

#include txtrigs.js
#include audio/context.js
#include sound/sndmgr.js
#include sound/sndlibrary.js
#include sound/sndpacks.js
#include ui/views.js
const MamiContext = function(targetBody) {
const pub = {};
const viewsCtx = new MamiUIViews(targetBody);
pub.getViews = () => viewsCtx;
let audioCtx = null;
pub.hasAudio = function() { return audioCtx !== null; };
pub.getAudio = function() { return audioCtx; };
const initAudio = function() {
if(audioCtx !== null)
return;
audioCtx = new MamiAudioContext;
};
pub.initAudio = initAudio;
let soundMgr = null, sndPckPlay = null;
const soundLib = new MamiSoundLibrary(),
soundPck = new MamiSoundPacks();
pub.initSound = function() {
if(soundMgr !== null)
return;
initAudio();
soundMgr = new MamiSoundManager(audioCtx);
sndPckPlay = new MamiSoundPackPlayer(soundMgr, soundLib);
};
pub.getSound = function() { return soundMgr; };
pub.hasSound = function() { return soundMgr !== null; };
pub.getSoundLibrary = function() { return soundLib; };
pub.getSoundPacks = function() { return soundPck; };
pub.getSoundPackPlayer = function() { return sndPckPlay; };
pub.playUrlSound = function(soundSources, complete, volume, rate) {
if(soundMgr === null)
return;
const hasCallback = typeof complete === 'function';
try {
const soundUrl = soundMgr.findSupportedUrl(soundSources);
if(soundUrl === null)
return;
const soundName = 'MamiCtx:' + soundUrl;
if(soundMgr.isLoaded(soundName)) {
const source = soundMgr.get(soundName);
if(hasCallback)
source.whenEnded(function() {
complete();
});
if(typeof volume === 'number')
source.setVolume(volume);
if(typeof rate === 'number')
source.setRate(rate);
source.play();
} else {
soundMgr.load(soundName, soundUrl, function(success, buffer) {
if(success) {
const source = buffer.createSource();
if(hasCallback)
source.whenEnded(function() {
complete();
});
if(typeof volume === 'number')
source.setVolume(volume);
if(typeof rate === 'number')
source.setRate(rate);
source.play();
} else {
console.error(buffer);
if(hasCallback)
complete();
}
});
}
} catch(ex) {
console.error(ex);
if(hasCallback)
complete();
}
};
pub.playLibrarySound = function(soundName, complete, volume, rate) {
if(soundMgr === null)
return;
const hasCallback = typeof complete === 'function';
try {
const soundInfo = soundLib.getSound(soundName);
if(soundMgr.isLoaded(soundName)) {
const source = soundMgr.get(soundName);
if(hasCallback)
source.whenEnded(function() {
complete();
});
if(typeof volume === 'number')
source.setVolume(volume);
if(typeof rate === 'number')
source.setRate(rate);
source.play();
} else {
soundMgr.load(soundName, soundInfo.getSources(), function(success, buffer) {
if(success) {
const source = buffer.createSource();
if(hasCallback)
source.whenEnded(function() {
complete();
});
if(typeof volume === 'number')
source.setVolume(volume);
if(typeof rate === 'number')
source.setRate(rate);
source.play();
} else {
console.error(buffer);
if(hasCallback)
complete();
}
});
}
} catch(ex) {
console.error(ex);
if(hasCallback)
complete();
}
};
const txtTriggers = new MamiTextTriggers;
pub.getTextTriggers = function() { return txtTriggers; };
let eeprom = null;
pub.hasEEPROM = function() { return eeprom !== null };
pub.getEEPROM = function() { return eeprom; };
pub.createEEPROM = function(url, getToken) {
// new EEPROM api should take a callback to get auth info instead of a string
eeprom = new EEPROM(1, url, getToken());
};
return pub;
};