{"version":3,"file":"AltAudioPlaybackStore-WLOiX4mH.js","sources":["../../Vue/src/models/frontend-only/MediaPlayerStatus.ts","../../Vue/src/stores/AltAudioPlaybackStore.ts"],"sourcesContent":["export enum MediaPlayerStatus {\r\n Unloaded = 0,\r\n Paused,\r\n Loading,\r\n Playing,\r\n Ended,\r\n Error\r\n}","import { MediaPlayerStatus } from \"@/models/frontend-only/MediaPlayerStatus\";\r\n\r\nexport const useAltAudioPlayback = defineStore(\"alt-audio-playback\", () => {\r\n const maxVolume = 1;\r\n const fadeTime = 3;\r\n\r\n const audioContext = new (window.AudioContext || window.webkitAudioContext)();\r\n\r\n const debug = useDebug();\r\n const gainNode = audioContext.createGain();\r\n let audio: HTMLAudioElement | null = null; // new Audio();\r\n // audio.crossOrigin = \"anonymous\";\r\n let track: MediaElementAudioSourceNode | null = null;\r\n // track.connect(gainNode).connect(audioContext.destination);\r\n //track.connect(audioContext.destination);\r\n\r\n function initAudio(url: string) {\r\n audio = new Audio(url);\r\n\r\n (window as any).a = audio;\r\n audioContext.resume();\r\n\r\n audio.crossOrigin = \"anonymous\";\r\n track = audioContext.createMediaElementSource(audio);\r\n track.connect(gainNode).connect(audioContext.destination);\r\n\r\n audio.addEventListener(\"error\", (e) => {\r\n console.error(\"audio playback error\", e);\r\n const toasts = useToastStore();\r\n toasts.errorToast(\"Error playing audio\");\r\n error.value = e.message;\r\n status.value = MediaPlayerStatus.Error;\r\n });\r\n\r\n audio.addEventListener(\"play\", () => {\r\n status.value = MediaPlayerStatus.Playing;\r\n\r\n if (!audio || audio.duration === 0) {\r\n return;\r\n }\r\n\r\n const audioCurrentTime = audio.currentTime;\r\n\r\n /**\r\n * if near the start, then set the ramp going up\r\n */\r\n if (audioCurrentTime <= fadeTime) {\r\n const vol = (audioCurrentTime / fadeTime) * maxVolume;\r\n\r\n gainNode.gain.setValueAtTime(vol, audioContext.currentTime);\r\n gainNode.gain.linearRampToValueAtTime(\r\n maxVolume,\r\n audioContext.currentTime - audioCurrentTime + fadeTime,\r\n );\r\n } else {\r\n // set to normal volume otherwise\r\n gainNode.gain.setValueAtTime(maxVolume, audioContext.currentTime);\r\n }\r\n\r\n let secondsIntoFade = 0;\r\n if (audioCurrentTime > audio.duration - fadeTime) {\r\n secondsIntoFade = audioCurrentTime - (audio.duration - fadeTime);\r\n }\r\n\r\n let vol = maxVolume;\r\n if (secondsIntoFade > 0) {\r\n vol = (1 - secondsIntoFade / fadeTime) * maxVolume;\r\n }\r\n\r\n /**\r\n * At the end we want to fade out, so set the start value\r\n */\r\n\r\n if (audio.duration - fadeTime - audioCurrentTime > 0) {\r\n gainNode.gain.setValueAtTime(\r\n vol,\r\n audioContext.currentTime +\r\n audio.duration -\r\n fadeTime -\r\n audioCurrentTime,\r\n );\r\n } else {\r\n gainNode.gain.setValueAtTime(vol, audioContext.currentTime);\r\n }\r\n\r\n gainNode.gain.linearRampToValueAtTime(\r\n 0,\r\n audioContext.currentTime + audio.duration - audioCurrentTime,\r\n );\r\n });\r\n\r\n audio.addEventListener(\"pause\", () => {\r\n status.value = MediaPlayerStatus.Paused;\r\n gainNode.gain.cancelScheduledValues(audioContext.currentTime);\r\n });\r\n audio.addEventListener(\"ended\", () => {\r\n status.value = MediaPlayerStatus.Ended;\r\n });\r\n audio.addEventListener(\"timeupdate\", () => {\r\n currentTime.value = audio!.currentTime;\r\n maxTime.value = audio!.duration;\r\n });\r\n audio.addEventListener(\"canplaythrough\", startPlaying);\r\n audio.load();\r\n }\r\n\r\n const currentTime = ref(0);\r\n const maxTime = ref(0);\r\n const error = ref(\"\");\r\n const status = ref(MediaPlayerStatus.Unloaded);\r\n const url = ref(\"\");\r\n\r\n function startPlaying() {\r\n // track.connect(gainNode).connect(audioContext.destination);\r\n audio!.play().catch((err) => console.error(\"play error\", err));\r\n audio!.removeEventListener(\"canplaythrough\", startPlaying);\r\n }\r\n\r\n function loadUrl(_url: string) {\r\n debug.log(\"load url\", _url);\r\n status.value = MediaPlayerStatus.Loading;\r\n //if audio is playing\r\n if (audio && !audio.paused && !audio.ended) {\r\n audio.pause();\r\n }\r\n\r\n error.value = \"\";\r\n initAudio(_url);\r\n }\r\n\r\n function play() {\r\n audio?.play().catch((err) => console.error(\"play error\", err));\r\n }\r\n\r\n function pause() {\r\n audio?.pause();\r\n }\r\n\r\n function goToTime(time: number) {\r\n if (!audio) {\r\n return;\r\n }\r\n if (time >= 0 && time <= audio.duration) {\r\n audio.currentTime = time;\r\n } else {\r\n error.value = \"Time out of range\";\r\n }\r\n }\r\n\r\n return {\r\n currentTime,\r\n maxTime,\r\n error,\r\n status,\r\n url,\r\n play,\r\n pause,\r\n goToTime,\r\n loadUrl,\r\n };\r\n});\r\n"],"names":["MediaPlayerStatus","MediaPlayerStatus2","useAltAudioPlayback","defineStore","audioContext","debug","useDebug","gainNode","audio","track","initAudio","url","e","useToastStore","error","status","audioCurrentTime","vol","secondsIntoFade","currentTime","maxTime","startPlaying","ref","err","loadUrl","_url","play","pause","goToTime","time"],"mappings":"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"}