Files
ArtPlayer/packages/artplayer-plugin-audio-track/src/track.ts
T

78 lines
1.6 KiB
TypeScript

import type { Option, UpdateOption } from '../types/artplayer-plugin-audio-track'
export function createAudioTrack(option: Option) {
let { url, offset = 0, sync = 0.3 } = option
const audio = new Audio()
let closed = false
function play() {
if (closed || !url)
return
audio.play().catch((error: unknown) => {
if (!closed)
console.warn(error)
})
}
function pause() {
if (!closed)
audio.pause()
}
function destroy() {
if (closed)
return
closed = true
const failures: unknown[] = []
for (const release of [() => audio.pause(), () => audio.removeAttribute('src'), () => audio.load()]) {
try {
release()
}
catch (error) { failures.push(error) }
}
if (failures.length)
throw failures[0]
}
try {
audio.preload = 'auto'
if (url)
audio.src = url
}
catch (error) {
try {
destroy()
}
catch {}
throw error
}
return {
audio,
play,
pause,
destroy,
sync(time: number) {
if (closed || !url)
return
const target = time + offset
if (Math.abs(audio.currentTime - target) > sync)
audio.currentTime = target
},
update(newOption: UpdateOption, playing: boolean) {
if (closed)
return
if (newOption.url && newOption.url !== url) {
url = newOption.url
audio.src = url
if (playing)
play()
}
if (newOption.offset !== undefined)
offset = newOption.offset
if (newOption.sync !== undefined)
sync = newOption.sync
},
}
}