mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-15 09:06:16 -08:00
78 lines
1.6 KiB
TypeScript
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
|
|
},
|
|
}
|
|
}
|