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' {
|
declare module '*.yaml' {
|
||||||
const content: any
|
const content: any
|
||||||
export default content
|
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