diff --git a/audio.js b/audio.js index caa12fe..4daba61 100644 --- a/audio.js +++ b/audio.js @@ -1,22 +1,73 @@ +let playing = []; +looping = {}; + let audioDict = {}; // play some sound -function playAudio(name) { +function playSfx(name) { if (audioDict[name] == undefined) { console.log(name + " is not loaded yet, dingus"); return; } let src = audioContext.createBufferSource(); - src.buffer = audioDict[name]; + src.connect(audioContext.destination); + + playing.push(src); + + src.name = name; + src.onended = (event) => src.done = true; + + src.start(0); +} + +function playLoop(name) { + if (audioDict[name] == undefined) { + console.log(name + " is not loaded yet, dingus"); + return; + } + + // if already playing, just keep going + if (looping[name] && !looping[name].done) { + console.log(name + " is already looping"); + return; + } + let src = audioContext.createBufferSource(); + src.buffer = audioDict[name]; src.connect(audioContext.destination); + looping[name] = src; + + src.name = name; + src.onended = (event) => src.done = true; + + src.loop = true; + src.start(0); } +function stopSfx(name) { + playing.map(item => { + if (item.name == name) + item.stop(); + } ); + cleanPlaying(); +} + +function stopLoop(name) { + if (looping[name]) { + looping[name].stop(); + delete looping[name]; + } +} + +function cleanPlaying() { + playing = playing.filter(item => !item.done); +} + // asynchronously load an audio file function loadAudio(name, flush=false) {