import { setLengthDisplay, setMeta } from "../markup"; import { parseTime } from "../utils/helpers"; import { getMeta } from "./data"; export const pauseAll = nodes => nodes.forEach(node => { pause(node); }); export const playPauseAudio = (node, nodes) => { if (node.paused || node.currentTime === 0) { pauseAll(nodes); play(node); } else { pause(node); } }; export const play = node => { node.play(); const button = node.elements.playPauseButton; const buttonText = node.elements.playPauseButtonText; button.classList.remove("paused"); buttonText.innerHTML = "Pause"; button.classList.add("playing"); }; export const pause = node => { node.pause(); const button = node.elements.playPauseButton; const buttonText = node.elements.playPauseButtonText; button.classList.remove("playing"); buttonText.innerHTML = "Play"; button.classList.add("paused"); }; export const stop = node => { node.pause(); const button = node.elements.playPauseButton; const buttonText = node.elements.playPauseButtonText; button.classList.remove("playing"); buttonText.innerHTML = "Play"; }; export const triggerUpdateProgress = event => updateProgress(event.srcElement); export const updateProgress = node => { const progress = node.currentTime; const duration = node.duration; if (node.elements.playTimer) { const progressParsed = parseTime(progress); node.elements.playTimer.innerHTML = progressParsed; } if (progress >= duration) { stop(node); } const progressPercent = ((progress / duration) * 100).toFixed(2); if (node.elements.progressRange) { node.elements.progressRange.value = progressPercent; node.elements.progressIndicator.style.width = progressPercent + "%"; node.elements.progressPlayhead.style.left = progressPercent + "%"; } }; export const canplaythrough = node => { setLengthDisplay(node); // setBuffered(node, node.duration); loadedmetadata(node); }; export const loadedmetadata = node => { node.elements.wrapper.classList.remove("loading"); const meta = getMeta(node); setMeta(meta, node.elements); }; export const errors = node => { node.elements.wrapper.classList.add("error"); node.elements.wrapper.classList.remove("loading"); node.elements.wrapper.innerHTML = `
Error loading audio file
`; }; export const sliderScrub = (event, node) => { const duration = node.duration; const targetTime = duration * (event.srcElement.value / 100); const targetTimeFixed = targetTime.toFixed(2); node.currentTime = targetTimeFixed; updateProgress(node); }; export const sliderFocus = (node, focus) => node.elements.progressWrapper.classList.toggle("focus", focus); export const volume = (event, node) => { const volume = event.srcElement.value; node.tmpVolume = node.volume; node.mute = false; mute(node); setVolume(node, volume); }; export const volumeFocus = (node, focus) => node.elements.volumeWrapper.classList.toggle("focus", focus); export const setVolume = (node, value) => { const valueMapped = value * 10; const volumePercent = (value * 100).toFixed(2); node.volume = value; if (node.elements.volumeDisplay) { node.elements.volumeDisplay.innerHTML = valueMapped; } if (node.elements.volumeControl) { node.elements.volumeControl.value = value; } if (node.elements.volumeIndicator) { node.elements.volumeIndicator.style.width = volumePercent + "%"; } if (node.elements.volumePlayhead) { node.elements.volumePlayhead.style.left = volumePercent + "%"; } }; export const muteUnmuteAudio = node => { node.mute = !node.mute; mute(node); }; export const mute = node => { const button = node.elements.muteButton; if (node.mute) { node.tmpVolume = node.volume; setVolume(node, 0); button.classList.add("muted"); button.classList.remove("unmuted"); button.innerHTML = "Unmute"; } else { if (typeof node.tmpVolume != "undefined" && node.tmpVolume > 0) { setVolume(node, node.tmpVolume); } else { setVolume(node, 1); } button.classList.remove("muted"); button.classList.add("unmuted"); button.innerHTML = "Mute"; } }; export const setBuffered = (node, buffered) => { const duration = node.duration; const bufferedPercent = ((buffered / duration) * 100).toFixed(2); if (node.elements.progressBackground) { node.elements.progressBackground.style.width = bufferedPercent + "%"; } }; export const handleBuffering = node => { if (node.buffered.length > 0) { // Get the furthest buffered point const bufferedEnd = node.buffered.end(node.buffered.length - 1); const duration = node.duration; // Update the buffer visualization setBuffered(node, bufferedEnd); // If fully buffered, we can optionally do some cleanup if (bufferedEnd >= duration) { // Remove the event listener if no longer needed node.removeEventListener("progress", () => handleBuffering(node)); } } };