pages235/src/basicSounds.ts
Vitaly d546fa8f41 enable strict null types which improves quality of codebase a lot!
todo add types to worker & world renderer
2023-11-01 03:07:07 +03:00

43 lines
1.3 KiB
TypeScript

import { options } from './optionsStorage'
let audioContext: AudioContext
const sounds: Record<string, any> = {}
// load as many resources on page load as possible instead on demand as user can disable internet connection after he thinks the page is loaded
const loadingSounds = [] as string[]
const convertedSounds = [] as string[]
export async function loadSound (path: string) {
if (loadingSounds.includes(path)) return
loadingSounds.push(path)
const res = await window.fetch(path)
const data = await res.arrayBuffer()
sounds[path] = data
loadingSounds.splice(loadingSounds.indexOf(path), 1)
}
export async function playSound (path) {
audioContext ??= new window.AudioContext()
for (const [soundName, sound] of Object.entries(sounds)) {
if (convertedSounds.includes(soundName)) continue
sounds[soundName] = await audioContext.decodeAudioData(sound)
convertedSounds.push(soundName)
}
const volume = options.volume / 100
const soundBuffer = sounds[path]
if (!soundBuffer) {
console.warn(`Sound ${path} not loaded`)
return
}
const gainNode = audioContext.createGain()
const source = audioContext.createBufferSource()
source.buffer = soundBuffer
source.connect(gainNode)
gainNode.connect(audioContext.destination)
gainNode.gain.value = volume
source.start(0)
}