webamp/experiments/audioAbstraction/app.js
2017-10-19 16:40:20 -07:00

79 lines
2.2 KiB
JavaScript

/* global ElementSource BufferSource */
const play = document.getElementById("play");
const pause = document.getElementById("pause");
const stop = document.getElementById("stop");
const eject = document.getElementById("eject");
const url = document.getElementById("url");
const loadUrl = document.getElementById("loadUrl");
const info = document.getElementById("info");
const position = document.getElementById("position");
const sourceType = document.getElementById("sourceType");
const autoplay = document.getElementById("autoplay");
const context = new (window.AudioContext || window.webkitAudioContext)();
const getSourceClass = () =>
sourceType.value === "buffer" ? BufferSource : ElementSource;
let source = new (getSourceClass())(context, context.destination);
source.setAutoPlay(true);
sourceType.addEventListener("change", () => {
source.disconnect();
source = new (getSourceClass())(context, context.destination);
source.setAutoPlay(true);
});
//const source = new BufferSource(context, context.destination);
play.addEventListener("click", () => {
source.play();
});
pause.addEventListener("click", () => {
source.pause();
});
stop.addEventListener("click", () => {
source.stop();
});
eject.addEventListener("change", e => {
source.loadFile(e.target.files[0]);
});
loadUrl.addEventListener("click", () => {
source.loadUrl(url.value);
});
position.addEventListener("change", () => {
const percent = position.value / 100;
const newTime = source.getDuration() * percent;
source.seekToTime(newTime);
});
autoplay.addEventListener("change", () => {
source.setAutoPlay(autoplay.checked);
});
const updateInfo = () => {
const data = {
numberOfChannels: source.getNumberOfChannels(),
status: source.getStatus(),
duration: source.getDuration(),
timeElapsed: source.getTimeElapsed(),
sampleRate: source.getSampleRate(),
loop: source.getLoop(),
autoplay: source.getAutoPlay()
};
info.value = JSON.stringify(data, null, 2);
};
info.addEventListener("click", updateInfo);
source.on("statusChange", () => {
updateInfo();
});
source.on("positionChange", () => {
const percent = source.getTimeElapsed() / source.getDuration();
position.value = percent * 100;
updateInfo();
});