Add audio playback
This commit is contained in:
parent
00c947b7ed
commit
085e131b3d
5
Engine/src/custom.d.ts
vendored
5
Engine/src/custom.d.ts
vendored
|
@ -1,3 +1,8 @@
|
|||
declare module '*.ogg' {
|
||||
const content: [string, string][]
|
||||
export default content
|
||||
}
|
||||
|
||||
declare module '*.yaml' {
|
||||
const content: any
|
||||
export default content
|
||||
|
|
72
Engine/src/shared/audio.ts
Normal file
72
Engine/src/shared/audio.ts
Normal file
|
@ -0,0 +1,72 @@
|
|||
import assets from 'url:../../../Assets/Audio/**/*.ogg'
|
||||
|
||||
export const audio: Record<string, string> = assets
|
||||
|
||||
// Preload 'em
|
||||
for (let [key, value] of (Object.entries(assets) as [string,string][])) {
|
||||
let audio = new Audio()
|
||||
audio.addEventListener('canplaythrough', () => {
|
||||
console.log('preloaded audio', key)
|
||||
})
|
||||
audio.preload = ''
|
||||
audio.src = value
|
||||
}
|
||||
|
||||
let playingSongAudio: HTMLAudioElement
|
||||
export function playSong(name: string) {
|
||||
// Replace old audio and start crossfading.
|
||||
if (playingSongAudio && !playingSongAudio.paused) {
|
||||
;((playingSongAudio: HTMLAudioElement) => {
|
||||
let cl = setInterval(() => {
|
||||
if (Number(playingSongAudio.volume.toFixed(1)) > 0) {
|
||||
playingSongAudio.volume -= 0.1
|
||||
} else {
|
||||
clearInterval(cl)
|
||||
}
|
||||
}, 100)
|
||||
})(playingSongAudio)
|
||||
}
|
||||
playingSongAudio = new Audio()
|
||||
playingSongAudio.autoplay = true
|
||||
playingSongAudio.preload = ''
|
||||
playingSongAudio.loop = true
|
||||
playingSongAudio.volume = 0
|
||||
|
||||
// Start fade in.
|
||||
;((playingSongAudio: HTMLAudioElement) => {
|
||||
let cl = setInterval(() => {
|
||||
if (playingSongAudio.paused) {
|
||||
clearInterval(cl)
|
||||
return
|
||||
}
|
||||
if (Number(playingSongAudio.volume.toFixed(1)) < 1.0) {
|
||||
playingSongAudio.volume += 0.1
|
||||
} else {
|
||||
clearInterval(cl)
|
||||
}
|
||||
}, 100)
|
||||
})(playingSongAudio)
|
||||
|
||||
playingSongAudio.src = audio[name]
|
||||
let promise = playingSongAudio.play()
|
||||
if (promise !== undefined) {
|
||||
promise.then(() => {
|
||||
// ok
|
||||
}).catch((error: any) => {
|
||||
//console.error(error)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export function playSound(name: string): HTMLAudioElement {
|
||||
let s = new Audio()
|
||||
|
||||
s.src = audio[name]
|
||||
s.autoplay = true
|
||||
s.preload = ''
|
||||
;(async () => {
|
||||
await s.play()
|
||||
})()
|
||||
|
||||
return s
|
||||
}
|
Loading…
Reference in New Issue
Block a user