mirror of
https://github.com/owntone/owntone-server.git
synced 2025-05-24 02:46:17 -04:00
60 lines
1.3 KiB
JavaScript
60 lines
1.3 KiB
JavaScript
/**
|
|
* Audio handler object
|
|
* Inspired by https://github.com/rainner/soma-fm-player
|
|
* (released under MIT licence)
|
|
*/
|
|
export default {
|
|
audio: new Audio(),
|
|
context: null,
|
|
|
|
// Play audio source url
|
|
play(source) {
|
|
this.stop()
|
|
this.context.resume().then(() => {
|
|
this.audio.src = `${String(source || '')}?x=${Date.now()}`
|
|
this.audio.crossOrigin = 'anonymous'
|
|
this.audio.load()
|
|
})
|
|
},
|
|
|
|
// Set audio volume
|
|
setVolume(volume) {
|
|
if (this.audio) {
|
|
this.audio.volume = Math.min(1, Math.max(0, parseFloat(volume) || 0.0))
|
|
}
|
|
},
|
|
|
|
// Setup audio routing
|
|
setup() {
|
|
this.context = new (window.AudioContext || window.webkitAudioContext)()
|
|
const source = this.context.createMediaElementSource(this.audio)
|
|
source.connect(this.context.destination)
|
|
this.audio.addEventListener('canplaythrough', () => {
|
|
this.audio.play()
|
|
})
|
|
this.audio.addEventListener('canplay', () => {
|
|
this.audio.play()
|
|
})
|
|
return this.audio
|
|
},
|
|
|
|
// Stop playing audio
|
|
stop() {
|
|
try {
|
|
this.audio.pause()
|
|
} catch (error) {
|
|
// Continue regardless of error
|
|
}
|
|
try {
|
|
this.audio.stop()
|
|
} catch (error) {
|
|
// Continue regardless of error
|
|
}
|
|
try {
|
|
this.audio.close()
|
|
} catch (error) {
|
|
// Continue regardless of error
|
|
}
|
|
}
|
|
}
|